xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/bit-checks.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; This test makes sure that these instructions are properly eliminated.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | \
4*9880d681SAndroid Build Coastguard Worker; RUN:    not grep "tobool"
5*9880d681SAndroid Build Coastguard Worker; END.
6*9880d681SAndroid Build Coastguard Workerdefine i32 @main(i32 %argc, i8** %argv) nounwind ssp {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 1                         ; <i32> [#uses=1]
9*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
10*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 2                        ; <i32> [#uses=1]
11*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
12*9880d681SAndroid Build Coastguard Worker  %or.cond = and i1 %tobool, %tobool3             ; <i1> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker  %retval.0 = select i1 %or.cond, i32 2, i32 1    ; <i32> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i32 @main2(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 1                         ; <i32> [#uses=1]
20*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
21*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 2                        ; <i32> [#uses=1]
22*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
24*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
25*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; tests to check combining (icmp eq (A & B), C) & (icmp eq (A & D), E)
29*9880d681SAndroid Build Coastguard Worker; tests to check if (icmp eq (A & B), 0) is treated like (icmp eq (A & B), B)
30*9880d681SAndroid Build Coastguard Worker; if B is a single bit constant
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), 0) & (icmp eq (A & D), 0) -> (icmp eq (A & (B|D)), 0)
33*9880d681SAndroid Build Coastguard Workerdefine i32 @main3(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
38*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
39*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
40*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
41*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine i32 @main3b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
49*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 16                 ; <i1> [#uses=1]
50*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
51*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
52*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine i32 @main3e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
56*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
59*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
60*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
61*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
62*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
63*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), 0) | (icmp ne (A & D), 0) -> (icmp ne (A & (B|D)), 0)
68*9880d681SAndroid Build Coastguard Workerdefine i32 @main3c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
69*9880d681SAndroid Build Coastguard Workerentry:
70*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
75*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
76*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine i32 @main3d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 16                ; <i1> [#uses=1]
85*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
86*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
87*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine i32 @main3f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
91*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
94*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
95*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
96*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
97*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
98*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
99*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), B) & (icmp eq (A & D), D) -> (icmp eq (A & (B|D)), (B|D))
103*9880d681SAndroid Build Coastguard Workerdefine i32 @main4(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
106*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
107*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
108*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 48                ; <i1> [#uses=1]
109*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
110*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
111*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine i32 @main4b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
115*9880d681SAndroid Build Coastguard Workerentry:
116*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
117*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
118*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
119*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
120*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
121*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
122*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine i32 @main4e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
126*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
127*9880d681SAndroid Build Coastguard Workerentry:
128*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
129*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, %argc2              ; <i1> [#uses=1]
130*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
131*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, %argc3            ; <i1> [#uses=1]
132*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
133*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
134*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), B) | (icmp ne (A & D), D) -> (icmp ne (A & (B|D)), (B|D))
138*9880d681SAndroid Build Coastguard Workerdefine i32 @main4c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
139*9880d681SAndroid Build Coastguard Workerentry:
140*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
141*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
142*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
143*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 48                ; <i1> [#uses=1]
144*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
145*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
146*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine i32 @main4d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
152*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
153*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
154*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
155*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
156*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
157*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine i32 @main4f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
161*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
162*9880d681SAndroid Build Coastguard Workerentry:
163*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
164*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, %argc2              ; <i1> [#uses=1]
165*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
166*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, %argc3            ; <i1> [#uses=1]
167*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
168*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
169*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), A) & (icmp eq (A & D), A) -> (icmp eq (A & (B&D)), A)
173*9880d681SAndroid Build Coastguard Workerdefine i32 @main5_like(i32 %argc, i32 %argc2, i8** nocapture %argv)
174*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
175*9880d681SAndroid Build Coastguard Workerentry:
176*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
177*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
178*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc2, 7                       ; <i32> [#uses=1]
179*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 7                 ; <i1> [#uses=1]
180*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
181*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
182*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine i32 @main5e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
186*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
187*9880d681SAndroid Build Coastguard Workerentry:
188*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
189*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, %argc               ; <i1> [#uses=1]
190*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
191*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, %argc             ; <i1> [#uses=1]
192*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
193*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
194*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), A) | (icmp ne (A & D), A) -> (icmp ne (A & (B&D)), A)
198*9880d681SAndroid Build Coastguard Workerdefine i32 @main5c_like(i32 %argc, i32 %argc2, i8** nocapture %argv)
199*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
200*9880d681SAndroid Build Coastguard Workerentry:
201*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
202*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
203*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc2, 7                       ; <i32> [#uses=1]
204*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 7                 ; <i1> [#uses=1]
205*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
206*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
207*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine i32 @main5f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
211*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
212*9880d681SAndroid Build Coastguard Workerentry:
213*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
214*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, %argc               ; <i1> [#uses=1]
215*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
216*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, %argc             ; <i1> [#uses=1]
217*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
218*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
219*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), C) & (icmp eq (A & D), E) -> (icmp eq (A & (B|D)), (C|E))
223*9880d681SAndroid Build Coastguard Worker; if B, C, D, E are constant, and it's possible
224*9880d681SAndroid Build Coastguard Workerdefine i32 @main6(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
227*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 3                   ; <i1> [#uses=1]
228*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
229*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 16                ; <i1> [#uses=1]
230*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
231*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
232*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
233*9880d681SAndroid Build Coastguard Worker}
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdefine i32 @main6b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
236*9880d681SAndroid Build Coastguard Workerentry:
237*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
238*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 3                   ; <i1> [#uses=1]
239*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
240*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
241*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
242*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
243*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
244*9880d681SAndroid Build Coastguard Worker}
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), C) | (icmp ne (A & D), E) -> (icmp ne (A & (B|D)), (C|E))
247*9880d681SAndroid Build Coastguard Worker; if B, C, D, E are constant, and it's possible
248*9880d681SAndroid Build Coastguard Workerdefine i32 @main6c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
249*9880d681SAndroid Build Coastguard Workerentry:
250*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
251*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 3                   ; <i1> [#uses=1]
252*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
253*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp ne i32 %and2, 16                ; <i1> [#uses=1]
254*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
255*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
256*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine i32 @main6d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
260*9880d681SAndroid Build Coastguard Workerentry:
261*9880d681SAndroid Build Coastguard Worker  %and = and i32 %argc, 7                         ; <i32> [#uses=1]
262*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %and, 3                   ; <i1> [#uses=1]
263*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
264*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
265*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
266*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
267*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; test parameter permutations
271*9880d681SAndroid Build Coastguard Worker; (B & A) == B & (D & A) == D
272*9880d681SAndroid Build Coastguard Workerdefine i32 @main7a(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
273*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
274*9880d681SAndroid Build Coastguard Workerentry:
275*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %argc2, %argc                   ; <i32> [#uses=1]
276*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and1, %argc2              ; <i1> [#uses=1]
277*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc3, %argc                   ; <i32> [#uses=1]
278*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, %argc3            ; <i1> [#uses=1]
279*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
280*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
281*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
282*9880d681SAndroid Build Coastguard Worker}
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker; B == (A & B) & D == (A & D)
285*9880d681SAndroid Build Coastguard Workerdefine i32 @main7b(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
286*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
287*9880d681SAndroid Build Coastguard Workerentry:
288*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %argc, %argc2                   ; <i32> [#uses=1]
289*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %argc2, %and1             ; <i1> [#uses=1]
290*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
291*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %argc3, %and2            ; <i1> [#uses=1]
292*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
293*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
294*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
295*9880d681SAndroid Build Coastguard Worker}
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker; B == (B & A) & D == (D & A)
298*9880d681SAndroid Build Coastguard Workerdefine i32 @main7c(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
299*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
300*9880d681SAndroid Build Coastguard Workerentry:
301*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %argc2, %argc                   ; <i32> [#uses=1]
302*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %argc2, %and1             ; <i1> [#uses=1]
303*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc3, %argc                   ; <i32> [#uses=1]
304*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %argc3, %and2            ; <i1> [#uses=1]
305*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
306*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
307*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker; (A & (B & C)) == (B & C) & (A & (D & E)) == (D & E)
311*9880d681SAndroid Build Coastguard Workerdefine i32 @main7d(i32 %argc, i32 %argc2, i32 %argc3,
312*9880d681SAndroid Build Coastguard Worker                   i32 %argc4, i32 %argc5, i8** nocapture %argv)
313*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
314*9880d681SAndroid Build Coastguard Workerentry:
315*9880d681SAndroid Build Coastguard Worker  %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
316*9880d681SAndroid Build Coastguard Worker  %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
317*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %argc, %bc                      ; <i32> [#uses=1]
318*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and1, %bc                ; <i1> [#uses=1]
319*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %de                      ; <i32> [#uses=1]
320*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, %de               ; <i1> [#uses=1]
321*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
322*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
323*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
324*9880d681SAndroid Build Coastguard Worker}
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker; ((B & C) & A) == (B & C) & ((D & E) & A) == (D & E)
327*9880d681SAndroid Build Coastguard Workerdefine i32 @main7e(i32 %argc, i32 %argc2, i32 %argc3,
328*9880d681SAndroid Build Coastguard Worker                   i32 %argc4, i32 %argc5, i8** nocapture %argv)
329*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
330*9880d681SAndroid Build Coastguard Workerentry:
331*9880d681SAndroid Build Coastguard Worker  %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
332*9880d681SAndroid Build Coastguard Worker  %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
333*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %bc, %argc                      ; <i32> [#uses=1]
334*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and1, %bc                ; <i1> [#uses=1]
335*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %de, %argc                      ; <i32> [#uses=1]
336*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %and2, %de               ; <i1> [#uses=1]
337*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
338*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
339*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker; (B & C) == (A & (B & C)) & (D & E) == (A & (D & E))
343*9880d681SAndroid Build Coastguard Workerdefine i32 @main7f(i32 %argc, i32 %argc2, i32 %argc3,
344*9880d681SAndroid Build Coastguard Worker                   i32 %argc4, i32 %argc5, i8** nocapture %argv)
345*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
346*9880d681SAndroid Build Coastguard Workerentry:
347*9880d681SAndroid Build Coastguard Worker  %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
348*9880d681SAndroid Build Coastguard Worker  %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
349*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %argc, %bc                      ; <i32> [#uses=1]
350*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %bc, %and1                ; <i1> [#uses=1]
351*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %argc, %de                      ; <i32> [#uses=1]
352*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %de, %and2               ; <i1> [#uses=1]
353*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
354*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
355*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker; (B & C) == ((B & C) & A) & (D & E) == ((D & E) & A)
359*9880d681SAndroid Build Coastguard Workerdefine i32 @main7g(i32 %argc, i32 %argc2, i32 %argc3,
360*9880d681SAndroid Build Coastguard Worker                   i32 %argc4, i32 %argc5, i8** nocapture %argv)
361*9880d681SAndroid Build Coastguard Worker           nounwind readnone ssp {
362*9880d681SAndroid Build Coastguard Workerentry:
363*9880d681SAndroid Build Coastguard Worker  %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
364*9880d681SAndroid Build Coastguard Worker  %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
365*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %bc, %argc                      ; <i32> [#uses=1]
366*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %bc, %and1                ; <i1> [#uses=1]
367*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %de, %argc                      ; <i32> [#uses=1]
368*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i32 %de, %and2               ; <i1> [#uses=1]
369*9880d681SAndroid Build Coastguard Worker  %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
370*9880d681SAndroid Build Coastguard Worker  %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
371*9880d681SAndroid Build Coastguard Worker  ret i32 %storemerge
372*9880d681SAndroid Build Coastguard Worker}
373