[llvm] c3b9c36 - [SCCP] Propagate exact flags (#72432)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 15 22:05:32 PST 2023
Author: Yingwei Zheng
Date: 2023-11-16T14:05:28+08:00
New Revision: c3b9c36f3ab4d9021951a00c9a6798e3fe0a48a5
URL: https://github.com/llvm/llvm-project/commit/c3b9c36f3ab4d9021951a00c9a6798e3fe0a48a5
DIFF: https://github.com/llvm/llvm-project/commit/c3b9c36f3ab4d9021951a00c9a6798e3fe0a48a5.diff
LOG: [SCCP] Propagate exact flags (#72432)
This patch propagates exact flags for `ashr->lshr` and `sdiv->udiv` in
SCCP.
This missed optimization is discovered with the help of
https://github.com/AliveToolkit/alive2/pull/962.
Added:
llvm/test/Transforms/SCCP/exact-flags.ll
Modified:
llvm/lib/Transforms/Utils/SCCPSolver.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
index dac10c2a8baf9e1..ab95698abc4399d 100644
--- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp
+++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
@@ -187,6 +187,7 @@ static bool replaceSignedInst(SCCPSolver &Solver,
if (InsertedValues.count(Op0) || !isNonNegative(Op0))
return false;
NewInst = BinaryOperator::CreateLShr(Op0, Inst.getOperand(1), "", &Inst);
+ NewInst->setIsExact(Inst.isExact());
break;
}
case Instruction::SDiv:
@@ -199,6 +200,8 @@ static bool replaceSignedInst(SCCPSolver &Solver,
auto NewOpcode = Inst.getOpcode() == Instruction::SDiv ? Instruction::UDiv
: Instruction::URem;
NewInst = BinaryOperator::Create(NewOpcode, Op0, Op1, "", &Inst);
+ if (Inst.getOpcode() == Instruction::SDiv)
+ NewInst->setIsExact(Inst.isExact());
break;
}
default:
diff --git a/llvm/test/Transforms/SCCP/exact-flags.ll b/llvm/test/Transforms/SCCP/exact-flags.ll
new file mode 100644
index 000000000000000..a5e3bf111bbd9da
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/exact-flags.ll
@@ -0,0 +1,28 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
+; RUN: opt -passes=sccp < %s -S | FileCheck %s
+
+define i8 @ashr_to_lshr(i8 %x, i8 %y) {
+; CHECK-LABEL: define i8 @ashr_to_lshr(
+; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
+; CHECK-NEXT: [[P:%.*]] = and i8 [[X]], 127
+; CHECK-NEXT: [[R:%.*]] = lshr exact i8 [[P]], [[Y]]
+; CHECK-NEXT: ret i8 [[R]]
+;
+ %p = and i8 %x, 127
+ %r = ashr exact i8 %p, %y
+ ret i8 %r
+}
+
+define i8 @sdiv_to_udiv(i8 %x, i8 %y) {
+; CHECK-LABEL: define i8 @sdiv_to_udiv(
+; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
+; CHECK-NEXT: [[X1:%.*]] = and i8 [[X]], 127
+; CHECK-NEXT: [[Y1:%.*]] = and i8 [[Y]], 127
+; CHECK-NEXT: [[R:%.*]] = udiv exact i8 [[X1]], [[Y1]]
+; CHECK-NEXT: ret i8 [[R]]
+;
+ %x1 = and i8 %x, 127
+ %y1 = and i8 %y, 127
+ %r = sdiv exact i8 %x1, %y1
+ ret i8 %r
+}
More information about the llvm-commits
mailing list