Skip to content

Conversation

@dtcxzyw
Copy link
Member

@dtcxzyw dtcxzyw commented Nov 15, 2023

This patch propagates exact flags for ashr->lshr and sdiv->udiv in SCCP.

This missed optimization is discovered with the help of AliveToolkit/alive2#962.

@llvmbot
Copy link
Member

llvmbot commented Nov 15, 2023

@llvm/pr-subscribers-llvm-transforms

@llvm/pr-subscribers-function-specialization

Author: Yingwei Zheng (dtcxzyw)

Changes

This patch propagates exact flags for ashr->lshr and sdiv->udiv in SCCP.

This missed optimization is discovered with the help of AliveToolkit/alive2#962.


Full diff: https://github.com/llvm/llvm-project/pull/72432.diff

2 Files Affected:

  • (modified) llvm/lib/Transforms/Utils/SCCPSolver.cpp (+3)
  • (added) llvm/test/Transforms/SCCP/exact-flags.ll (+28)
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 +} 
Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dtcxzyw dtcxzyw merged commit c3b9c36 into llvm:main Nov 16, 2023
@dtcxzyw dtcxzyw deleted the sccp-propagate-exact-flag branch November 16, 2023 06:05
sr-tream pushed a commit to sr-tream/llvm-project that referenced this pull request Nov 20, 2023
This patch propagates exact flags for `ashr->lshr` and `sdiv->udiv` in SCCP. This missed optimization is discovered with the help of AliveToolkit/alive2#962.
zahiraam pushed a commit to zahiraam/llvm-project that referenced this pull request Nov 20, 2023
This patch propagates exact flags for `ashr->lshr` and `sdiv->udiv` in SCCP. This missed optimization is discovered with the help of AliveToolkit/alive2#962.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment