xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/phi-select.ll (revision 85eb8b7244b6c35653e481049b8f6595ff1e5f40)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=indvars -S  %s | FileCheck %s
3
4define void @test_phi_select() {
5; CHECK-LABEL: @test_phi_select(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    br label [[OUTER_HEADER:%.*]]
8; CHECK:       outer.header:
9; CHECK-NEXT:    br i1 false, label [[THEN:%.*]], label [[MERGE:%.*]]
10; CHECK:       then:
11; CHECK-NEXT:    br label [[MERGE]]
12; CHECK:       merge:
13; CHECK-NEXT:    br label [[INNER:%.*]]
14; CHECK:       inner:
15; CHECK-NEXT:    [[INNER_IV_NEXT:%.*]] = add nsw i64 0, 0
16; CHECK-NEXT:    br i1 false, label [[INNER]], label [[OUTER_LATCH:%.*]]
17; CHECK:       outer.latch:
18; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[OUTER_HEADER]]
19; CHECK:       exit:
20; CHECK-NEXT:    ret void
21;
22entry:
23  br label %outer.header
24
25outer.header:
26  %iv = phi i64 [ 0, %entry ], [ %iv.next, %outer.latch ]
27  %iv.next.1 = add nsw i64 %iv, 1
28  %cmp.0 = icmp sgt i64 %iv, 50
29  br i1 %cmp.0, label %then, label %merge
30
31then:
32  br label %merge
33
34merge:
35  %iv.sel = phi i64 [ %iv, %outer.header ], [ %iv.next.1, %then ]
36  br label %inner
37
38inner:                                            ; preds = %inner, %outer.header.new
39  %inner.iv = phi i64 [ %iv.sel, %merge ], [ 0, %inner ]
40  %inner.iv.next = add nsw i64 0, 0
41  %ec.1 = icmp sgt i64 0, 0
42  br i1 %ec.1, label %inner, label %outer.latch
43
44outer.latch:
45  %iv.next = add nuw nsw i64 %iv, 1
46  %ec.2 = icmp ult i64 %iv.next, 1000
47  br i1 %ec.2, label %exit, label %outer.header
48
49exit:
50  ret void
51}
52