@@ -211,23 +211,18 @@ static std::optional<std::pair<unsigned, unsigned>> getMaskedTypeForICmpPair(
211
211
// above.
212
212
Value *L1 = LHS->getOperand (0 );
213
213
Value *L2 = LHS->getOperand (1 );
214
- Value *L11, *L12, *L21, *L22;
214
+ Value *L11 = nullptr , *L12 = nullptr , *L21 = nullptr , *L22 = nullptr ;
215
215
// Check whether the icmp can be decomposed into a bit test.
216
216
if (decomposeBitTestICmp (L1, L2, PredL, L11, L12, L2)) {
217
217
L21 = L22 = L1 = nullptr ;
218
218
} else {
219
219
// Look for ANDs in the LHS icmp.
220
- if (!match (L1, m_And (m_Value (L11), m_Value (L12)))) {
221
- // Any icmp can be viewed as being trivially masked; if it allows us to
222
- // remove one, it's worth it.
223
- L11 = L1;
224
- L12 = Constant::getAllOnesValue (L1->getType ());
225
- }
220
+ match (L1, m_And (m_Value (L11), m_Value (L12)));
221
+ match (L2, m_And (m_Value (L21), m_Value (L22)));
226
222
227
- if (!match (L2, m_And (m_Value (L21), m_Value (L22)))) {
228
- L21 = L2;
229
- L22 = Constant::getAllOnesValue (L2->getType ());
230
- }
223
+ // Check that at least one and was found.
224
+ if (!L11 && !L21)
225
+ return std::nullopt;
231
226
}
232
227
233
228
// Bail if LHS was a icmp that can't be decomposed into an equality.
@@ -252,54 +247,42 @@ static std::optional<std::pair<unsigned, unsigned>> getMaskedTypeForICmpPair(
252
247
R1 = nullptr ;
253
248
Ok = true ;
254
249
} else {
255
- if (!match (R1, m_And (m_Value (R11), m_Value (R12)))) {
256
- // As before, model no mask as a trivial mask if it'll let us do an
257
- // optimization.
258
- R11 = R1;
259
- R12 = Constant::getAllOnesValue (R1->getType ());
250
+ if (match (R1, m_And (m_Value (R11), m_Value (R12)))) {
251
+ if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
252
+ A = R11;
253
+ D = R12;
254
+ E = R2;
255
+ Ok = true ;
256
+ } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
257
+ A = R12;
258
+ D = R11;
259
+ E = R2;
260
+ Ok = true ;
261
+ }
260
262
}
261
263
262
- if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
263
- A = R11;
264
- D = R12;
265
- E = R2;
266
- Ok = true ;
267
- } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
268
- A = R12;
269
- D = R11;
270
- E = R2;
271
- Ok = true ;
264
+ if (match (R2, m_And (m_Value (R11), m_Value (R12)))) {
265
+ if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
266
+ A = R11;
267
+ D = R12;
268
+ E = R1;
269
+ Ok = true ;
270
+ } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
271
+ A = R12;
272
+ D = R11;
273
+ E = R1;
274
+ Ok = true ;
275
+ }
272
276
}
277
+
278
+ if (!Ok)
279
+ return std::nullopt;
273
280
}
274
281
275
282
// Bail if RHS was a icmp that can't be decomposed into an equality.
276
283
if (!ICmpInst::isEquality (PredR))
277
284
return std::nullopt;
278
285
279
- // Look for ANDs on the right side of the RHS icmp.
280
- if (!Ok) {
281
- if (!match (R2, m_And (m_Value (R11), m_Value (R12)))) {
282
- R11 = R2;
283
- R12 = Constant::getAllOnesValue (R2->getType ());
284
- }
285
-
286
- if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
287
- A = R11;
288
- D = R12;
289
- E = R1;
290
- Ok = true ;
291
- } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
292
- A = R12;
293
- D = R11;
294
- E = R1;
295
- Ok = true ;
296
- } else {
297
- return std::nullopt;
298
- }
299
-
300
- assert (Ok && " Failed to find AND on the right side of the RHS icmp." );
301
- }
302
-
303
286
if (L11 == A) {
304
287
B = L12;
305
288
C = L2;
0 commit comments