xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/icmp-logical.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notallzeroes(i32 %A) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notallzeroes
5*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7
6*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], 0
7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39
8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
11*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp ne i32 %mask1, 0
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
14*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp ne i32 %mask2, 0
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker  %res = and i1 %tst1, %tst2
17*9880d681SAndroid Build Coastguard Worker  ret i1 %res
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allzeroes(i32 %A) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allzeroes
22*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7
23*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0
24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39
25*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
28*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %mask1, 0
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
31*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %mask2, 0
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  %res = or i1 %tst1, %tst2
34*9880d681SAndroid Build Coastguard Worker  ret i1 %res
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notallones(i32 %A) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notallones
39*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7
40*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], 7
41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39
42*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
45*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp ne i32 %mask1, 7
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
48*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp ne i32 %mask2, 39
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker  %res = and i1 %tst1, %tst2
51*9880d681SAndroid Build Coastguard Worker  ret i1 %res
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allones(i32 %A) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allones
56*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7
57*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 7
58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39
59*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
62*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %mask1, 7
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
65*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %mask2, 39
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker  %res = or i1 %tst1, %tst2
68*9880d681SAndroid Build Coastguard Worker  ret i1 %res
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notA(i32 %A) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notA
73*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39
74*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], %A
75*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 7
76*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
79*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp ne i32 %mask1, %A
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
82*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp ne i32 %mask2, %A
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %res = and i1 %tst1, %tst2
85*9880d681SAndroid Build Coastguard Worker  ret i1 %res
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_A(i32 %A) {
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_A
90*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39
91*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], %A
92*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 7
93*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 7
96*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %mask1, %A
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
99*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %mask2, %A
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker  %res = or i1 %tst1, %tst2
102*9880d681SAndroid Build Coastguard Worker  ret i1 %res
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allzeroes_notoptimised(i32 %A) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allzeroes_notoptimised
107*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 15
108*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0
109*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39
110*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0
111*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker  %mask1 = and i32 %A, 15
114*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %mask1, 0
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  %mask2 = and i32 %A, 39
117*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %mask2, 0
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker  %res = or i1 %tst1, %tst2
120*9880d681SAndroid Build Coastguard Worker  ret i1 %res
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine i1 @nomask_lhs(i32 %in) {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nomask_lhs
125*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %in, 1
126*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0
127*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
128*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
129*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %in, 0
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker  %masked = and i32 %in, 1
132*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %masked, 0
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  %val = or i1 %tst1, %tst2
135*9880d681SAndroid Build Coastguard Worker  ret i1 %val
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine i1 @nomask_rhs(i32 %in) {
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nomask_rhs
141*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %in, 1
142*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0
143*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
144*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1
145*9880d681SAndroid Build Coastguard Worker  %masked = and i32 %in, 1
146*9880d681SAndroid Build Coastguard Worker  %tst1 = icmp eq i32 %masked, 0
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker  %tst2 = icmp eq i32 %in, 0
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker  %val = or i1 %tst1, %tst2
151*9880d681SAndroid Build Coastguard Worker  ret i1 %val
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdefine i1 @fold_mask_cmps_to_false(i32 %x) {
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_mask_cmps_to_false
156*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
157*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %x, 2147483647
158*9880d681SAndroid Build Coastguard Worker  %2 = icmp eq i32 %1, 0
159*9880d681SAndroid Build Coastguard Worker  %3 = icmp eq i32 %x, 2147483647
160*9880d681SAndroid Build Coastguard Worker  %4 = and i1 %3, %2
161*9880d681SAndroid Build Coastguard Worker  ret i1 %4
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine i1 @fold_mask_cmps_to_true(i32 %x) {
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_mask_cmps_to_true
166*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
167*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %x, 2147483647
168*9880d681SAndroid Build Coastguard Worker  %2 = icmp ne i32 %1, 0
169*9880d681SAndroid Build Coastguard Worker  %3 = icmp ne i32 %x, 2147483647
170*9880d681SAndroid Build Coastguard Worker  %4 = or i1 %3, %2
171*9880d681SAndroid Build Coastguard Worker  ret i1 %4
172*9880d681SAndroid Build Coastguard Worker}
173