xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll (revision fbcf8a8cbb2461730bfd0603b396842925a88ef2)
114da287eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
314da287eSFlorian Hahn
414da287eSFlorian Hahndeclare void @use(i1)
514da287eSFlorian Hahn
614da287eSFlorian Hahndefine void @loop_phi_pos_start_value(i32 %y, i1 %c, i32 %n) {
714da287eSFlorian Hahn; CHECK-LABEL: @loop_phi_pos_start_value(
814da287eSFlorian Hahn; CHECK-NEXT:  entry:
914da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
1014da287eSFlorian Hahn; CHECK:       loop.header:
1114da287eSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 10, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
1214da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i32 [[X]], [[N:%.*]]
1314da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
1414da287eSFlorian Hahn; CHECK:       loop.latch:
150a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
160a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1714da287eSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp sge i32 [[X]], 10
1814da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
1914da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sle i32 [[X]], 9
2014da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
2114da287eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sgt i32 [[X]], 9
2214da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
23*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
2414da287eSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i32 [[X]], 9
2514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
2614da287eSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add nsw i32 [[X]], 1
2714da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
2814da287eSFlorian Hahn; CHECK:       exit:
2914da287eSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 10
3014da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
3114da287eSFlorian Hahn; CHECK-NEXT:    ret void
3214da287eSFlorian Hahn;
3314da287eSFlorian Hahnentry:
3414da287eSFlorian Hahn  br i1 %c, label %loop.header, label %exit
3514da287eSFlorian Hahn
3614da287eSFlorian Hahnloop.header:
3714da287eSFlorian Hahn  %x = phi i32 [ 10, %entry ], [ %x.next, %loop.latch ]
3814da287eSFlorian Hahn  %c.1 = icmp slt i32 %x, %n
3914da287eSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
4014da287eSFlorian Hahn
4114da287eSFlorian Hahnloop.latch:
4214da287eSFlorian Hahn  %f.1 = icmp sle i32 %x, %n
4314da287eSFlorian Hahn  call void @use(i1 %f.1)
4414da287eSFlorian Hahn  %t.1 = icmp sgt i32 %x, %n
4514da287eSFlorian Hahn  call void @use(i1 %t.1)
4614da287eSFlorian Hahn  %t.2 = icmp sge i32 %x, 10
4714da287eSFlorian Hahn  call void @use(i1 %t.2)
4814da287eSFlorian Hahn
4914da287eSFlorian Hahn  %c.2 = icmp sle i32 %x, 9
5014da287eSFlorian Hahn  call void @use(i1 %c.2)
5114da287eSFlorian Hahn  %c.3 = icmp sgt i32 %x, 9
5214da287eSFlorian Hahn  call void @use(i1 %c.3)
5314da287eSFlorian Hahn  %c.4 = icmp sge i32 %x, 0
5414da287eSFlorian Hahn  call void @use(i1 %c.4)
5514da287eSFlorian Hahn  %c.5 = icmp sge i32 %x, 9
5614da287eSFlorian Hahn  call void @use(i1 %c.5)
5714da287eSFlorian Hahn
5814da287eSFlorian Hahn  %x.next = add nsw i32 %x, 1
5914da287eSFlorian Hahn  br label %loop.header
6014da287eSFlorian Hahn
6114da287eSFlorian Hahnexit:
6214da287eSFlorian Hahn  %c.6 = icmp sgt i32 %y, 10
6314da287eSFlorian Hahn  call void @use(i1 %c.6)
6414da287eSFlorian Hahn  ret void
6514da287eSFlorian Hahn}
6614da287eSFlorian Hahn
6714da287eSFlorian Hahndefine void @loop_phi_neg_start_value(i32 %y, i1 %c, i32 %n) {
6814da287eSFlorian Hahn; CHECK-LABEL: @loop_phi_neg_start_value(
6914da287eSFlorian Hahn; CHECK-NEXT:  entry:
7014da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
7114da287eSFlorian Hahn; CHECK:       loop.header:
7214da287eSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ -10, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
7314da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i32 [[X]], [[N:%.*]]
7414da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
7514da287eSFlorian Hahn; CHECK:       loop.latch:
760a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
770a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
7814da287eSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp sge i32 [[X]], -10
7914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
8014da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sle i32 [[X]], 9
8114da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
8214da287eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sgt i32 [[X]], 9
8314da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
8414da287eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i32 [[X]], 0
8514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
8614da287eSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i32 [[X]], 9
8714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
8814da287eSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add nsw i32 [[X]], 1
8914da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
9014da287eSFlorian Hahn; CHECK:       exit:
9114da287eSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 10
9214da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
9314da287eSFlorian Hahn; CHECK-NEXT:    ret void
9414da287eSFlorian Hahn;
9514da287eSFlorian Hahnentry:
9614da287eSFlorian Hahn  br i1 %c, label %loop.header, label %exit
9714da287eSFlorian Hahn
9814da287eSFlorian Hahnloop.header:
9914da287eSFlorian Hahn  %x = phi i32 [ -10, %entry ], [ %x.next, %loop.latch ]
10014da287eSFlorian Hahn  %c.1 = icmp slt i32 %x, %n
10114da287eSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
10214da287eSFlorian Hahn
10314da287eSFlorian Hahnloop.latch:
10414da287eSFlorian Hahn  %f.1 = icmp sle i32 %x, %n
10514da287eSFlorian Hahn  call void @use(i1 %f.1)
10614da287eSFlorian Hahn  %t.1 = icmp sgt i32 %x, %n
10714da287eSFlorian Hahn  call void @use(i1 %t.1)
10814da287eSFlorian Hahn  %t.2 = icmp sge i32 %x, -10
10914da287eSFlorian Hahn  call void @use(i1 %t.2)
11014da287eSFlorian Hahn
11114da287eSFlorian Hahn  %c.2 = icmp sle i32 %x, 9
11214da287eSFlorian Hahn  call void @use(i1 %c.2)
11314da287eSFlorian Hahn  %c.3 = icmp sgt i32 %x, 9
11414da287eSFlorian Hahn  call void @use(i1 %c.3)
11514da287eSFlorian Hahn  %c.4 = icmp sge i32 %x, 0
11614da287eSFlorian Hahn  call void @use(i1 %c.4)
11714da287eSFlorian Hahn  %c.5 = icmp sge i32 %x, 9
11814da287eSFlorian Hahn  call void @use(i1 %c.5)
11914da287eSFlorian Hahn
12014da287eSFlorian Hahn  %x.next = add nsw i32 %x, 1
12114da287eSFlorian Hahn  br label %loop.header
12214da287eSFlorian Hahn
12314da287eSFlorian Hahnexit:
12414da287eSFlorian Hahn  %c.6 = icmp sgt i32 %y, 10
12514da287eSFlorian Hahn  call void @use(i1 %c.6)
12614da287eSFlorian Hahn  ret void
12714da287eSFlorian Hahn}
12814da287eSFlorian Hahn
12914da287eSFlorian Hahndefine void @loop_count_down(i32 %y, i1 %c, i32 %n) {
13014da287eSFlorian Hahn; CHECK-LABEL: @loop_count_down(
13114da287eSFlorian Hahn; CHECK-NEXT:  entry:
13214da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
13314da287eSFlorian Hahn; CHECK:       loop.header:
13414da287eSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
13514da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i32 [[X]], 0
13614da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
13714da287eSFlorian Hahn; CHECK:       loop.latch:
13814da287eSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp sle i32 [[X]], [[N]]
13914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
14014da287eSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp sgt i32 [[X]], [[N]]
14114da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
1420a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
1430a781d98SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
14414da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sle i32 [[X]], 9
14514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
14614da287eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sgt i32 [[X]], 9
14714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
14814da287eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i32 [[X]], 1
14914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
15014da287eSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i32 [[X]], 2
15114da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
15214da287eSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add nsw i32 [[X]], 1
15314da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
15414da287eSFlorian Hahn; CHECK:       exit:
15514da287eSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 10
15614da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_6]])
15714da287eSFlorian Hahn; CHECK-NEXT:    ret void
15814da287eSFlorian Hahn;
15914da287eSFlorian Hahnentry:
16014da287eSFlorian Hahn  br i1 %c, label %loop.header, label %exit
16114da287eSFlorian Hahn
16214da287eSFlorian Hahnloop.header:
16314da287eSFlorian Hahn  %x = phi i32 [ %n, %entry ], [ %x.next, %loop.latch ]
16414da287eSFlorian Hahn  %c.1 = icmp sge i32 %x, 0
16514da287eSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
16614da287eSFlorian Hahn
16714da287eSFlorian Hahnloop.latch:
16814da287eSFlorian Hahn  %f.1 = icmp sle i32 %x, %n
16914da287eSFlorian Hahn  call void @use(i1 %f.1)
17014da287eSFlorian Hahn  %t.1 = icmp sgt i32 %x, %n
17114da287eSFlorian Hahn  call void @use(i1 %t.1)
17214da287eSFlorian Hahn  %t.2 = icmp sge i32 %x, 0
17314da287eSFlorian Hahn  call void @use(i1 %t.2)
17414da287eSFlorian Hahn  %t.3 = icmp sge i32 %x, -1
17514da287eSFlorian Hahn  call void @use(i1 %t.3)
17614da287eSFlorian Hahn
17714da287eSFlorian Hahn  %c.2 = icmp sle i32 %x, 9
17814da287eSFlorian Hahn  call void @use(i1 %c.2)
17914da287eSFlorian Hahn  %c.3 = icmp sgt i32 %x, 9
18014da287eSFlorian Hahn  call void @use(i1 %c.3)
18114da287eSFlorian Hahn  %c.4 = icmp sge i32 %x, 1
18214da287eSFlorian Hahn  call void @use(i1 %c.4)
18314da287eSFlorian Hahn  %c.5 = icmp sge i32 %x, 2
18414da287eSFlorian Hahn  call void @use(i1 %c.5)
18514da287eSFlorian Hahn
18614da287eSFlorian Hahn  %x.next = add nsw i32 %x, 1
18714da287eSFlorian Hahn  br label %loop.header
18814da287eSFlorian Hahn
18914da287eSFlorian Hahnexit:
19014da287eSFlorian Hahn  %c.6 = icmp sgt i32 %y, 10
19114da287eSFlorian Hahn  call void @use(i1 %c.6)
19214da287eSFlorian Hahn  ret void
19314da287eSFlorian Hahn}
19414da287eSFlorian Hahn
19514da287eSFlorian Hahndefine void @loop_latch_may_not_executed(i32 %y, i1 %c, i32 %n) {
19614da287eSFlorian Hahn; CHECK-LABEL: @loop_latch_may_not_executed(
19714da287eSFlorian Hahn; CHECK-NEXT:  entry:
19814da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
19914da287eSFlorian Hahn; CHECK:       loop.header:
20014da287eSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
20114da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[X]], [[N:%.*]]
20214da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
20314da287eSFlorian Hahn; CHECK:       loop.latch:
20414da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
20514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
20614da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 9
20714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
20814da287eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 9
20914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
21014da287eSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
21114da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
21214da287eSFlorian Hahn; CHECK:       exit:
21314da287eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
21414da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
21514da287eSFlorian Hahn; CHECK-NEXT:    ret void
21614da287eSFlorian Hahn;
21714da287eSFlorian Hahnentry:
21814da287eSFlorian Hahn  br i1 %c, label %loop.header, label %exit
21914da287eSFlorian Hahn
22014da287eSFlorian Hahnloop.header:
22114da287eSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
22214da287eSFlorian Hahn  %c.1 = icmp ugt i32 %x, %n
22314da287eSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
22414da287eSFlorian Hahn
22514da287eSFlorian Hahnloop.latch:
22614da287eSFlorian Hahn  %f.1 = icmp ule i32 %x, %n
22714da287eSFlorian Hahn  call void @use(i1 %f.1)
22814da287eSFlorian Hahn  %t.1 = icmp ugt i32 %x, %n
22914da287eSFlorian Hahn  call void @use(i1 %t.1)
23014da287eSFlorian Hahn
23114da287eSFlorian Hahn  %c.2 = icmp ule i32 %x, 9
23214da287eSFlorian Hahn  call void @use(i1 %c.2)
23314da287eSFlorian Hahn  %c.3 = icmp ugt i32 %x, 9
23414da287eSFlorian Hahn  call void @use(i1 %c.3)
23514da287eSFlorian Hahn
23614da287eSFlorian Hahn  %x.next = add i32 %x, 1
23714da287eSFlorian Hahn  br label %loop.header
23814da287eSFlorian Hahn
23914da287eSFlorian Hahnexit:
24014da287eSFlorian Hahn  %c.4 = icmp ugt i32 %y, 10
24114da287eSFlorian Hahn  call void @use(i1 %c.4)
24214da287eSFlorian Hahn  ret void
24314da287eSFlorian Hahn}
24414da287eSFlorian Hahn
24514da287eSFlorian Hahndefine void @loop_latch_not_executed_constant_bound(i32 %y, i1 %c) {
24614da287eSFlorian Hahn; CHECK-LABEL: @loop_latch_not_executed_constant_bound(
24714da287eSFlorian Hahn; CHECK-NEXT:  entry:
24814da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
24914da287eSFlorian Hahn; CHECK:       loop.header:
25014da287eSFlorian Hahn; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
25114da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[X]], 10
25214da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
25314da287eSFlorian Hahn; CHECK:       loop.latch:
25414da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
25514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
25614da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
25714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
25814da287eSFlorian Hahn; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
25914da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
26014da287eSFlorian Hahn; CHECK:       exit:
26114da287eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
26214da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
26314da287eSFlorian Hahn; CHECK-NEXT:    ret void
26414da287eSFlorian Hahn;
26514da287eSFlorian Hahnentry:
26614da287eSFlorian Hahn  br i1 %c, label %loop.header, label %exit
26714da287eSFlorian Hahn
26814da287eSFlorian Hahnloop.header:
26914da287eSFlorian Hahn  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
27014da287eSFlorian Hahn  %c.1 = icmp ugt i32 %x, 10
27114da287eSFlorian Hahn  br i1 %c.1, label %loop.latch, label %exit
27214da287eSFlorian Hahn
27314da287eSFlorian Hahnloop.latch:
27414da287eSFlorian Hahn  %t.1 = icmp ule i32 %x, 10
27514da287eSFlorian Hahn  call void @use(i1 %t.1)
27614da287eSFlorian Hahn  %f.1 = icmp ugt i32 %x, 10
27714da287eSFlorian Hahn  call void @use(i1 %f.1)
27814da287eSFlorian Hahn
27914da287eSFlorian Hahn  %c.2 = icmp ule i32 %x, 9
28014da287eSFlorian Hahn  call void @use(i1 %c.2)
28114da287eSFlorian Hahn  %c.3 = icmp ugt i32 %x, 9
28214da287eSFlorian Hahn  call void @use(i1 %c.3)
28314da287eSFlorian Hahn
28414da287eSFlorian Hahn  %x.next = add i32 %x, 1
28514da287eSFlorian Hahn  br label %loop.header
28614da287eSFlorian Hahn
28714da287eSFlorian Hahnexit:
28814da287eSFlorian Hahn  %c.4 = icmp ugt i32 %y, 10
28914da287eSFlorian Hahn  call void @use(i1 %c.4)
29014da287eSFlorian Hahn  ret void
29114da287eSFlorian Hahn}
29214da287eSFlorian Hahn
29314da287eSFlorian Hahn
29414da287eSFlorian Hahndefine void @loop_iv_cond_variable_bound(i32 %n) {
29514da287eSFlorian Hahn; CHECK-LABEL: @loop_iv_cond_variable_bound(
29614da287eSFlorian Hahn; CHECK-NEXT:  entry:
29714da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
29814da287eSFlorian Hahn; CHECK:       loop.header:
29914da287eSFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
30014da287eSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[IV]], [[N:%.*]]
30114da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
30214da287eSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp sge i32 [[IV]], 0
30314da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
30414da287eSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp sge i32 [[IV]], -1
30514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
30614da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i32 [[IV]], [[N]]
30714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
30814da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[IV]], 1
30914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
31014da287eSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[IV]], [[N]]
31114da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
31214da287eSFlorian Hahn; CHECK:       loop.latch:
31314da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
31414da287eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i32 [[IV]], 2
31514da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
31614da287eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[IV]], 1
31714da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
31814da287eSFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
31914da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
32014da287eSFlorian Hahn; CHECK:       exit:
32114da287eSFlorian Hahn; CHECK-NEXT:    ret void
32214da287eSFlorian Hahn;
32314da287eSFlorian Hahnentry:
32414da287eSFlorian Hahn  br label %loop.header
32514da287eSFlorian Hahn
32614da287eSFlorian Hahnloop.header:
32714da287eSFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
32814da287eSFlorian Hahn  %t.1 = icmp ule i32 %iv, %n
32914da287eSFlorian Hahn  call void @use(i1 %t.1)
33014da287eSFlorian Hahn  %t.2 = icmp sge i32 %iv, 0
33114da287eSFlorian Hahn  call void @use(i1 %t.2)
33214da287eSFlorian Hahn  %t.3 = icmp sge i32 %iv, -1
33314da287eSFlorian Hahn  call void @use(i1 %t.3)
33414da287eSFlorian Hahn
33514da287eSFlorian Hahn  %c.1 = icmp ult i32 %iv, %n
33614da287eSFlorian Hahn  call void @use(i1 %c.1)
33714da287eSFlorian Hahn  %c.2 = icmp ugt i32 %iv, 1
33814da287eSFlorian Hahn  call void @use(i1 %c.2)
33914da287eSFlorian Hahn
34014da287eSFlorian Hahn  %cmp = icmp ult i32 %iv, %n
34114da287eSFlorian Hahn  br i1 %cmp, label %loop.latch, label %exit
34214da287eSFlorian Hahn
34314da287eSFlorian Hahnloop.latch:
34414da287eSFlorian Hahn  %t.4 = icmp ule  i32 %iv, %n
34514da287eSFlorian Hahn  call void @use(i1 %t.4)
34614da287eSFlorian Hahn
34714da287eSFlorian Hahn  %c.3 = icmp ult i32 %iv, 2
34814da287eSFlorian Hahn  call void @use(i1 %c.3)
34914da287eSFlorian Hahn  %c.4 = icmp ugt i32 %iv, 1
35014da287eSFlorian Hahn  call void @use(i1 %c.4)
35114da287eSFlorian Hahn
35214da287eSFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
35314da287eSFlorian Hahn  br label %loop.header
35414da287eSFlorian Hahn
35514da287eSFlorian Hahnexit:
35614da287eSFlorian Hahn  ret void
35714da287eSFlorian Hahn}
35814da287eSFlorian Hahn
35914da287eSFlorian Hahndefine void @loop_iv_cond_constant_bound() {
36014da287eSFlorian Hahn; CHECK-LABEL: @loop_iv_cond_constant_bound(
36114da287eSFlorian Hahn; CHECK-NEXT:  entry:
36214da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
36314da287eSFlorian Hahn; CHECK:       loop.header:
36414da287eSFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
36514da287eSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[IV]], 2
36614da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
36714da287eSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp sge i32 [[IV]], 0
36814da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
36914da287eSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp sge i32 [[IV]], -1
37014da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
37114da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i32 [[IV]], 2
37214da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
37314da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[IV]], 1
37414da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
37514da287eSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[IV]], 2
37614da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
37714da287eSFlorian Hahn; CHECK:       loop.latch:
37814da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
37914da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
38014da287eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
38114da287eSFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
38214da287eSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
38314da287eSFlorian Hahn; CHECK:       exit:
38414da287eSFlorian Hahn; CHECK-NEXT:    ret void
38514da287eSFlorian Hahn;
38614da287eSFlorian Hahnentry:
38714da287eSFlorian Hahn  br label %loop.header
38814da287eSFlorian Hahn
38914da287eSFlorian Hahnloop.header:
39014da287eSFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
39114da287eSFlorian Hahn  %t.1 = icmp ule i32 %iv, 2
39214da287eSFlorian Hahn  call void @use(i1 %t.1)
39314da287eSFlorian Hahn  %t.2 = icmp sge i32 %iv, 0
39414da287eSFlorian Hahn  call void @use(i1 %t.2)
39514da287eSFlorian Hahn  %t.3 = icmp sge i32 %iv, -1
39614da287eSFlorian Hahn  call void @use(i1 %t.3)
39714da287eSFlorian Hahn
39814da287eSFlorian Hahn  %c.1 = icmp ult i32 %iv, 2
39914da287eSFlorian Hahn  call void @use(i1 %c.1)
40014da287eSFlorian Hahn  %c.2 = icmp ugt i32 %iv, 1
40114da287eSFlorian Hahn  call void @use(i1 %c.2)
40214da287eSFlorian Hahn
40314da287eSFlorian Hahn  %cmp = icmp ult i32 %iv, 2
40414da287eSFlorian Hahn  br i1 %cmp, label %loop.latch, label %exit
40514da287eSFlorian Hahn
40614da287eSFlorian Hahnloop.latch:
40714da287eSFlorian Hahn  %t.4 = icmp ule  i32 %iv, 2
40814da287eSFlorian Hahn  call void @use(i1 %t.4)
40914da287eSFlorian Hahn
41014da287eSFlorian Hahn  %c.3 = icmp ult i32 %iv, 2
41114da287eSFlorian Hahn  call void @use(i1 %c.3)
41214da287eSFlorian Hahn  %c.4 = icmp ugt i32 %iv, 1
41314da287eSFlorian Hahn  call void @use(i1 %c.4)
41414da287eSFlorian Hahn
41514da287eSFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
41614da287eSFlorian Hahn  br label %loop.header
41714da287eSFlorian Hahn
41814da287eSFlorian Hahnexit:
41914da287eSFlorian Hahn  ret void
42014da287eSFlorian Hahn}
421