xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/cond-used-in-phi.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
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