forked from OSchip/llvm-project
[FPEnv][InstSimplify] Fold fsub X, -0 ==> X, when we know X is not -0
Currently the fsub optimizations in InstSimplify don't know how to fold X - -0.0 to X when we know X is not zero and the constrained intrinsics are used. This adds the support. This review is split out from D107285. Differential Revision: https://reviews.llvm.org/D119746
This commit is contained in:
parent
f1ec99f973
commit
c7400892ca
|
@ -5138,14 +5138,15 @@ SimplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
||||||
if (match(Op1, m_PosZeroFP()))
|
if (match(Op1, m_PosZeroFP()))
|
||||||
return Op0;
|
return Op0;
|
||||||
|
|
||||||
|
// fsub X, -0 ==> X, when we know X is not -0
|
||||||
|
if (canIgnoreSNaN(ExBehavior, FMF))
|
||||||
|
if (match(Op1, m_NegZeroFP()) &&
|
||||||
|
(FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI)))
|
||||||
|
return Op0;
|
||||||
|
|
||||||
if (!isDefaultFPEnvironment(ExBehavior, Rounding))
|
if (!isDefaultFPEnvironment(ExBehavior, Rounding))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// fsub X, -0 ==> X, when we know X is not -0
|
|
||||||
if (match(Op1, m_NegZeroFP()) &&
|
|
||||||
(FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI)))
|
|
||||||
return Op0;
|
|
||||||
|
|
||||||
// fsub -0.0, (fsub -0.0, X) ==> X
|
// fsub -0.0, (fsub -0.0, X) ==> X
|
||||||
// fsub -0.0, (fneg X) ==> X
|
// fsub -0.0, (fneg X) ==> X
|
||||||
Value *X;
|
Value *X;
|
||||||
|
|
|
@ -127,11 +127,9 @@ define float @fold_fsub_nsz_x_n0_ebmaytrap(float %a) #0 {
|
||||||
ret float %sub
|
ret float %sub
|
||||||
}
|
}
|
||||||
|
|
||||||
; TODO: This will fold if we allow non-default floating point environments.
|
|
||||||
define float @fold_fsub_nnan_nsz_x_n0_ebmaytrap(float %a) #0 {
|
define float @fold_fsub_nnan_nsz_x_n0_ebmaytrap(float %a) #0 {
|
||||||
; CHECK-LABEL: @fold_fsub_nnan_nsz_x_n0_ebmaytrap(
|
; CHECK-LABEL: @fold_fsub_nnan_nsz_x_n0_ebmaytrap(
|
||||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan nsz float @llvm.experimental.constrained.fsub.f32(float [[A:%.*]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
; CHECK-NEXT: ret float [[A:%.*]]
|
||||||
; CHECK-NEXT: ret float [[SUB]]
|
|
||||||
;
|
;
|
||||||
%sub = call nnan nsz float @llvm.experimental.constrained.fsub.f32(float %a, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
%sub = call nnan nsz float @llvm.experimental.constrained.fsub.f32(float %a, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
||||||
ret float %sub
|
ret float %sub
|
||||||
|
@ -147,12 +145,11 @@ define float @fold_fsub_nsz_x_n0_ebstrict(float %a) #0 {
|
||||||
ret float %sub
|
ret float %sub
|
||||||
}
|
}
|
||||||
|
|
||||||
; TODO: This will fold if we allow non-default floating point environments.
|
|
||||||
; TODO: The instruction is expected to remain, but the result isn't used.
|
; TODO: The instruction is expected to remain, but the result isn't used.
|
||||||
define float @fold_fsub_nsz_nnan_x_n0_ebstrict(float %a) #0 {
|
define float @fold_fsub_nsz_nnan_x_n0_ebstrict(float %a) #0 {
|
||||||
; CHECK-LABEL: @fold_fsub_nsz_nnan_x_n0_ebstrict(
|
; CHECK-LABEL: @fold_fsub_nsz_nnan_x_n0_ebstrict(
|
||||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan nsz float @llvm.experimental.constrained.fsub.f32(float [[A:%.*]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
; CHECK-NEXT: [[SUB:%.*]] = call nnan nsz float @llvm.experimental.constrained.fsub.f32(float [[A:%.*]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||||
; CHECK-NEXT: ret float [[SUB]]
|
; CHECK-NEXT: ret float [[A]]
|
||||||
;
|
;
|
||||||
%sub = call nsz nnan float @llvm.experimental.constrained.fsub.f32(float %a, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
%sub = call nsz nnan float @llvm.experimental.constrained.fsub.f32(float %a, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||||
ret float %sub
|
ret float %sub
|
||||||
|
@ -185,12 +182,10 @@ define float @fold_fsub_fabs_x_n0_ebmaytrap(float %a) #0 {
|
||||||
ret float %sub
|
ret float %sub
|
||||||
}
|
}
|
||||||
|
|
||||||
; TODO: This will fold if we allow non-default floating point environments.
|
|
||||||
define float @fold_fsub_fabs_nnan_x_n0_ebmaytrap(float %a) #0 {
|
define float @fold_fsub_fabs_nnan_x_n0_ebmaytrap(float %a) #0 {
|
||||||
; CHECK-LABEL: @fold_fsub_fabs_nnan_x_n0_ebmaytrap(
|
; CHECK-LABEL: @fold_fsub_fabs_nnan_x_n0_ebmaytrap(
|
||||||
; CHECK-NEXT: [[ABSA:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
|
; CHECK-NEXT: [[ABSA:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
|
||||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[ABSA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
; CHECK-NEXT: ret float [[ABSA]]
|
||||||
; CHECK-NEXT: ret float [[SUB]]
|
|
||||||
;
|
;
|
||||||
%absa = call float @llvm.fabs.f32(float %a)
|
%absa = call float @llvm.fabs.f32(float %a)
|
||||||
%sub = call nnan float @llvm.experimental.constrained.fsub.f32(float %absa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
%sub = call nnan float @llvm.experimental.constrained.fsub.f32(float %absa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
||||||
|
@ -209,13 +204,12 @@ define float @fold_fsub_fabs_x_n0_ebstrict(float %a) #0 {
|
||||||
ret float %sub
|
ret float %sub
|
||||||
}
|
}
|
||||||
|
|
||||||
; TODO: This will fold if we allow non-default floating point environments.
|
|
||||||
; TODO: The instruction is expected to remain, but the result isn't used.
|
; TODO: The instruction is expected to remain, but the result isn't used.
|
||||||
define float @fold_fsub_fabs_nnan_x_n0_ebstrict(float %a) #0 {
|
define float @fold_fsub_fabs_nnan_x_n0_ebstrict(float %a) #0 {
|
||||||
; CHECK-LABEL: @fold_fsub_fabs_nnan_x_n0_ebstrict(
|
; CHECK-LABEL: @fold_fsub_fabs_nnan_x_n0_ebstrict(
|
||||||
; CHECK-NEXT: [[ABSA:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
|
; CHECK-NEXT: [[ABSA:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
|
||||||
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[ABSA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
; CHECK-NEXT: [[SUB:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float [[ABSA]], float -0.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||||
; CHECK-NEXT: ret float [[SUB]]
|
; CHECK-NEXT: ret float [[ABSA]]
|
||||||
;
|
;
|
||||||
%absa = call float @llvm.fabs.f32(float %a)
|
%absa = call float @llvm.fabs.f32(float %a)
|
||||||
%sub = call nnan float @llvm.experimental.constrained.fsub.f32(float %absa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
%sub = call nnan float @llvm.experimental.constrained.fsub.f32(float %absa, float -0.0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||||
|
|
Loading…
Reference in New Issue