Skip to content

Commit 62a25a4

Browse files
authored
[InstSimplify] Remove foldSelectWithBinaryOp (#118913)
As mentioned in #118815, the purpose of this simplification is superseded by #76621, so we should have it deleted.
1 parent 01710aa commit 62a25a4

File tree

3 files changed

+127
-203
lines changed

3 files changed

+127
-203
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -81,48 +81,6 @@ static Value *simplifyInstructionWithOperands(Instruction *I,
8181
const SimplifyQuery &SQ,
8282
unsigned MaxRecurse);
8383

84-
static Value *foldSelectWithBinaryOp(Value *Cond, Value *TrueVal,
85-
Value *FalseVal) {
86-
BinaryOperator::BinaryOps BinOpCode;
87-
if (auto *BO = dyn_cast<BinaryOperator>(Cond))
88-
BinOpCode = BO->getOpcode();
89-
else
90-
return nullptr;
91-
92-
CmpInst::Predicate ExpectedPred;
93-
if (BinOpCode == BinaryOperator::Or) {
94-
ExpectedPred = ICmpInst::ICMP_NE;
95-
} else if (BinOpCode == BinaryOperator::And) {
96-
ExpectedPred = ICmpInst::ICMP_EQ;
97-
} else
98-
return nullptr;
99-
100-
// %A = icmp eq %TV, %FV
101-
// %B = icmp eq %X, %Y (and one of these is a select operand)
102-
// %C = and %A, %B
103-
// %D = select %C, %TV, %FV
104-
// -->
105-
// %FV
106-
107-
// %A = icmp ne %TV, %FV
108-
// %B = icmp ne %X, %Y (and one of these is a select operand)
109-
// %C = or %A, %B
110-
// %D = select %C, %TV, %FV
111-
// -->
112-
// %TV
113-
Value *X, *Y;
114-
if (!match(Cond,
115-
m_c_BinOp(m_c_SpecificICmp(ExpectedPred, m_Specific(TrueVal),
116-
m_Specific(FalseVal)),
117-
m_SpecificICmp(ExpectedPred, m_Value(X), m_Value(Y)))))
118-
return nullptr;
119-
120-
if (X == TrueVal || X == FalseVal || Y == TrueVal || Y == FalseVal)
121-
return BinOpCode == BinaryOperator::Or ? TrueVal : FalseVal;
122-
123-
return nullptr;
124-
}
125-
12684
/// For a boolean type or a vector of boolean type, return false or a vector
12785
/// with every element false.
12886
static Constant *getFalse(Type *Ty) { return ConstantInt::getFalse(Ty); }
@@ -4994,9 +4952,6 @@ static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
49944952
if (Value *V = simplifySelectWithFCmp(Cond, TrueVal, FalseVal, Q, MaxRecurse))
49954953
return V;
49964954

4997-
if (Value *V = foldSelectWithBinaryOp(Cond, TrueVal, FalseVal))
4998-
return V;
4999-
50004955
std::optional<bool> Imp = isImpliedByDomCondition(Cond, Q.CxtI, Q.DL);
50014956
if (Imp)
50024957
return *Imp ? TrueVal : FalseVal;

llvm/test/Transforms/InstSimplify/select-and-cmp.ll renamed to llvm/test/Transforms/InstCombine/select-and-cmp.ll

Lines changed: 64 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
33

44
define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
55
; CHECK-LABEL: @select_and_icmp(
@@ -100,7 +100,6 @@ define <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z)
100100
ret <2 x i8> %D
101101
}
102102

103-
104103
define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
105104
; CHECK-LABEL: @select_and_icmp_inv(
106105
; CHECK-NEXT: ret i32 [[X:%.*]]
@@ -112,14 +111,12 @@ define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
112111
ret i32 %D
113112
}
114113

115-
; Negative tests
114+
115+
; Below used to be negative tests in InstSimplify, but are no more negative cases here
116+
116117
define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
117118
; CHECK-LABEL: @select_and_icmp_pred_bad_1(
118-
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
119-
; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
120-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
121-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
122-
; CHECK-NEXT: ret i32 [[D]]
119+
; CHECK-NEXT: ret i32 [[X]]
123120
;
124121
%A = icmp eq i32 %x, %z
125122
%B = icmp ne i32 %y, %z
@@ -130,10 +127,8 @@ define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
130127

131128
define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
132129
; CHECK-LABEL: @select_and_icmp_pred_bad_2(
133-
; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
134-
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
135-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
136-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
130+
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
131+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
137132
; CHECK-NEXT: ret i32 [[D]]
138133
;
139134
%A = icmp ne i32 %x, %z
@@ -145,10 +140,8 @@ define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
145140

146141
define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
147142
; CHECK-LABEL: @select_and_icmp_pred_bad_3(
148-
; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
149-
; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
150-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
151-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
143+
; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
144+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]]
152145
; CHECK-NEXT: ret i32 [[D]]
153146
;
154147
%A = icmp ne i32 %x, %z
@@ -160,10 +153,8 @@ define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
160153

161154
define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
162155
; CHECK-LABEL: @select_and_icmp_pred_bad_4(
163-
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
164156
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
165-
; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
166-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
157+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
167158
; CHECK-NEXT: ret i32 [[D]]
168159
;
169160
%A = icmp eq i32 %x, %z
@@ -173,6 +164,60 @@ define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
173164
ret i32 %D
174165
}
175166

167+
define i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
168+
; CHECK-LABEL: @select_and_icmp_alt_bad_1(
169+
; CHECK-NEXT: ret i32 [[Z]]
170+
;
171+
%A = icmp eq i32 %x, %z
172+
%B = icmp ne i32 %y, %z
173+
%C = and i1 %A, %B
174+
%D = select i1 %C, i32 %x, i32 %z
175+
ret i32 %D
176+
}
177+
178+
define i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
179+
; CHECK-LABEL: @select_and_icmp_alt_bad_2(
180+
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
181+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
182+
; CHECK-NEXT: ret i32 [[D]]
183+
;
184+
%A = icmp ne i32 %x, %z
185+
%B = icmp eq i32 %y, %z
186+
%C = and i1 %A, %B
187+
%D = select i1 %C, i32 %x, i32 %z
188+
ret i32 %D
189+
}
190+
191+
192+
define i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
193+
; CHECK-LABEL: @select_and_icmp_alt_bad_3(
194+
; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
195+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]]
196+
; CHECK-NEXT: ret i32 [[D]]
197+
;
198+
%A = icmp ne i32 %x, %z
199+
%B = icmp ne i32 %y, %z
200+
%C = and i1 %A, %B
201+
%D = select i1 %C, i32 %x, i32 %z
202+
ret i32 %D
203+
}
204+
205+
define i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
206+
; CHECK-LABEL: @select_and_icmp_alt_bad_4(
207+
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
208+
; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
209+
; CHECK-NEXT: ret i32 [[D]]
210+
;
211+
%A = icmp eq i32 %x, %z
212+
%B = icmp eq i32 %y, %z
213+
%C = or i1 %A, %B
214+
%D = select i1 %C, i32 %x, i32 %z
215+
ret i32 %D
216+
}
217+
218+
219+
; Negative tests
220+
176221
define i32 @select_and_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
177222
; CHECK-LABEL: @select_and_icmp_bad_true_val(
178223
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
@@ -233,66 +278,6 @@ define i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
233278
ret i32 %D
234279
}
235280

236-
define i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
237-
; CHECK-LABEL: @select_and_icmp_alt_bad_1(
238-
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
239-
; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
240-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
241-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
242-
; CHECK-NEXT: ret i32 [[D]]
243-
;
244-
%A = icmp eq i32 %x, %z
245-
%B = icmp ne i32 %y, %z
246-
%C = and i1 %A, %B
247-
%D = select i1 %C, i32 %x, i32 %z
248-
ret i32 %D
249-
}
250-
251-
define i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
252-
; CHECK-LABEL: @select_and_icmp_alt_bad_2(
253-
; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
254-
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
255-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
256-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
257-
; CHECK-NEXT: ret i32 [[D]]
258-
;
259-
%A = icmp ne i32 %x, %z
260-
%B = icmp eq i32 %y, %z
261-
%C = and i1 %A, %B
262-
%D = select i1 %C, i32 %x, i32 %z
263-
ret i32 %D
264-
}
265-
266-
define i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
267-
; CHECK-LABEL: @select_and_icmp_alt_bad_3(
268-
; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
269-
; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
270-
; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
271-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
272-
; CHECK-NEXT: ret i32 [[D]]
273-
;
274-
%A = icmp ne i32 %x, %z
275-
%B = icmp ne i32 %y, %z
276-
%C = and i1 %A, %B
277-
%D = select i1 %C, i32 %x, i32 %z
278-
ret i32 %D
279-
}
280-
281-
define i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
282-
; CHECK-LABEL: @select_and_icmp_alt_bad_4(
283-
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
284-
; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
285-
; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
286-
; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287-
; CHECK-NEXT: ret i32 [[D]]
288-
;
289-
%A = icmp eq i32 %x, %z
290-
%B = icmp eq i32 %y, %z
291-
%C = or i1 %A, %B
292-
%D = select i1 %C, i32 %x, i32 %z
293-
ret i32 %D
294-
}
295-
296281
define i32 @select_and_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
297282
; CHECK-LABEL: @select_and_icmp_alt_bad_5(
298283
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]

0 commit comments

Comments
 (0)