xref: /aosp_15_r20/external/llvm/test/Transforms/JumpThreading/implied-cond.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -jump-threading -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare void @side_effect(i32)
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine void @test0(i32 %i, i32 %len) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test0(
7*9880d681SAndroid Build Coastguard Worker entry:
8*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
9*9880d681SAndroid Build Coastguard Worker  %i.inc = add nuw i32 %i, 1
10*9880d681SAndroid Build Coastguard Worker  %c0 = icmp ult i32 %i.inc, %len
11*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %left, label %right
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker left:
14*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
15*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c0, label %left0, label %right
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK: left0:
18*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect
19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 %c1
20*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect
21*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
22*9880d681SAndroid Build Coastguard Worker  %c1 = icmp ult i32 %i, %len
23*9880d681SAndroid Build Coastguard Worker  br i1 %c1, label %left0, label %right
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker left0:
26*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker right:
30*9880d681SAndroid Build Coastguard Worker  %t = phi i32 [ 1, %left ], [ 2, %entry ]
31*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 %t)
32*9880d681SAndroid Build Coastguard Worker  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %i, i32 %len) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
37*9880d681SAndroid Build Coastguard Worker entry:
38*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
39*9880d681SAndroid Build Coastguard Worker  %i.inc = add nsw i32 %i, 1
40*9880d681SAndroid Build Coastguard Worker  %c0 = icmp slt i32 %i.inc, %len
41*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %left, label %right
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker left:
44*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
45*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c0, label %left0, label %right
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; CHECK: left0:
48*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect
49*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 %c1
50*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect
51*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
52*9880d681SAndroid Build Coastguard Worker  %c1 = icmp slt i32 %i, %len
53*9880d681SAndroid Build Coastguard Worker  br i1 %c1, label %left0, label %right
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker left0:
56*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
57*9880d681SAndroid Build Coastguard Worker  ret void
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker right:
60*9880d681SAndroid Build Coastguard Worker  %t = phi i32 [ 1, %left ], [ 2, %entry ]
61*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 %t)
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %i, i32 %len, i1* %c.ptr) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
69*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c0, label %cont, label %right
70*9880d681SAndroid Build Coastguard Worker; CHECK: cont:
71*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c, label %left0, label %right
72*9880d681SAndroid Build Coastguard Worker; CHECK: left0:
73*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect(i32 0)
74*9880d681SAndroid Build Coastguard Worker; CHECK: call void @side_effect(i32 0)
75*9880d681SAndroid Build Coastguard Worker entry:
76*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
77*9880d681SAndroid Build Coastguard Worker  %i.inc = add nsw i32 %i, 1
78*9880d681SAndroid Build Coastguard Worker  %c0 = icmp slt i32 %i.inc, %len
79*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %cont, label %right
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker cont:
82*9880d681SAndroid Build Coastguard Worker  %c = load i1, i1* %c.ptr
83*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %left, label %right
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker left:
86*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
87*9880d681SAndroid Build Coastguard Worker  %c1 = icmp slt i32 %i, %len
88*9880d681SAndroid Build Coastguard Worker  br i1 %c1, label %left0, label %right
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker left0:
91*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker right:
95*9880d681SAndroid Build Coastguard Worker  %t = phi i32 [ 1, %left ], [ 2, %entry ], [ 3, %cont ]
96*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 %t)
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; A s<= B implies A s> B is false.
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
102*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
103*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp, label %if.end, label %if.end3
104*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 %cmp1, label %if.then2, label %if.end
105*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @side_effect(i32 0)
106*9880d681SAndroid Build Coastguard Worker; CHECK: br label %if.end3
107*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %a, i32 %b) {
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %a, %b
112*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end3
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerif.then:
115*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i32 %a, %b
116*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %if.then2, label %if.end
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerif.then2:
119*9880d681SAndroid Build Coastguard Worker  call void @side_effect(i32 0)
120*9880d681SAndroid Build Coastguard Worker  br label %if.end
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerif.end:
123*9880d681SAndroid Build Coastguard Worker  br label %if.end3
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerif.end3:
126*9880d681SAndroid Build Coastguard Worker  ret void
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerdeclare void @is(i1)
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; If A >=s B is false then A <=s B is implied true.
132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sge_sle
133*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 true)
134*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 false)
135*9880d681SAndroid Build Coastguard Workerdefine void @test_sge_sle(i32 %a, i32 %b) {
136*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sge i32 %a, %b
137*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %untaken, label %taken
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workertaken:
140*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sle i32 %a, %b
141*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %istrue, label %isfalse
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workeristrue:
144*9880d681SAndroid Build Coastguard Worker  call void @is(i1 true)
145*9880d681SAndroid Build Coastguard Worker  ret void
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerisfalse:
148*9880d681SAndroid Build Coastguard Worker  call void @is(i1 false)
149*9880d681SAndroid Build Coastguard Worker  ret void
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workeruntaken:
152*9880d681SAndroid Build Coastguard Worker  ret void
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker; If A <=s B is false then A <=s B is implied false.
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sle_sle
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 true)
158*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 false)
159*9880d681SAndroid Build Coastguard Workerdefine void @test_sle_sle(i32 %a, i32 %b) {
160*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sle i32 %a, %b
161*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %untaken, label %taken
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workertaken:
164*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sle i32 %a, %b
165*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %istrue, label %isfalse
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workeristrue:
168*9880d681SAndroid Build Coastguard Worker  call void @is(i1 true)
169*9880d681SAndroid Build Coastguard Worker  ret void
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerisfalse:
172*9880d681SAndroid Build Coastguard Worker  call void @is(i1 false)
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workeruntaken:
176*9880d681SAndroid Build Coastguard Worker  ret void
177*9880d681SAndroid Build Coastguard Worker}
178