[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / InstSimplify / and-or-implied-cond.ll
blobdb38077e0c51308e13c5a39b061bc3ea7bdbdb5c
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=instsimplify < %s | FileCheck %s
4 define i1 @or_implied(i8 %x, i1 %c) {
5 ; CHECK-LABEL: @or_implied(
6 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[X:%.*]], 1
7 ; CHECK-NEXT:    ret i1 [[CMP2]]
9   %cmp = icmp eq i8 %x, 0
10   %cmp2 = icmp ne i8 %x, 1
11   %and = and i1 %cmp, %c
12   %or = or i1 %and, %cmp2
13   ret i1 %or
16 define i1 @or_implied_comm1(i8 %x, i1 %c) {
17 ; CHECK-LABEL: @or_implied_comm1(
18 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[X:%.*]], 1
19 ; CHECK-NEXT:    ret i1 [[CMP2]]
21   %cmp = icmp eq i8 %x, 0
22   %cmp2 = icmp ne i8 %x, 1
23   %and = and i1 %cmp, %c
24   %or = or i1 %cmp2, %and
25   ret i1 %or
28 define i1 @or_implied_comm2(i8 %x, i1 %c) {
29 ; CHECK-LABEL: @or_implied_comm2(
30 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[X:%.*]], 1
31 ; CHECK-NEXT:    ret i1 [[CMP2]]
33   %cmp = icmp eq i8 %x, 0
34   %cmp2 = icmp ne i8 %x, 1
35   %and = and i1 %c, %cmp
36   %or = or i1 %and, %cmp2
37   ret i1 %or
40 define i1 @or_implied_comm3(i8 %x, i1 %c) {
41 ; CHECK-LABEL: @or_implied_comm3(
42 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[X:%.*]], 1
43 ; CHECK-NEXT:    ret i1 [[CMP2]]
45   %cmp = icmp eq i8 %x, 0
46   %cmp2 = icmp ne i8 %x, 1
47   %and = and i1 %c, %cmp
48   %or = or i1 %cmp2, %and
49   ret i1 %or
52 define i1 @or_not_implied(i8 %x, i1 %c) {
53 ; CHECK-LABEL: @or_not_implied(
54 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 0
55 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[X]], 0
56 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP]], [[C:%.*]]
57 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[AND]], [[CMP2]]
58 ; CHECK-NEXT:    ret i1 [[OR]]
60   %cmp = icmp eq i8 %x, 0
61   %cmp2 = icmp ne i8 %x, 0
62   %and = and i1 %cmp, %c
63   %or = or i1 %and, %cmp2
64   ret i1 %or
67 define i1 @and_implied(i8 %x, i1 %c) {
68 ; CHECK-LABEL: @and_implied(
69 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X:%.*]], 1
70 ; CHECK-NEXT:    ret i1 [[CMP2]]
72   %cmp = icmp ne i8 %x, 0
73   %cmp2 = icmp eq i8 %x, 1
74   %or = or i1 %cmp, %c
75   %and = and i1 %or, %cmp2
76   ret i1 %and
79 define i1 @and_implied_comm1(i8 %x, i1 %c) {
80 ; CHECK-LABEL: @and_implied_comm1(
81 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X:%.*]], 1
82 ; CHECK-NEXT:    ret i1 [[CMP2]]
84   %cmp = icmp ne i8 %x, 0
85   %cmp2 = icmp eq i8 %x, 1
86   %or = or i1 %cmp, %c
87   %and = and i1 %cmp2, %or
88   ret i1 %and
91 define i1 @and_implied_comm2(i8 %x, i1 %c) {
92 ; CHECK-LABEL: @and_implied_comm2(
93 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X:%.*]], 1
94 ; CHECK-NEXT:    ret i1 [[CMP2]]
96   %cmp = icmp ne i8 %x, 0
97   %cmp2 = icmp eq i8 %x, 1
98   %or = or i1 %c, %cmp
99   %and = and i1 %or, %cmp2
100   ret i1 %and
103 define i1 @and_implied_comm3(i8 %x, i1 %c) {
104 ; CHECK-LABEL: @and_implied_comm3(
105 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X:%.*]], 1
106 ; CHECK-NEXT:    ret i1 [[CMP2]]
108   %cmp = icmp ne i8 %x, 0
109   %cmp2 = icmp eq i8 %x, 1
110   %or = or i1 %c, %cmp
111   %and = and i1 %cmp2, %or
112   ret i1 %and
115 define i1 @and_not_implied(i8 %x, i1 %c) {
116 ; CHECK-LABEL: @and_not_implied(
117 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 0
118 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X]], 0
119 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP]], [[C:%.*]]
120 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[OR]], [[CMP2]]
121 ; CHECK-NEXT:    ret i1 [[AND]]
123   %cmp = icmp ne i8 %x, 0
124   %cmp2 = icmp eq i8 %x, 0
125   %or = or i1 %cmp, %c
126   %and = and i1 %or, %cmp2
127   ret i1 %and
130 define i1 @uaddo_and(i64 %a, i64 %b){
131 ; CHECK-LABEL: @uaddo_and(
132 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
133 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp uge i64 [[S]], [[A]]
134 ; CHECK-NEXT:    ret i1 [[COND_A]]
136   %s = add i64 %a, %b
137   %cond_a = icmp uge i64 %s, %a
138   %cond_b = icmp uge i64 %s, %b
139   %cond = and i1 %cond_a, %cond_b
140   ret i1 %cond
143 define i1 @uaddo_and_commuted1(i64 %a, i64 %b){
144 ; CHECK-LABEL: @uaddo_and_commuted1(
145 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
146 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ule i64 [[A]], [[S]]
147 ; CHECK-NEXT:    ret i1 [[COND_A]]
149   %s = add i64 %a, %b
150   %cond_a = icmp ule i64 %a, %s
151   %cond_b = icmp uge i64 %s, %b
152   %cond = and i1 %cond_a, %cond_b
153   ret i1 %cond
156 define i1 @uaddo_and_commuted2(i64 %a, i64 %b){
157 ; CHECK-LABEL: @uaddo_and_commuted2(
158 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
159 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp uge i64 [[S]], [[A]]
160 ; CHECK-NEXT:    ret i1 [[COND_A]]
162   %s = add i64 %a, %b
163   %cond_a = icmp uge i64 %s, %a
164   %cond_b = icmp ule i64 %b, %s
165   %cond = and i1 %cond_a, %cond_b
166   ret i1 %cond
169 define i1 @uaddo_and_commuted3(i64 %a, i64 %b){
170 ; CHECK-LABEL: @uaddo_and_commuted3(
171 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
172 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ule i64 [[A]], [[S]]
173 ; CHECK-NEXT:    ret i1 [[COND_A]]
175   %s = add i64 %a, %b
176   %cond_a = icmp ule i64 %a, %s
177   %cond_b = icmp ule i64 %b, %s
178   %cond = and i1 %cond_a, %cond_b
179   ret i1 %cond
182 define i1 @uaddo_or(i64 %a, i64 %b){
183 ; CHECK-LABEL: @uaddo_or(
184 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
185 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ult i64 [[S]], [[A]]
186 ; CHECK-NEXT:    ret i1 [[COND_A]]
188   %s = add i64 %a, %b
189   %cond_a = icmp ult i64 %s, %a
190   %cond_b = icmp ult i64 %s, %b
191   %cond = or i1 %cond_a, %cond_b
192   ret i1 %cond
195 define i1 @uaddo_or_commuted1(i64 %a, i64 %b){
196 ; CHECK-LABEL: @uaddo_or_commuted1(
197 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
198 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ugt i64 [[A]], [[S]]
199 ; CHECK-NEXT:    ret i1 [[COND_A]]
201   %s = add i64 %a, %b
202   %cond_a = icmp ugt i64 %a, %s
203   %cond_b = icmp ult i64 %s, %b
204   %cond = or i1 %cond_a, %cond_b
205   ret i1 %cond
208 define i1 @uaddo_or_commuted2(i64 %a, i64 %b){
209 ; CHECK-LABEL: @uaddo_or_commuted2(
210 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
211 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ult i64 [[S]], [[A]]
212 ; CHECK-NEXT:    ret i1 [[COND_A]]
214   %s = add i64 %a, %b
215   %cond_a = icmp ult i64 %s, %a
216   %cond_b = icmp ugt i64 %b, %s
217   %cond = or i1 %cond_a, %cond_b
218   ret i1 %cond
221 define i1 @uaddo_or_commuted3(i64 %a, i64 %b){
222 ; CHECK-LABEL: @uaddo_or_commuted3(
223 ; CHECK-NEXT:    [[S:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
224 ; CHECK-NEXT:    [[COND_A:%.*]] = icmp ugt i64 [[A]], [[S]]
225 ; CHECK-NEXT:    ret i1 [[COND_A]]
227   %s = add i64 %a, %b
228   %cond_a = icmp ugt i64 %a, %s
229   %cond_b = icmp ugt i64 %b, %s
230   %cond = or i1 %cond_a, %cond_b
231   ret i1 %cond
234 define i1 @pr69050(i32 %arg, i32 %arg1) {
235 ; CHECK-LABEL: @pr69050(
236 ; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[ARG:%.*]], -1
237 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[XOR]], [[ARG1:%.*]]
238 ; CHECK-NEXT:    [[ICMP:%.*]] = icmp ne i32 [[AND]], 0
239 ; CHECK-NEXT:    [[ICMP2:%.*]] = icmp ne i32 [[ARG]], -1
240 ; CHECK-NEXT:    [[AND3:%.*]] = and i1 [[ICMP2]], [[ICMP]]
241 ; CHECK-NEXT:    ret i1 [[AND3]]
243   %xor = xor i32 %arg, -1
244   %and = and i32 %xor, %arg1
245   %icmp = icmp ne i32 %and, 0
246   %icmp2 = icmp ne i32 %arg, -1
247   %and3 = and i1 %icmp2, %icmp
248   ret i1 %and3
251 define i1 @pr69091(i32 %arg, i32 %arg1) {
252 ; CHECK-LABEL: @pr69091(
253 ; CHECK-NEXT:    [[ICMP:%.*]] = icmp ne i32 [[ARG:%.*]], -1
254 ; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[ARG]], 1
255 ; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[ADD]], [[ARG1:%.*]]
256 ; CHECK-NEXT:    [[ICMP2:%.*]] = icmp ne i32 [[MUL]], 0
257 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[ICMP]], [[ICMP2]]
258 ; CHECK-NEXT:    ret i1 [[OR]]
260   %icmp = icmp ne i32 %arg, -1
261   %add = add i32 %arg, 1
262   %mul = mul i32 %add, %arg1
263   %icmp2 = icmp ne i32 %mul, 0
264   %or = or i1 %icmp, %icmp2
265   ret i1 %or