Skip to content

Commit e7c816b

Browse files
dtcxzywtstellar
authored andcommitted
[InstCombine] Fix unexpected overwriting in foldSelectWithSRem (#89539)
Fixes #89516 (cherry picked from commit 6309440)
1 parent 3685a59 commit e7c816b

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2606,7 +2606,7 @@ static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
26062606
// %cnd = icmp slt i32 %rem, 0
26072607
// %add = add i32 %rem, %n
26082608
// %sel = select i1 %cnd, i32 %add, i32 %rem
2609-
if (match(TrueVal, m_Add(m_Value(RemRes), m_Value(Remainder))) &&
2609+
if (match(TrueVal, m_Add(m_Specific(RemRes), m_Value(Remainder))) &&
26102610
match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
26112611
IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero*/ true) &&
26122612
FalseVal == RemRes)

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

+17
Original file line numberDiff line numberDiff line change
@@ -343,3 +343,20 @@ define i32 @rem_euclid_pow2_false_arm_folded(i32 %n) {
343343
%res = select i1 %nonneg, i32 %rem, i32 1
344344
ret i32 %res
345345
}
346+
347+
define i8 @pr89516(i8 %n, i8 %x) {
348+
; CHECK-LABEL: @pr89516(
349+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[X:%.*]], 0
350+
; CHECK-NEXT: [[POW2:%.*]] = shl nuw i8 1, [[N:%.*]]
351+
; CHECK-NEXT: [[SREM:%.*]] = srem i8 1, [[POW2]]
352+
; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND]], i8 [[POW2]], i8 0
353+
; CHECK-NEXT: [[RES:%.*]] = add nuw i8 [[SREM]], [[ADD]]
354+
; CHECK-NEXT: ret i8 [[RES]]
355+
;
356+
%cond = icmp slt i8 %x, 0
357+
%pow2 = shl nuw i8 1, %n
358+
%srem = srem i8 1, %pow2
359+
%add = add nuw i8 %srem, %pow2
360+
%res = select i1 %cond, i8 %add, i8 %srem
361+
ret i8 %res
362+
}

0 commit comments

Comments
 (0)