Skip to content

Commit 7883184

Browse files
authored
Revert "[InstCombine] Teach foldSelectOpOp about samesign" (#124123)
Reverts #122723 due to a miscompilation See #122723 (comment) for details and the test case.
1 parent 26fc07d commit 7883184

File tree

2 files changed

+4
-100
lines changed

2 files changed

+4
-100
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,10 +428,10 @@ Instruction *InstCombinerImpl::foldSelectOpOp(SelectInst &SI, Instruction *TI,
428428
CmpPredicate TPred, FPred;
429429
if (match(TI, m_ICmp(TPred, m_Value(), m_Value())) &&
430430
match(FI, m_ICmp(FPred, m_Value(), m_Value()))) {
431-
bool Swapped = ICmpInst::isRelational(FPred) &&
432-
CmpPredicate::getMatching(
433-
TPred, ICmpInst::getSwappedCmpPredicate(FPred));
434-
if (CmpPredicate::getMatching(TPred, FPred) || Swapped) {
431+
// FIXME: Use CmpPredicate::getMatching here.
432+
CmpInst::Predicate T = TPred, F = FPred;
433+
if (T == F || T == ICmpInst::getSwappedCmpPredicate(F)) {
434+
bool Swapped = T != F;
435435
if (Value *MatchOp =
436436
getCommonOp(TI, FI, ICmpInst::isEquality(TPred), Swapped)) {
437437
Value *NewSel = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,

llvm/test/Transforms/InstCombine/select-cmp.ll

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,6 @@ define i1 @icmp_ne_common_op00(i1 %c, i6 %x, i6 %y, i6 %z) {
2323
ret i1 %r
2424
}
2525

26-
define i1 @icmp_ne_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
27-
; CHECK-LABEL: @icmp_ne_samesign_common(
28-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
29-
; CHECK-NEXT: [[R:%.*]] = icmp ne i6 [[X:%.*]], [[R_V]]
30-
; CHECK-NEXT: ret i1 [[R]]
31-
;
32-
%cmp1 = icmp samesign ne i6 %x, %y
33-
%cmp2 = icmp ne i6 %x, %z
34-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
35-
ret i1 %r
36-
}
37-
3826
define i1 @icmp_ne_common_op01(i1 %c, i3 %x, i3 %y, i3 %z) {
3927
; CHECK-LABEL: @icmp_ne_common_op01(
4028
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i3 [[Y:%.*]], i3 [[Z:%.*]]
@@ -83,18 +71,6 @@ define i1 @icmp_eq_common_op00(i1 %c, i5 %x, i5 %y, i5 %z) {
8371
ret i1 %r
8472
}
8573

86-
define i1 @icmp_eq_samesign_common(i1 %c, i5 %x, i5 %y, i5 %z) {
87-
; CHECK-LABEL: @icmp_eq_samesign_common(
88-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i5 [[Y:%.*]], i5 [[Z:%.*]]
89-
; CHECK-NEXT: [[R:%.*]] = icmp eq i5 [[X:%.*]], [[R_V]]
90-
; CHECK-NEXT: ret i1 [[R]]
91-
;
92-
%cmp1 = icmp eq i5 %x, %y
93-
%cmp2 = icmp samesign eq i5 %x, %z
94-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
95-
ret i1 %r
96-
}
97-
9874
define <5 x i1> @icmp_eq_common_op01(<5 x i1> %c, <5 x i7> %x, <5 x i7> %y, <5 x i7> %z) {
9975
; CHECK-LABEL: @icmp_eq_common_op01(
10076
; CHECK-NEXT: [[R_V:%.*]] = select <5 x i1> [[C:%.*]], <5 x i7> [[Y:%.*]], <5 x i7> [[Z:%.*]]
@@ -158,18 +134,6 @@ define i1 @icmp_slt_common(i1 %c, i6 %x, i6 %y, i6 %z) {
158134
ret i1 %r
159135
}
160136

161-
define i1 @icmp_slt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
162-
; CHECK-LABEL: @icmp_slt_samesign_common(
163-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
164-
; CHECK-NEXT: [[R:%.*]] = icmp ult i6 [[X:%.*]], [[R_V]]
165-
; CHECK-NEXT: ret i1 [[R]]
166-
;
167-
%cmp1 = icmp samesign ult i6 %x, %y
168-
%cmp2 = icmp slt i6 %x, %z
169-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
170-
ret i1 %r
171-
}
172-
173137
define i1 @icmp_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {
174138
; CHECK-LABEL: @icmp_sgt_common(
175139
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
@@ -182,18 +146,6 @@ define i1 @icmp_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {
182146
ret i1 %r
183147
}
184148

185-
define i1 @icmp_sgt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
186-
; CHECK-LABEL: @icmp_sgt_samesign_common(
187-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
188-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i6 [[X:%.*]], [[R_V]]
189-
; CHECK-NEXT: ret i1 [[R]]
190-
;
191-
%cmp1 = icmp samesign ugt i6 %x, %y
192-
%cmp2 = icmp sgt i6 %x, %z
193-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
194-
ret i1 %r
195-
}
196-
197149
define i1 @icmp_sle_common(i1 %c, i6 %x, i6 %y, i6 %z) {
198150
; CHECK-LABEL: @icmp_sle_common(
199151
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
@@ -206,18 +158,6 @@ define i1 @icmp_sle_common(i1 %c, i6 %x, i6 %y, i6 %z) {
206158
ret i1 %r
207159
}
208160

209-
define i1 @icmp_sle_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
210-
; CHECK-LABEL: @icmp_sle_samesign_common(
211-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
212-
; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]
213-
; CHECK-NEXT: ret i1 [[R]]
214-
;
215-
%cmp1 = icmp sle i6 %y, %x
216-
%cmp2 = icmp samesign ule i6 %z, %x
217-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
218-
ret i1 %r
219-
}
220-
221161
define i1 @icmp_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {
222162
; CHECK-LABEL: @icmp_sge_common(
223163
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
@@ -230,18 +170,6 @@ define i1 @icmp_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {
230170
ret i1 %r
231171
}
232172

233-
define i1 @icmp_sge_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
234-
; CHECK-LABEL: @icmp_sge_samesign_common(
235-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
236-
; CHECK-NEXT: [[R:%.*]] = icmp sle i6 [[X:%.*]], [[R_V]]
237-
; CHECK-NEXT: ret i1 [[R]]
238-
;
239-
%cmp1 = icmp sge i6 %y, %x
240-
%cmp2 = icmp samesign uge i6 %z, %x
241-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
242-
ret i1 %r
243-
}
244-
245173
define i1 @icmp_slt_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {
246174
; CHECK-LABEL: @icmp_slt_sgt_common(
247175
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
@@ -254,18 +182,6 @@ define i1 @icmp_slt_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {
254182
ret i1 %r
255183
}
256184

257-
define i1 @icmp_slt_sgt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
258-
; CHECK-LABEL: @icmp_slt_sgt_samesign_common(
259-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
260-
; CHECK-NEXT: [[R:%.*]] = icmp ult i6 [[X:%.*]], [[R_V]]
261-
; CHECK-NEXT: ret i1 [[R]]
262-
;
263-
%cmp1 = icmp samesign ult i6 %x, %y
264-
%cmp2 = icmp sgt i6 %z, %x
265-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
266-
ret i1 %r
267-
}
268-
269185
define i1 @icmp_sle_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {
270186
; CHECK-LABEL: @icmp_sle_sge_common(
271187
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
@@ -278,18 +194,6 @@ define i1 @icmp_sle_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {
278194
ret i1 %r
279195
}
280196

281-
define i1 @icmp_sle_sge_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {
282-
; CHECK-LABEL: @icmp_sle_sge_samesign_common(
283-
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
284-
; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]
285-
; CHECK-NEXT: ret i1 [[R]]
286-
;
287-
%cmp1 = icmp sle i6 %y, %x
288-
%cmp2 = icmp samesign uge i6 %x, %z
289-
%r = select i1 %c, i1 %cmp1, i1 %cmp2
290-
ret i1 %r
291-
}
292-
293197
define i1 @icmp_ult_common(i1 %c, i6 %x, i6 %y, i6 %z) {
294198
; CHECK-LABEL: @icmp_ult_common(
295199
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]

0 commit comments

Comments
 (0)