Skip to content

Commit bd050a3

Browse files
committed
[FPEnv][InstSimplify] Teach CannotBeNegativeZero() about constrained intrinsics.
Currently some optimizations are disabled because llvm::CannotBeNegativeZero() does not know how to deal with the constrained intrinsics. This patch fixes that by extending the existing implementation. Differential Revision: https://reviews.llvm.org/D121483
1 parent c59c2b6 commit bd050a3

File tree

3 files changed

+19
-16
lines changed

3 files changed

+19
-16
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3397,9 +3397,6 @@ Intrinsic::ID llvm::getIntrinsicForCallSite(const CallBase &CB,
33973397
/// NOTE: Do not check 'nsz' here because that fast-math-flag does not guarantee
33983398
/// that a value is not -0.0. It only guarantees that -0.0 may be treated
33993399
/// the same as +0.0 in floating-point ops.
3400-
///
3401-
/// NOTE: this function will need to be revisited when we support non-default
3402-
/// rounding modes!
34033400
bool llvm::CannotBeNegativeZero(const Value *V, const TargetLibraryInfo *TLI,
34043401
unsigned Depth) {
34053402
if (auto *CFP = dyn_cast<ConstantFP>(V))
@@ -3429,9 +3426,21 @@ bool llvm::CannotBeNegativeZero(const Value *V, const TargetLibraryInfo *TLI,
34293426
case Intrinsic::sqrt:
34303427
case Intrinsic::canonicalize:
34313428
return CannotBeNegativeZero(Call->getArgOperand(0), TLI, Depth + 1);
3429+
case Intrinsic::experimental_constrained_sqrt: {
3430+
// NOTE: This rounding mode restriction may be too strict.
3431+
const auto *CI = cast<ConstrainedFPIntrinsic>(Call);
3432+
if (CI->getRoundingMode() == RoundingMode::NearestTiesToEven)
3433+
return CannotBeNegativeZero(Call->getArgOperand(0), TLI, Depth + 1);
3434+
else
3435+
return false;
3436+
}
34323437
// fabs(x) != -0.0
34333438
case Intrinsic::fabs:
34343439
return true;
3440+
// sitofp and uitofp turn into +0.0 for zero.
3441+
case Intrinsic::experimental_constrained_sitofp:
3442+
case Intrinsic::experimental_constrained_uitofp:
3443+
return true;
34353444
}
34363445
}
34373446

llvm/test/Transforms/InstSimplify/strictfp-fsub.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,10 @@ define float @fold_fsub_fabs_nnan_x_n0_ebstrict(float %a) #0 {
216216
ret float %sub
217217
}
218218

219-
; TODO: This can't fire currently due to missing constrained support:
220219
define float @fold_fsub_sitofp_x_n0_defaultenv(i32 %a) #0 {
221220
; CHECK-LABEL: @fold_fsub_sitofp_x_n0_defaultenv(
222221
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
223-
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[FPA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
224-
; CHECK-NEXT: ret float [[SUB]]
222+
; CHECK-NEXT: ret float [[FPA]]
225223
;
226224
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
227225
%sub = call float @llvm.experimental.constrained.fsub.f32(float %fpa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0

llvm/test/Transforms/InstSimplify/strictfp-sqrt-nonneg.ll

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ define float @nonneg_u_defaultenv(i32 %a) #0 {
99
; CHECK-LABEL: @nonneg_u_defaultenv(
1010
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
1111
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
12-
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
13-
; CHECK-NEXT: ret float [[SUB]]
12+
; CHECK-NEXT: ret float [[SQRA]]
1413
;
1514
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
1615
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
@@ -22,8 +21,7 @@ define float @nonneg_s_defaultenv(i32 %a) #0 {
2221
; CHECK-LABEL: @nonneg_s_defaultenv(
2322
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
2423
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
25-
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
26-
; CHECK-NEXT: ret float [[SUB]]
24+
; CHECK-NEXT: ret float [[SQRA]]
2725
;
2826
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
2927
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
@@ -35,8 +33,7 @@ define float @nonneg_u_maytrap(i32 %a) #0 {
3533
; CHECK-LABEL: @nonneg_u_maytrap(
3634
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
3735
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
38-
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
39-
; CHECK-NEXT: ret float [[SUB]]
36+
; CHECK-NEXT: ret float [[SQRA]]
4037
;
4138
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
4239
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
@@ -48,8 +45,7 @@ define float @nonneg_s_maytrap(i32 %a) #0 {
4845
; CHECK-LABEL: @nonneg_s_maytrap(
4946
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
5047
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
51-
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
52-
; CHECK-NEXT: ret float [[SUB]]
48+
; CHECK-NEXT: ret float [[SQRA]]
5349
;
5450
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
5551
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
@@ -63,7 +59,7 @@ define float @nonneg_u_ebstrict(i32 %a) #0 {
6359
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
6460
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
6561
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
66-
; CHECK-NEXT: ret float [[SUB]]
62+
; CHECK-NEXT: ret float [[SQRA]]
6763
;
6864
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
6965
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
@@ -77,7 +73,7 @@ define float @nonneg_s_ebstrict(i32 %a) #0 {
7773
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
7874
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
7975
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
80-
; CHECK-NEXT: ret float [[SUB]]
76+
; CHECK-NEXT: ret float [[SQRA]]
8177
;
8278
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
8379
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.strict") #0

0 commit comments

Comments
 (0)