[llvm] 6640df9 - ValueTracking: Remove CannotBeOrderedLessThanZero
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 11 17:42:23 PDT 2023
Author: Matt Arsenault
Date: 2023-07-11T20:42:18-04:00
New Revision: 6640df94f9abd4f9fef0263afbf7978ac55832b8
URL: https://github.com/llvm/llvm-project/commit/6640df94f9abd4f9fef0263afbf7978ac55832b8
DIFF: https://github.com/llvm/llvm-project/commit/6640df94f9abd4f9fef0263afbf7978ac55832b8.diff
LOG: ValueTracking: Remove CannotBeOrderedLessThanZero
Replace the last user of CannotBeOrderedLessThanZero with new
version. Makes assumes work in this case.
Added:
Modified:
llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
llvm/test/Transforms/AggressiveInstCombine/X86/sqrt.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
index 952043cefe2447..503ce019dc8439 100644
--- a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -400,7 +400,8 @@ static bool tryToFPToSat(Instruction &I, TargetTransformInfo &TTI) {
/// pessimistic codegen that has to account for setting errno and can enable
/// vectorization.
static bool foldSqrt(Instruction &I, TargetTransformInfo &TTI,
- TargetLibraryInfo &TLI) {
+ TargetLibraryInfo &TLI, AssumptionCache &AC,
+ DominatorTree &DT) {
// Match a call to sqrt mathlib function.
auto *Call = dyn_cast<CallInst>(&I);
if (!Call)
@@ -424,7 +425,8 @@ static bool foldSqrt(Instruction &I, TargetTransformInfo &TTI,
Value *Arg = Call->getArgOperand(0);
if (TTI.haveFastSqrt(Ty) &&
(Call->hasNoNaNs() ||
- CannotBeOrderedLessThanZero(Arg, M->getDataLayout(), &TLI))) {
+ cannotBeOrderedLessThanZero(Arg, M->getDataLayout(), &TLI, 0, &AC, &I,
+ &DT))) {
IRBuilder<> Builder(&I);
IRBuilderBase::FastMathFlagGuard Guard(Builder);
Builder.setFastMathFlags(Call->getFastMathFlags());
@@ -918,7 +920,8 @@ static bool foldPatternedLoads(Instruction &I, const DataLayout &DL) {
/// occur frequently and/or have more than a constant-length pattern match.
static bool foldUnusualPatterns(Function &F, DominatorTree &DT,
TargetTransformInfo &TTI,
- TargetLibraryInfo &TLI, AliasAnalysis &AA) {
+ TargetLibraryInfo &TLI, AliasAnalysis &AA,
+ AssumptionCache &AC) {
bool MadeChange = false;
for (BasicBlock &BB : F) {
// Ignore unreachable basic blocks.
@@ -943,7 +946,7 @@ static bool foldUnusualPatterns(Function &F, DominatorTree &DT,
// NOTE: This function introduces erasing of the instruction `I`, so it
// needs to be called at the end of this sequence, otherwise we may make
// bugs.
- MadeChange |= foldSqrt(I, TTI, TLI);
+ MadeChange |= foldSqrt(I, TTI, TLI, AC, DT);
}
}
@@ -964,7 +967,7 @@ static bool runImpl(Function &F, AssumptionCache &AC, TargetTransformInfo &TTI,
const DataLayout &DL = F.getParent()->getDataLayout();
TruncInstCombine TIC(AC, TLI, DL, DT);
MadeChange |= TIC.run(F);
- MadeChange |= foldUnusualPatterns(F, DT, TTI, TLI, AA);
+ MadeChange |= foldUnusualPatterns(F, DT, TTI, TLI, AA, AC);
return MadeChange;
}
diff --git a/llvm/test/Transforms/AggressiveInstCombine/X86/sqrt.ll b/llvm/test/Transforms/AggressiveInstCombine/X86/sqrt.ll
index 665f6de96d932a..d54e53a21bbf79 100644
--- a/llvm/test/Transforms/AggressiveInstCombine/X86/sqrt.ll
+++ b/llvm/test/Transforms/AggressiveInstCombine/X86/sqrt.ll
@@ -5,6 +5,7 @@ declare float @sqrtf(float)
declare double @sqrt(double)
declare fp128 @sqrtl(fp128)
declare float @llvm.fabs.f32(float)
+declare void @llvm.assume(i1 noundef)
; "nnan" implies no setting of errno and the target can lower this to an
; instruction, so transform to an intrinsic.
@@ -46,7 +47,7 @@ define fp128 @sqrt_call_nnan_f128(fp128 %x) {
define float @sqrt_call_nnan_f32_nobuiltin(float %x) {
; CHECK-LABEL: @sqrt_call_nnan_f32_nobuiltin(
-; CHECK-NEXT: [[SQRT:%.*]] = call nnan float @sqrtf(float [[X:%.*]]) #[[ATTR1:[0-9]+]]
+; CHECK-NEXT: [[SQRT:%.*]] = call nnan float @sqrtf(float [[X:%.*]]) #[[ATTR2:[0-9]+]]
; CHECK-NEXT: ret float [[SQRT]]
;
%sqrt = call nnan float @sqrtf(float %x) nobuiltin
@@ -74,3 +75,16 @@ define float @sqrt_call_f32_fabs(float %x) {
%sqrt = call float @sqrtf(float %a)
ret float %sqrt
}
+
+define float @sqrt_call_f32_assume_oge_n0(float %x) {
+; CHECK-LABEL: @sqrt_call_f32_assume_oge_n0(
+; CHECK-NEXT: [[IS_POS:%.*]] = fcmp oge float [[X:%.*]], -0.000000e+00
+; CHECK-NEXT: call void @llvm.assume(i1 [[IS_POS]])
+; CHECK-NEXT: [[SQRT1:%.*]] = call float @llvm.sqrt.f32(float [[X]])
+; CHECK-NEXT: ret float [[SQRT1]]
+;
+ %is.pos = fcmp oge float %x, -0.0
+ call void @llvm.assume(i1 %is.pos)
+ %sqrt = call float @sqrtf(float %x)
+ ret float %sqrt
+}
More information about the llvm-commits
mailing list