[llvm-branch-commits] [llvm] release/18.x: [InstCombine] Fix unexpected overwriting in `foldSelectWithSRem` (#89539) (PR #89546)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Apr 21 07:47:25 PDT 2024
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/89546
Backport 6309440c218778db027306826993e484eab2be17
Requested by: @dtcxzyw
>From 6aa164f0a24b2f68a2983fab3e37b130c643247b Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sun, 21 Apr 2024 22:41:32 +0800
Subject: [PATCH] [InstCombine] Fix unexpected overwriting in
`foldSelectWithSRem` (#89539)
Fixes #89516
(cherry picked from commit 6309440c218778db027306826993e484eab2be17)
---
.../InstCombine/InstCombineSelect.cpp | 2 +-
.../Transforms/InstCombine/select-divrem.ll | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 9f220ec003ec33..8cc7901cbac7fa 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2606,7 +2606,7 @@ static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
// %cnd = icmp slt i32 %rem, 0
// %add = add i32 %rem, %n
// %sel = select i1 %cnd, i32 %add, i32 %rem
- if (match(TrueVal, m_Add(m_Value(RemRes), m_Value(Remainder))) &&
+ if (match(TrueVal, m_Add(m_Specific(RemRes), m_Value(Remainder))) &&
match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero*/ true) &&
FalseVal == RemRes)
diff --git a/llvm/test/Transforms/InstCombine/select-divrem.ll b/llvm/test/Transforms/InstCombine/select-divrem.ll
index f007c53359ca5a..e0c460c37451db 100644
--- a/llvm/test/Transforms/InstCombine/select-divrem.ll
+++ b/llvm/test/Transforms/InstCombine/select-divrem.ll
@@ -343,3 +343,20 @@ define i32 @rem_euclid_pow2_false_arm_folded(i32 %n) {
%res = select i1 %nonneg, i32 %rem, i32 1
ret i32 %res
}
+
+define i8 @pr89516(i8 %n, i8 %x) {
+; CHECK-LABEL: @pr89516(
+; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[X:%.*]], 0
+; CHECK-NEXT: [[POW2:%.*]] = shl nuw i8 1, [[N:%.*]]
+; CHECK-NEXT: [[SREM:%.*]] = srem i8 1, [[POW2]]
+; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND]], i8 [[POW2]], i8 0
+; CHECK-NEXT: [[RES:%.*]] = add nuw i8 [[SREM]], [[ADD]]
+; CHECK-NEXT: ret i8 [[RES]]
+;
+ %cond = icmp slt i8 %x, 0
+ %pow2 = shl nuw i8 1, %n
+ %srem = srem i8 1, %pow2
+ %add = add nuw i8 %srem, %pow2
+ %res = select i1 %cond, i8 %add, i8 %srem
+ ret i8 %res
+}
More information about the llvm-branch-commits
mailing list