Skip to content

Commit e46dd6f

Browse files
committed
Revert "[InstCombine] Simplify and/or of icmp eq with op replacement (#70335)"
This reverts commit 1770a2e. Stage 2 llvm-tblgen crashes when generating X86GenAsmWriter.inc and other files.
1 parent 9a7c26a commit e46dd6f

14 files changed

+587
-241
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2025,52 +2025,6 @@ static Value *simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0,
20252025
return nullptr;
20262026
}
20272027

2028-
static Value *simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp,
2029-
const SimplifyQuery &Q,
2030-
bool AllowRefinement,
2031-
SmallVectorImpl<Instruction *> *DropFlags,
2032-
unsigned MaxRecurse);
2033-
2034-
static Value *simplifyAndOrWithICmpEq(unsigned Opcode, Value *Op0, Value *Op1,
2035-
const SimplifyQuery &Q,
2036-
unsigned MaxRecurse) {
2037-
assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
2038-
"Must be and/or");
2039-
ICmpInst::Predicate Pred;
2040-
Value *A, *B;
2041-
if (!match(Op0, m_ICmp(Pred, m_Value(A), m_Value(B))) ||
2042-
!ICmpInst::isEquality(Pred) || !MaxRecurse--)
2043-
return nullptr;
2044-
2045-
auto Simplify = [&](Value *Res) -> Value * {
2046-
// and (icmp eq a, b), x implies (a==b) inside x.
2047-
// or (icmp ne a, b), x implies (a==b) inside x.
2048-
// If x simplifies to true/false, we can simplify the and/or.
2049-
if (Pred ==
2050-
(Opcode == Instruction::And ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE))
2051-
return simplifyBinOp(Opcode, Op0, Res, Q, MaxRecurse);
2052-
// If we have and (icmp ne a, b), x and for a==b we can simplify x to false,
2053-
// then we can drop the icmp, as x will already be false in the case where
2054-
// the icmp is false. Similar for or and true.
2055-
if (Res == ConstantExpr::getBinOpAbsorber(Opcode, Res->getType()))
2056-
return Op1;
2057-
return nullptr;
2058-
};
2059-
2060-
// Increment MaxRecurse again, because simplifyWithOpReplaced() does its own
2061-
// decrement.
2062-
if (Value *Res =
2063-
simplifyWithOpReplaced(Op1, A, B, Q, /* AllowRefinement */ true,
2064-
/* DropFlags */ nullptr, MaxRecurse + 1))
2065-
return Simplify(Res);
2066-
if (Value *Res =
2067-
simplifyWithOpReplaced(Op1, B, A, Q, /* AllowRefinement */ true,
2068-
/* DropFlags */ nullptr, MaxRecurse + 1))
2069-
return Simplify(Res);
2070-
2071-
return nullptr;
2072-
}
2073-
20742028
/// Given a bitwise logic op, check if the operands are add/sub with a common
20752029
/// source value and inverted constant (identity: C - X -> ~(X + ~C)).
20762030
static Value *simplifyLogicOfAddSub(Value *Op0, Value *Op1,
@@ -2205,13 +2159,6 @@ static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
22052159
isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, Q.DT))
22062160
return Constant::getNullValue(Op0->getType());
22072161

2208-
if (Value *V =
2209-
simplifyAndOrWithICmpEq(Instruction::And, Op0, Op1, Q, MaxRecurse))
2210-
return V;
2211-
if (Value *V =
2212-
simplifyAndOrWithICmpEq(Instruction::And, Op1, Op0, Q, MaxRecurse))
2213-
return V;
2214-
22152162
if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, true))
22162163
return V;
22172164

@@ -2488,13 +2435,6 @@ static Value *simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
24882435
match(Op0, m_LShr(m_Specific(X), m_Specific(Y))))
24892436
return Op1;
24902437

2491-
if (Value *V =
2492-
simplifyAndOrWithICmpEq(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2493-
return V;
2494-
if (Value *V =
2495-
simplifyAndOrWithICmpEq(Instruction::Or, Op1, Op0, Q, MaxRecurse))
2496-
return V;
2497-
24982438
if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false))
24992439
return V;
25002440

llvm/test/CodeGen/PowerPC/pr45448.ll

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,20 @@ define hidden void @julia_tryparse_internal_45896() #0 {
2020
; CHECK-NEXT: .LBB0_6: # %fail194
2121
; CHECK-NEXT: .LBB0_7: # %L670
2222
; CHECK-NEXT: li r5, -3
23+
; CHECK-NEXT: cmpdi r3, 0
2324
; CHECK-NEXT: sradi r4, r3, 63
2425
; CHECK-NEXT: rldic r5, r5, 4, 32
26+
; CHECK-NEXT: crnot 4*cr5+lt, eq
2527
; CHECK-NEXT: mulhdu r3, r3, r5
2628
; CHECK-NEXT: maddld r6, r4, r5, r3
2729
; CHECK-NEXT: cmpld cr1, r6, r3
2830
; CHECK-NEXT: mulhdu. r3, r4, r5
31+
; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_10
32+
; CHECK-NEXT: # %bb.8: # %L670
2933
; CHECK-NEXT: crorc 4*cr5+lt, 4*cr1+lt, eq
30-
; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_9
31-
; CHECK-NEXT: # %bb.8: # %L917
32-
; CHECK-NEXT: .LBB0_9: # %L994
34+
; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_10
35+
; CHECK-NEXT: # %bb.9: # %L917
36+
; CHECK-NEXT: .LBB0_10: # %L994
3337
top:
3438
%0 = load i64, ptr undef, align 8
3539
%1 = icmp ne i64 %0, 0

llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) {
4747

4848
define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) {
4949
; CHECK-LABEL: @n3_wrong_pred(
50-
; CHECK-NEXT: ret i1 false
50+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0
51+
; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]])
52+
; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1
53+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[SMUL_OV]], [[CMP]]
54+
; CHECK-NEXT: ret i1 [[AND]]
5155
;
5256
%cmp = icmp eq i4 %size, 0 ; not 'ne'
5357
%smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb)
@@ -59,7 +63,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) {
5963
define i1 @n4_not_and(i4 %size, i4 %nmemb) {
6064
; CHECK-LABEL: @n4_not_and(
6165
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0
62-
; CHECK-NEXT: ret i1 [[CMP]]
66+
; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]])
67+
; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1
68+
; CHECK-NEXT: [[AND:%.*]] = or i1 [[SMUL_OV]], [[CMP]]
69+
; CHECK-NEXT: ret i1 [[AND]]
6370
;
6471
%cmp = icmp ne i4 %size, 0
6572
%smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb)

llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) {
4747

4848
define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) {
4949
; CHECK-LABEL: @n3_wrong_pred(
50-
; CHECK-NEXT: ret i1 false
50+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0
51+
; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]])
52+
; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1
53+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[UMUL_OV]], [[CMP]]
54+
; CHECK-NEXT: ret i1 [[AND]]
5155
;
5256
%cmp = icmp eq i4 %size, 0 ; not 'ne'
5357
%umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb)
@@ -59,7 +63,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) {
5963
define i1 @n4_not_and(i4 %size, i4 %nmemb) {
6064
; CHECK-LABEL: @n4_not_and(
6165
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0
62-
; CHECK-NEXT: ret i1 [[CMP]]
66+
; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]])
67+
; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1
68+
; CHECK-NEXT: [[AND:%.*]] = or i1 [[UMUL_OV]], [[CMP]]
69+
; CHECK-NEXT: ret i1 [[AND]]
6370
;
6471
%cmp = icmp ne i4 %size, 0
6572
%umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb)

llvm/test/Transforms/InstCombine/ispow2.ll

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,9 @@ define i1 @is_pow2_ctpop_wrong_pred1(i32 %x) {
392392
; CHECK-LABEL: @is_pow2_ctpop_wrong_pred1(
393393
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
394394
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[T0]], 2
395-
; CHECK-NEXT: ret i1 [[CMP]]
395+
; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0
396+
; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]]
397+
; CHECK-NEXT: ret i1 [[R]]
396398
;
397399
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
398400
%cmp = icmp ugt i32 %t0, 2
@@ -944,7 +946,9 @@ define i1 @is_pow2or0_ctpop_wrong_pred1(i32 %x) {
944946
; CHECK-LABEL: @is_pow2or0_ctpop_wrong_pred1(
945947
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
946948
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 1
947-
; CHECK-NEXT: ret i1 [[CMP]]
949+
; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i32 [[X]], 0
950+
; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]]
951+
; CHECK-NEXT: ret i1 [[R]]
948952
;
949953
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
950954
%cmp = icmp ne i32 %t0, 1
@@ -955,7 +959,11 @@ define i1 @is_pow2or0_ctpop_wrong_pred1(i32 %x) {
955959

956960
define i1 @is_pow2or0_ctpop_wrong_pred2(i32 %x) {
957961
; CHECK-LABEL: @is_pow2or0_ctpop_wrong_pred2(
958-
; CHECK-NEXT: ret i1 true
962+
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
963+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 1
964+
; CHECK-NEXT: [[ISZERO:%.*]] = icmp ne i32 [[X]], 0
965+
; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]]
966+
; CHECK-NEXT: ret i1 [[R]]
959967
;
960968
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
961969
%cmp = icmp ne i32 %t0, 1
@@ -1141,7 +1149,9 @@ define i1 @isnot_pow2nor0_ctpop_wrong_pred1(i32 %x) {
11411149
; CHECK-LABEL: @isnot_pow2nor0_ctpop_wrong_pred1(
11421150
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
11431151
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[T0]], 1
1144-
; CHECK-NEXT: ret i1 [[CMP]]
1152+
; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0
1153+
; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]]
1154+
; CHECK-NEXT: ret i1 [[R]]
11451155
;
11461156
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
11471157
%cmp = icmp eq i32 %t0, 1
@@ -1152,7 +1162,11 @@ define i1 @isnot_pow2nor0_ctpop_wrong_pred1(i32 %x) {
11521162

11531163
define i1 @isnot_pow2nor0_ctpop_wrong_pred2(i32 %x) {
11541164
; CHECK-LABEL: @isnot_pow2nor0_ctpop_wrong_pred2(
1155-
; CHECK-NEXT: ret i1 false
1165+
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
1166+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[T0]], 1
1167+
; CHECK-NEXT: [[NOTZERO:%.*]] = icmp eq i32 [[X]], 0
1168+
; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]]
1169+
; CHECK-NEXT: ret i1 [[R]]
11561170
;
11571171
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
11581172
%cmp = icmp eq i32 %t0, 1

llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ define <2 x i1> @eq_or_non_0_commute(<2 x i32> %x) {
4040

4141
define i1 @eq_or_non_0_wrong_pred1(i32 %x) {
4242
; CHECK-LABEL: @eq_or_non_0_wrong_pred1(
43-
; CHECK-NEXT: ret i1 true
43+
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]])
44+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 10
45+
; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0
46+
; CHECK-NEXT: [[R:%.*]] = or i1 [[NOTZERO]], [[CMP]]
47+
; CHECK-NEXT: ret i1 [[R]]
4448
;
4549
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
4650
%cmp = icmp ne i32 %t0, 10
@@ -86,7 +90,9 @@ define i1 @ne_and_is_0_wrong_pred1(i32 %x) {
8690
; CHECK-LABEL: @ne_and_is_0_wrong_pred1(
8791
; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]])
8892
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 10
89-
; CHECK-NEXT: ret i1 [[CMP]]
93+
; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i32 [[X]], 0
94+
; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]]
95+
; CHECK-NEXT: ret i1 [[R]]
9096
;
9197
%t0 = tail call i32 @llvm.ctpop.i32(i32 %x)
9298
%cmp = icmp ne i32 %t0, 10

0 commit comments

Comments
 (0)