Skip to content

Commit 516bf1a

Browse files
committed
[InstCombine] Remove AllOnes fallbacks in getMaskedTypeForICmpPair()
getMaskedTypeForICmpPair() tries to model non-and operands as x & -1. However, this can end up confusing the matching logic, by picking the -1 operand as the "common" operand, resulting in a successful, but useless, match. This is what causes commutation failures for some of the optimizations driven by this function. Fix this by removing this -1 fallback entirely. We don't seem to have any test coverage that demonstrates why it would be needed.
1 parent fd83b86 commit 516bf1a

File tree

2 files changed

+41
-62
lines changed

2 files changed

+41
-62
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -211,23 +211,18 @@ static std::optional<std::pair<unsigned, unsigned>> getMaskedTypeForICmpPair(
211211
// above.
212212
Value *L1 = LHS->getOperand(0);
213213
Value *L2 = LHS->getOperand(1);
214-
Value *L11, *L12, *L21, *L22;
214+
Value *L11 = nullptr, *L12 = nullptr, *L21 = nullptr, *L22 = nullptr;
215215
// Check whether the icmp can be decomposed into a bit test.
216216
if (decomposeBitTestICmp(L1, L2, PredL, L11, L12, L2)) {
217217
L21 = L22 = L1 = nullptr;
218218
} else {
219219
// 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)));
226222

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;
231226
}
232227

233228
// 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(
252247
R1 = nullptr;
253248
Ok = true;
254249
} 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+
}
260262
}
261263

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+
}
272276
}
277+
278+
if (!Ok)
279+
return std::nullopt;
273280
}
274281

275282
// Bail if RHS was a icmp that can't be decomposed into an equality.
276283
if (!ICmpInst::isEquality(PredR))
277284
return std::nullopt;
278285

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-
303286
if (L11 == A) {
304287
B = L12;
305288
C = L2;

llvm/test/Transforms/InstCombine/bit-checks.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -809,12 +809,10 @@ define i32 @main7a_logical(i32 %argc, i32 %argc2, i32 %argc3) {
809809
define i32 @main7b(i32 %argc, i32 %argc2, i32 %argc3x) {
810810
; CHECK-LABEL: @main7b(
811811
; CHECK-NEXT: [[ARGC3:%.*]] = mul i32 [[ARGC3X:%.*]], 42
812-
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[ARGC:%.*]], [[ARGC2:%.*]]
813-
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[AND1]], [[ARGC2]]
814-
; CHECK-NEXT: [[AND2:%.*]] = and i32 [[ARGC3]], [[ARGC]]
815-
; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp ne i32 [[ARGC3]], [[AND2]]
816-
; CHECK-NEXT: [[AND_COND_NOT:%.*]] = or i1 [[TOBOOL]], [[TOBOOL3]]
817-
; CHECK-NEXT: [[STOREMERGE:%.*]] = zext i1 [[AND_COND_NOT]] to i32
812+
; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[ARGC3]], [[ARGC2:%.*]]
813+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[ARGC:%.*]]
814+
; CHECK-NEXT: [[AND_COND:%.*]] = icmp ne i32 [[TMP2]], [[TMP1]]
815+
; CHECK-NEXT: [[STOREMERGE:%.*]] = zext i1 [[AND_COND]] to i32
818816
; CHECK-NEXT: ret i32 [[STOREMERGE]]
819817
;
820818
%argc3 = mul i32 %argc3x, 42 ; thwart complexity-based canonicalization
@@ -850,12 +848,10 @@ define i32 @main7b_logical(i32 %argc, i32 %argc2, i32 %argc3) {
850848
define i32 @main7c(i32 %argc, i32 %argc2, i32 %argc3x) {
851849
; CHECK-LABEL: @main7c(
852850
; CHECK-NEXT: [[ARGC3:%.*]] = mul i32 [[ARGC3X:%.*]], 42
853-
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[ARGC2:%.*]], [[ARGC:%.*]]
854-
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[AND1]], [[ARGC2]]
855-
; CHECK-NEXT: [[AND2:%.*]] = and i32 [[ARGC3]], [[ARGC]]
856-
; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp ne i32 [[ARGC3]], [[AND2]]
857-
; CHECK-NEXT: [[AND_COND_NOT:%.*]] = or i1 [[TOBOOL]], [[TOBOOL3]]
858-
; CHECK-NEXT: [[STOREMERGE:%.*]] = zext i1 [[AND_COND_NOT]] to i32
851+
; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[ARGC3]], [[ARGC2:%.*]]
852+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[ARGC:%.*]]
853+
; CHECK-NEXT: [[AND_COND:%.*]] = icmp ne i32 [[TMP2]], [[TMP1]]
854+
; CHECK-NEXT: [[STOREMERGE:%.*]] = zext i1 [[AND_COND]] to i32
859855
; CHECK-NEXT: ret i32 [[STOREMERGE]]
860856
;
861857
%argc3 = mul i32 %argc3x, 42 ; thwart complexity-based canonicalization

0 commit comments

Comments
 (0)