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