[PATCH] D149423: [ValueTracking] Use knownbits interface for determining if `div`/`rem` are safe to speculate
Noah Goldstein via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 29 12:03:47 PDT 2023
goldstein.w.n updated this revision to Diff 518218.
goldstein.w.n added a comment.
Herald added a subscriber: asbirlea.
Rebase with tests in LICM
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D149423/new/
https://reviews.llvm.org/D149423
Files:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/LICM/speculate-div.ll
Index: llvm/test/Transforms/LICM/speculate-div.ll
===================================================================
--- llvm/test/Transforms/LICM/speculate-div.ll
+++ llvm/test/Transforms/LICM/speculate-div.ll
@@ -51,10 +51,10 @@
; CHECK-NEXT: entry:
; CHECK-NEXT: [[XO:%.*]] = or i16 [[XX:%.*]], 1
; CHECK-NEXT: [[X:%.*]] = and i16 [[XO]], 123
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 [[N:%.*]], [[X]]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: call void @maythrow()
-; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 [[N:%.*]], [[X]]
; CHECK-NEXT: call void @use(i16 [[DIV]])
; CHECK-NEXT: br label [[LOOP]]
;
@@ -74,10 +74,10 @@
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N:%.*]] = and i16 [[NN:%.*]], 123
; CHECK-NEXT: [[X:%.*]] = or i16 [[XX:%.*]], 1
+; CHECK-NEXT: [[DIV:%.*]] = srem i16 [[N]], [[X]]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: call void @maythrow()
-; CHECK-NEXT: [[DIV:%.*]] = srem i16 [[N]], [[X]]
; CHECK-NEXT: call void @use(i16 [[DIV]])
; CHECK-NEXT: br label [[LOOP]]
;
@@ -117,10 +117,10 @@
; CHECK-LABEL: @udiv_ok(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[X:%.*]] = or i16 [[XX:%.*]], 1
+; CHECK-NEXT: [[DIV:%.*]] = udiv i16 [[N:%.*]], [[X]]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: call void @maythrow()
-; CHECK-NEXT: [[DIV:%.*]] = udiv i16 [[N:%.*]], [[X]]
; CHECK-NEXT: call void @use(i16 [[DIV]])
; CHECK-NEXT: br label [[LOOP]]
;
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -5949,29 +5949,28 @@
case Instruction::UDiv:
case Instruction::URem: {
// x / y is undefined if y == 0.
- const APInt *V;
- if (match(Inst->getOperand(1), m_APInt(V)))
- return *V != 0;
- return false;
+ const DataLayout &DL = Inst->getModule()->getDataLayout();
+ return isKnownNonZero(Inst->getOperand(1), DL, /*Depth*/ 0, AC, CtxI, DT);
}
case Instruction::SDiv:
case Instruction::SRem: {
// x / y is undefined if y == 0 or x == INT_MIN and y == -1
- const APInt *Numerator, *Denominator;
- if (!match(Inst->getOperand(1), m_APInt(Denominator)))
- return false;
+ const DataLayout &DL = Inst->getModule()->getDataLayout();
+ KnownBits KnownDenominator =
+ computeKnownBits(Inst->getOperand(1), DL, /*Depth*/ 0, AC, CtxI, DT);
// We cannot hoist this division if the denominator is 0.
- if (*Denominator == 0)
+ if (!KnownDenominator.isNonZero())
return false;
+
// It's safe to hoist if the denominator is not 0 or -1.
- if (!Denominator->isAllOnes())
+ if (!KnownDenominator.Zero.isZero())
return true;
- // At this point we know that the denominator is -1. It is safe to hoist as
+
+ // At this point denominator may be -1. It is safe to hoist as
// long we know that the numerator is not INT_MIN.
- if (match(Inst->getOperand(0), m_APInt(Numerator)))
- return !Numerator->isMinSignedValue();
- // The numerator *might* be MinSignedValue.
- return false;
+ KnownBits KnownNumerator =
+ computeKnownBits(Inst->getOperand(0), DL, /*Depth*/ 0, AC, CtxI, DT);
+ return !KnownNumerator.getSignedMinValue().isMinSignedValue();
}
case Instruction::Load: {
const LoadInst *LI = dyn_cast<LoadInst>(Inst);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149423.518218.patch
Type: text/x-patch
Size: 3479 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230429/78386e3a/attachment.bin>
More information about the llvm-commits
mailing list