Skip to content

Commit d5fb515

Browse files
committed
[InstCombine] Handle commuted patterns in foldSelectWithSRem
1 parent 8c7a4f4 commit d5fb515

File tree

2 files changed

+5
-7
lines changed

2 files changed

+5
-7
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2823,9 +2823,9 @@ static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
28232823
// %cnd = icmp slt i32 %rem, 0
28242824
// %add = add i32 %rem, %n
28252825
// %sel = select i1 %cnd, i32 %add, i32 %rem
2826-
if (match(TrueVal, m_Add(m_Specific(RemRes), m_Value(Remainder))) &&
2826+
if (match(TrueVal, m_c_Add(m_Specific(RemRes), m_Value(Remainder))) &&
28272827
match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
2828-
IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero*/ true) &&
2828+
IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero=*/true) &&
28292829
FalseVal == RemRes)
28302830
return FoldToBitwiseAnd(Remainder);
28312831

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -324,11 +324,9 @@ define i8 @rem_euclid_non_const_pow2(i8 %0, i8 %1) {
324324

325325
define i8 @rem_euclid_non_const_pow2_commuted(i8 %0, i8 %1) {
326326
; CHECK-LABEL: @rem_euclid_non_const_pow2_commuted(
327-
; CHECK-NEXT: [[POW2:%.*]] = shl nuw i8 1, [[TMP0:%.*]]
328-
; CHECK-NEXT: [[REM:%.*]] = srem i8 [[TMP1:%.*]], [[POW2]]
329-
; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[REM]], 0
330-
; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND]], i8 [[POW2]], i8 0
331-
; CHECK-NEXT: [[SEL:%.*]] = add i8 [[REM]], [[ADD]]
327+
; CHECK-NEXT: [[NOTMASK:%.*]] = shl nsw i8 -1, [[TMP0:%.*]]
328+
; CHECK-NEXT: [[TMP3:%.*]] = xor i8 [[NOTMASK]], -1
329+
; CHECK-NEXT: [[SEL:%.*]] = and i8 [[TMP1:%.*]], [[TMP3]]
332330
; CHECK-NEXT: ret i8 [[SEL]]
333331
;
334332
%pow2 = shl i8 1, %0

0 commit comments

Comments
 (0)