10ddfb802SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 20ddfb802SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 30ddfb802SFlorian Hahn 40ddfb802SFlorian Hahndeclare void @use(i1) 581e3779aSFlorian Hahndeclare void @llvm.assume(i1) 60ddfb802SFlorian Hahn 70ddfb802SFlorian Hahndefine void @phi_loop_1(i8 %x) { 80ddfb802SFlorian Hahn; CHECK-LABEL: @phi_loop_1( 90ddfb802SFlorian Hahn; CHECK-NEXT: entry: 100ddfb802SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp uge i8 [[X:%.*]], 10 110ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[C_0]], label [[LOOP:%.*]], label [[EXIT:%.*]] 120ddfb802SFlorian Hahn; CHECK: loop: 130ddfb802SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 140ddfb802SFlorian Hahn; CHECK-NEXT: [[C_PHI:%.*]] = phi i1 [ false, [[ENTRY]] ], [ true, [[LOOP]] ] 150ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 160ddfb802SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1 170ddfb802SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp ult i8 [[IV_NEXT]], 3 180ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[LOOP]], label [[LOOP_EXIT:%.*]] 190ddfb802SFlorian Hahn; CHECK: loop.exit: 200ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_PHI]]) 210ddfb802SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 220ddfb802SFlorian Hahn; CHECK: exit: 230ddfb802SFlorian Hahn; CHECK-NEXT: ret void 240ddfb802SFlorian Hahn; 250ddfb802SFlorian Hahnentry: 260ddfb802SFlorian Hahn %c.0 = icmp uge i8 %x, 10 270ddfb802SFlorian Hahn br i1 %c.0, label %loop, label %exit 280ddfb802SFlorian Hahn 290ddfb802SFlorian Hahnloop: 300ddfb802SFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 310ddfb802SFlorian Hahn %c.phi = phi i1 [ false, %entry ], [ %t.1, %loop ] 320ddfb802SFlorian Hahn %t.1 = icmp uge i8 %x, 8 330ddfb802SFlorian Hahn call void @use(i1 %t.1) 340ddfb802SFlorian Hahn %iv.next = add i8 %iv, 1 350ddfb802SFlorian Hahn %ec = icmp ult i8 %iv.next, 3 360ddfb802SFlorian Hahn br i1 %ec, label %loop, label %loop.exit 370ddfb802SFlorian Hahn 380ddfb802SFlorian Hahnloop.exit: 390ddfb802SFlorian Hahn call void @use(i1 %c.phi) 400ddfb802SFlorian Hahn br label %exit 410ddfb802SFlorian Hahn 420ddfb802SFlorian Hahnexit: 430ddfb802SFlorian Hahn ret void 440ddfb802SFlorian Hahn} 450ddfb802SFlorian Hahn 460ddfb802SFlorian Hahndefine void @phi_loop_2(i8 %x) { 470ddfb802SFlorian Hahn; CHECK-LABEL: @phi_loop_2( 480ddfb802SFlorian Hahn; CHECK-NEXT: entry: 490ddfb802SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp uge i8 [[X:%.*]], 10 500ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[C_0]], label [[LOOP_1_HEADER:%.*]], label [[EXIT:%.*]] 510ddfb802SFlorian Hahn; CHECK: loop.1.header: 520ddfb802SFlorian Hahn; CHECK-NEXT: [[C_PHI:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ true, [[LOOP_1_LATCH:%.*]] ] 530ddfb802SFlorian Hahn; CHECK-NEXT: br label [[LOOP_2:%.*]] 540ddfb802SFlorian Hahn; CHECK: loop.2: 550ddfb802SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[LOOP_1_HEADER]] ], [ [[IV_NEXT:%.*]], [[LOOP_2]] ] 560ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 570ddfb802SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1 580ddfb802SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp ult i8 [[IV_NEXT]], 3 590ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[LOOP_2]], label [[LOOP_1_LATCH]] 600ddfb802SFlorian Hahn; CHECK: loop.1.latch: 610ddfb802SFlorian Hahn; CHECK-NEXT: br i1 false, label [[LOOP_1_HEADER]], label [[LOOP_1_EXIT:%.*]] 620ddfb802SFlorian Hahn; CHECK: loop.1.exit: 630ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_PHI]]) 640ddfb802SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 650ddfb802SFlorian Hahn; CHECK: exit: 660ddfb802SFlorian Hahn; CHECK-NEXT: ret void 670ddfb802SFlorian Hahn; 680ddfb802SFlorian Hahnentry: 690ddfb802SFlorian Hahn %c.0 = icmp uge i8 %x, 10 700ddfb802SFlorian Hahn br i1 %c.0, label %loop.1.header, label %exit 710ddfb802SFlorian Hahn 720ddfb802SFlorian Hahnloop.1.header: 730ddfb802SFlorian Hahn %c.phi = phi i1 [ false, %entry ], [ %t.1, %loop.1.latch ] 740ddfb802SFlorian Hahn br label %loop.2 750ddfb802SFlorian Hahn 760ddfb802SFlorian Hahnloop.2: 770ddfb802SFlorian Hahn %iv = phi i8 [ 0, %loop.1.header ], [ %iv.next, %loop.2 ] 780ddfb802SFlorian Hahn %t.1 = icmp uge i8 %x, 8 790ddfb802SFlorian Hahn call void @use(i1 %t.1) 800ddfb802SFlorian Hahn %iv.next = add i8 %iv, 1 810ddfb802SFlorian Hahn %ec = icmp ult i8 %iv.next, 3 820ddfb802SFlorian Hahn br i1 %ec, label %loop.2, label %loop.1.latch 830ddfb802SFlorian Hahn 840ddfb802SFlorian Hahnloop.1.latch: 850ddfb802SFlorian Hahn br i1 false, label %loop.1.header, label %loop.1.exit 860ddfb802SFlorian Hahn 870ddfb802SFlorian Hahnloop.1.exit: 880ddfb802SFlorian Hahn call void @use(i1 %c.phi) 890ddfb802SFlorian Hahn br label %exit 900ddfb802SFlorian Hahn 910ddfb802SFlorian Hahnexit: 920ddfb802SFlorian Hahn ret void 930ddfb802SFlorian Hahn} 940ddfb802SFlorian Hahn 950ddfb802SFlorian Hahndefine void @phi_loop_3(i8 %x, i1 %c) { 960ddfb802SFlorian Hahn; CHECK-LABEL: @phi_loop_3( 970ddfb802SFlorian Hahn; CHECK-NEXT: entry: 980ddfb802SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp uge i8 [[X:%.*]], 10 990ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[C_0]], label [[LOOP:%.*]], label [[EXIT:%.*]] 1000ddfb802SFlorian Hahn; CHECK: loop: 1010ddfb802SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 1020ddfb802SFlorian Hahn; CHECK-NEXT: [[C_PHI:%.*]] = phi i1 [ false, [[ENTRY]] ], [ true, [[LOOP_LATCH]] ] 1030ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_LATCH]], label [[LOOP_EXIT:%.*]] 1040ddfb802SFlorian Hahn; CHECK: loop.latch: 1050ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1060ddfb802SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1 1070ddfb802SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp ult i8 [[IV_NEXT]], 3 1080ddfb802SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[LOOP]], label [[LOOP_EXIT]] 1090ddfb802SFlorian Hahn; CHECK: loop.exit: 1100ddfb802SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_PHI]]) 1110ddfb802SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 1120ddfb802SFlorian Hahn; CHECK: exit: 1130ddfb802SFlorian Hahn; CHECK-NEXT: ret void 1140ddfb802SFlorian Hahn; 1150ddfb802SFlorian Hahnentry: 1160ddfb802SFlorian Hahn %c.0 = icmp uge i8 %x, 10 1170ddfb802SFlorian Hahn br i1 %c.0, label %loop, label %exit 1180ddfb802SFlorian Hahn 1190ddfb802SFlorian Hahnloop: 1200ddfb802SFlorian Hahn %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ] 1210ddfb802SFlorian Hahn %c.phi = phi i1 [ false, %entry ], [ %t.1, %loop.latch ] 1220ddfb802SFlorian Hahn br i1 %c, label %loop.latch, label %loop.exit 1230ddfb802SFlorian Hahn 1240ddfb802SFlorian Hahnloop.latch: 1250ddfb802SFlorian Hahn %t.1 = icmp uge i8 %x, 8 1260ddfb802SFlorian Hahn call void @use(i1 %t.1) 1270ddfb802SFlorian Hahn %iv.next = add i8 %iv, 1 1280ddfb802SFlorian Hahn %ec = icmp ult i8 %iv.next, 3 1290ddfb802SFlorian Hahn br i1 %ec, label %loop, label %loop.exit 1300ddfb802SFlorian Hahn 1310ddfb802SFlorian Hahnloop.exit: 1320ddfb802SFlorian Hahn call void @use(i1 %c.phi) 1330ddfb802SFlorian Hahn br label %exit 1340ddfb802SFlorian Hahn 1350ddfb802SFlorian Hahnexit: 1360ddfb802SFlorian Hahn ret void 1370ddfb802SFlorian Hahn} 13881e3779aSFlorian Hahn 13981e3779aSFlorian Hahndefine i1 @test_if_then_1(i8 %x) { 14081e3779aSFlorian Hahn; CHECK-LABEL: @test_if_then_1( 14181e3779aSFlorian Hahn; CHECK-NEXT: entry: 14281e3779aSFlorian Hahn; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 [[X:%.*]], 1 14381e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[JOIN:%.*]] 14481e3779aSFlorian Hahn; CHECK: if: 14581e3779aSFlorian Hahn; CHECK-NEXT: br label [[JOIN]] 14681e3779aSFlorian Hahn; CHECK: join: 14781e3779aSFlorian Hahn; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ true, [[IF]] ], [ false, [[ENTRY:%.*]] ] 14881e3779aSFlorian Hahn; CHECK-NEXT: ret i1 [[PHI]] 14981e3779aSFlorian Hahn; 15081e3779aSFlorian Hahnentry: 15181e3779aSFlorian Hahn %cmp1 = icmp sgt i8 %x, 1 15281e3779aSFlorian Hahn br i1 %cmp1, label %if, label %join 15381e3779aSFlorian Hahn 15481e3779aSFlorian Hahnif: 15581e3779aSFlorian Hahn %cmp2 = icmp sgt i8 %x, 0 15681e3779aSFlorian Hahn br label %join 15781e3779aSFlorian Hahn 15881e3779aSFlorian Hahnjoin: 15981e3779aSFlorian Hahn %phi = phi i1 [ %cmp2, %if ], [ false, %entry ] 16081e3779aSFlorian Hahn ret i1 %phi 16181e3779aSFlorian Hahn} 16281e3779aSFlorian Hahn 16381e3779aSFlorian Hahn 16481e3779aSFlorian Hahndefine i1 @test_if_then_2(i1 %c, i8 %x) { 16581e3779aSFlorian Hahn; CHECK-LABEL: @test_if_then_2( 16681e3779aSFlorian Hahn; CHECK-NEXT: entry: 16781e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 16881e3779aSFlorian Hahn; CHECK: if: 169*13ffde31SFlorian Hahn; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 [[X:%.*]], 1 17081e3779aSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]]) 17181e3779aSFlorian Hahn; CHECK-NEXT: br label [[JOIN]] 17281e3779aSFlorian Hahn; CHECK: join: 1736c25c58aSFlorian Hahn; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ true, [[IF]] ], [ false, [[ENTRY:%.*]] ] 17481e3779aSFlorian Hahn; CHECK-NEXT: ret i1 [[PHI]] 17581e3779aSFlorian Hahn; 17681e3779aSFlorian Hahnentry: 17781e3779aSFlorian Hahn %cmp2 = icmp sgt i8 %x, 0 17881e3779aSFlorian Hahn br i1 %c, label %if, label %join 17981e3779aSFlorian Hahn 18081e3779aSFlorian Hahnif: 18181e3779aSFlorian Hahn %cmp1 = icmp sgt i8 %x, 1 18281e3779aSFlorian Hahn call void @llvm.assume(i1 %cmp1) 18381e3779aSFlorian Hahn br label %join 18481e3779aSFlorian Hahn 18581e3779aSFlorian Hahnjoin: 18681e3779aSFlorian Hahn %phi = phi i1 [ %cmp2, %if ], [ false, %entry ] 18781e3779aSFlorian Hahn ret i1 %phi 18881e3779aSFlorian Hahn} 18981e3779aSFlorian Hahn 19081e3779aSFlorian Hahndefine i1 @test_if_then_3(i1 %c.0, i8 %x) { 19181e3779aSFlorian Hahn; CHECK-LABEL: @test_if_then_3( 19281e3779aSFlorian Hahn; CHECK-NEXT: entry: 19381e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[C_0:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 19481e3779aSFlorian Hahn; CHECK: if: 19581e3779aSFlorian Hahn; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 [[X:%.*]], 1 19681e3779aSFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[X]], 1 19781e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[CMP1]], label [[THEN_1:%.*]], label [[JOIN]] 19881e3779aSFlorian Hahn; CHECK: then.1: 19981e3779aSFlorian Hahn; CHECK-NEXT: br label [[JOIN]] 20081e3779aSFlorian Hahn; CHECK: join: 2016c25c58aSFlorian Hahn; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[CMP2]], [[IF]] ], [ true, [[THEN_1]] ], [ false, [[ENTRY:%.*]] ] 20281e3779aSFlorian Hahn; CHECK-NEXT: ret i1 [[PHI]] 20381e3779aSFlorian Hahn; 20481e3779aSFlorian Hahnentry: 20581e3779aSFlorian Hahn br i1 %c.0, label %if, label %join 20681e3779aSFlorian Hahn 20781e3779aSFlorian Hahnif: 20881e3779aSFlorian Hahn %cmp1 = icmp sgt i8 %x, 1 20981e3779aSFlorian Hahn %cmp2 = icmp sgt i8 %x, 1 21081e3779aSFlorian Hahn br i1 %cmp1, label %then.1, label %join 21181e3779aSFlorian Hahn 21281e3779aSFlorian Hahnthen.1: 21381e3779aSFlorian Hahn br label %join 21481e3779aSFlorian Hahn 21581e3779aSFlorian Hahnjoin: 21681e3779aSFlorian Hahn %phi = phi i1 [ %cmp2, %if ], [ %cmp2, %then.1 ], [ false, %entry ] 21781e3779aSFlorian Hahn ret i1 %phi 21881e3779aSFlorian Hahn} 21981e3779aSFlorian Hahn 22081e3779aSFlorian Hahndefine i1 @test_if_then_4(i1 %c.0, i8 %x) { 22181e3779aSFlorian Hahn; CHECK-LABEL: @test_if_then_4( 22281e3779aSFlorian Hahn; CHECK-NEXT: entry: 22381e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[C_0:%.*]], label [[IF:%.*]], label [[JOIN:%.*]] 22481e3779aSFlorian Hahn; CHECK: if: 22581e3779aSFlorian Hahn; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 [[X:%.*]], 1 22681e3779aSFlorian Hahn; CHECK-NEXT: br i1 [[CMP1]], label [[THEN_1:%.*]], label [[ELSE_1:%.*]] 22781e3779aSFlorian Hahn; CHECK: then.1: 22881e3779aSFlorian Hahn; CHECK-NEXT: br label [[JOIN]] 22981e3779aSFlorian Hahn; CHECK: else.1: 23081e3779aSFlorian Hahn; CHECK-NEXT: br label [[JOIN]] 23181e3779aSFlorian Hahn; CHECK: join: 2326c25c58aSFlorian Hahn; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ false, [[ELSE_1]] ], [ true, [[THEN_1]] ], [ false, [[ENTRY:%.*]] ] 23381e3779aSFlorian Hahn; CHECK-NEXT: ret i1 [[PHI]] 23481e3779aSFlorian Hahn; 23581e3779aSFlorian Hahnentry: 23681e3779aSFlorian Hahn br i1 %c.0, label %if, label %join 23781e3779aSFlorian Hahn 23881e3779aSFlorian Hahnif: 23981e3779aSFlorian Hahn %cmp1 = icmp sgt i8 %x, 1 24081e3779aSFlorian Hahn %cmp2 = icmp sgt i8 %x, 1 24181e3779aSFlorian Hahn br i1 %cmp1, label %then.1, label %else.1 24281e3779aSFlorian Hahn 24381e3779aSFlorian Hahnthen.1: 24481e3779aSFlorian Hahn br label %join 24581e3779aSFlorian Hahn 24681e3779aSFlorian Hahnelse.1: 24781e3779aSFlorian Hahn br label %join 24881e3779aSFlorian Hahn 24981e3779aSFlorian Hahnjoin: 25081e3779aSFlorian Hahn %phi = phi i1 [ %cmp2, %else.1 ], [ %cmp2, %then.1 ], [ false, %entry ] 25181e3779aSFlorian Hahn ret i1 %phi 25281e3779aSFlorian Hahn} 253