forked from OSchip/llvm-project
[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
This commit is contained in:
parent
c59c2b6bd1
commit
bd050a34fe
|
@ -3397,9 +3397,6 @@ Intrinsic::ID llvm::getIntrinsicForCallSite(const CallBase &CB,
|
|||
/// NOTE: Do not check 'nsz' here because that fast-math-flag does not guarantee
|
||||
/// that a value is not -0.0. It only guarantees that -0.0 may be treated
|
||||
/// the same as +0.0 in floating-point ops.
|
||||
///
|
||||
/// NOTE: this function will need to be revisited when we support non-default
|
||||
/// rounding modes!
|
||||
bool llvm::CannotBeNegativeZero(const Value *V, const TargetLibraryInfo *TLI,
|
||||
unsigned Depth) {
|
||||
if (auto *CFP = dyn_cast<ConstantFP>(V))
|
||||
|
@ -3429,9 +3426,21 @@ bool llvm::CannotBeNegativeZero(const Value *V, const TargetLibraryInfo *TLI,
|
|||
case Intrinsic::sqrt:
|
||||
case Intrinsic::canonicalize:
|
||||
return CannotBeNegativeZero(Call->getArgOperand(0), TLI, Depth + 1);
|
||||
case Intrinsic::experimental_constrained_sqrt: {
|
||||
// NOTE: This rounding mode restriction may be too strict.
|
||||
const auto *CI = cast<ConstrainedFPIntrinsic>(Call);
|
||||
if (CI->getRoundingMode() == RoundingMode::NearestTiesToEven)
|
||||
return CannotBeNegativeZero(Call->getArgOperand(0), TLI, Depth + 1);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
// fabs(x) != -0.0
|
||||
case Intrinsic::fabs:
|
||||
return true;
|
||||
// sitofp and uitofp turn into +0.0 for zero.
|
||||
case Intrinsic::experimental_constrained_sitofp:
|
||||
case Intrinsic::experimental_constrained_uitofp:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -216,12 +216,10 @@ define float @fold_fsub_fabs_nnan_x_n0_ebstrict(float %a) #0 {
|
|||
ret float %sub
|
||||
}
|
||||
|
||||
; TODO: This can't fire currently due to missing constrained support:
|
||||
define float @fold_fsub_sitofp_x_n0_defaultenv(i32 %a) #0 {
|
||||
; CHECK-LABEL: @fold_fsub_sitofp_x_n0_defaultenv(
|
||||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[FPA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[FPA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
|
||||
%sub = call float @llvm.experimental.constrained.fsub.f32(float %fpa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
|
||||
|
|
|
@ -9,8 +9,7 @@ define float @nonneg_u_defaultenv(i32 %a) #0 {
|
|||
; CHECK-LABEL: @nonneg_u_defaultenv(
|
||||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
|
||||
%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 {
|
|||
; CHECK-LABEL: @nonneg_s_defaultenv(
|
||||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
|
||||
%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 {
|
|||
; CHECK-LABEL: @nonneg_u_maytrap(
|
||||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
||||
%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 {
|
|||
; CHECK-LABEL: @nonneg_s_maytrap(
|
||||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
||||
%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 {
|
|||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||
%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 {
|
|||
; CHECK-NEXT: [[FPA:%.*]] = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SQRA:%.*]] = call float @llvm.experimental.constrained.sqrt.f32(float [[FPA]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[SQRA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[SUB]]
|
||||
; CHECK-NEXT: ret float [[SQRA]]
|
||||
;
|
||||
%fpa = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||
%sqra = call float @llvm.experimental.constrained.sqrt.f32(float %fpa, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||
|
|
Loading…
Reference in New Issue