[llvm] [SCCP] Propagate exact flags (PR #72432)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 15 12:32:15 PST 2023


https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/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.

>From b7fe7c27d8ef6a3ce833ed899fdb5f777f5f95cc Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 16 Nov 2023 04:04:26 +0800
Subject: [PATCH 1/2] [SCCP] Add pre-commit tests. NFC.

---
 llvm/test/Transforms/SCCP/exact-flags.ll | 28 ++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 llvm/test/Transforms/SCCP/exact-flags.ll

diff --git a/llvm/test/Transforms/SCCP/exact-flags.ll b/llvm/test/Transforms/SCCP/exact-flags.ll
new file mode 100644
index 000000000000000..24b64219423ec3d
--- /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 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 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
+}

>From 36d908a387dd5e6171b4e093fd5a4df9501e4ea0 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 16 Nov 2023 04:05:22 +0800
Subject: [PATCH 2/2] [SCCP] Propagate exact flags

---
 llvm/lib/Transforms/Utils/SCCPSolver.cpp | 3 +++
 llvm/test/Transforms/SCCP/exact-flags.ll | 4 ++--
 2 files changed, 5 insertions(+), 2 deletions(-)

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
index 24b64219423ec3d..a5e3bf111bbd9da 100644
--- a/llvm/test/Transforms/SCCP/exact-flags.ll
+++ b/llvm/test/Transforms/SCCP/exact-flags.ll
@@ -5,7 +5,7 @@ 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 i8 [[P]], [[Y]]
+; CHECK-NEXT:    [[R:%.*]] = lshr exact i8 [[P]], [[Y]]
 ; CHECK-NEXT:    ret i8 [[R]]
 ;
   %p = and i8 %x, 127
@@ -18,7 +18,7 @@ define i8 @sdiv_to_udiv(i8 %x, i8 %y) {
 ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
 ; CHECK-NEXT:    [[X1:%.*]] = and i8 [[X]], 127
 ; CHECK-NEXT:    [[Y1:%.*]] = and i8 [[Y]], 127
-; CHECK-NEXT:    [[R:%.*]] = udiv i8 [[X1]], [[Y1]]
+; CHECK-NEXT:    [[R:%.*]] = udiv exact i8 [[X1]], [[Y1]]
 ; CHECK-NEXT:    ret i8 [[R]]
 ;
   %x1 = and i8 %x, 127



More information about the llvm-commits mailing list