[FPEnv][InstSimplify] Fold fsub -0.0, -X ==> X
Currently the fsub optimizations in InstSimplify don't know how to fold -0.0 - (-X) to X when the constrained intrinsics are used. This adds partial support. The rest of the support will come later with work on the IR matchers. This review is split out from D107285. Differential Revision: https://reviews.llvm.org/D123396
This commit is contained in:
parent
f80e47884c
commit
d43d9e1d5c
|
@ -5207,15 +5207,16 @@ SimplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
|||
(FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI)))
|
||||
return Op0;
|
||||
|
||||
if (!isDefaultFPEnvironment(ExBehavior, Rounding))
|
||||
return nullptr;
|
||||
|
||||
// fsub -0.0, (fsub -0.0, X) ==> X
|
||||
// fsub -0.0, (fneg X) ==> X
|
||||
Value *X;
|
||||
if (match(Op0, m_NegZeroFP()) &&
|
||||
match(Op1, m_FNeg(m_Value(X))))
|
||||
return X;
|
||||
if (canIgnoreSNaN(ExBehavior, FMF))
|
||||
if (match(Op0, m_NegZeroFP()) &&
|
||||
match(Op1, m_FNeg(m_Value(X))))
|
||||
return X;
|
||||
|
||||
if (!isDefaultFPEnvironment(ExBehavior, Rounding))
|
||||
return nullptr;
|
||||
|
||||
// fsub 0.0, (fsub 0.0, X) ==> X if signed zeros are ignored.
|
||||
// fsub 0.0, (fneg X) ==> X if signed zeros are ignored.
|
||||
|
|
|
@ -251,12 +251,9 @@ define float @fsub_fneg_n0_fnX_ebmaytrap(float %a) #0 {
|
|||
ret float %ret
|
||||
}
|
||||
|
||||
; TODO: This will fold if we allow non-default floating point environments.
|
||||
define float @fsub_fneg_nnan_n0_fnX_ebmaytrap(float %a) #0 {
|
||||
; CHECK-LABEL: @fsub_fneg_nnan_n0_fnX_ebmaytrap(
|
||||
; CHECK-NEXT: [[NEGA:%.*]] = fneg float [[A:%.*]]
|
||||
; CHECK-NEXT: [[RET:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float -0.000000e+00, float [[NEGA]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[RET]]
|
||||
; CHECK-NEXT: ret float [[A:%.*]]
|
||||
;
|
||||
%nega = fneg float %a
|
||||
%ret = call nnan float @llvm.experimental.constrained.fsub.f32(float -0.0, float %nega, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
|
||||
|
@ -275,13 +272,12 @@ define float @fsub_fneg_n0_fnX_ebstrict(float %a) #0 {
|
|||
ret float %ret
|
||||
}
|
||||
|
||||
; 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.
|
||||
; NOTE: The instruction is expected to remain, but the result isn't used.
|
||||
define float @fsub_fneg_nnan_n0_fnX_ebstrict(float %a) #0 {
|
||||
; CHECK-LABEL: @fsub_fneg_nnan_n0_fnX_ebstrict(
|
||||
; CHECK-NEXT: [[NEGA:%.*]] = fneg float [[A:%.*]]
|
||||
; CHECK-NEXT: [[RET:%.*]] = call nnan float @llvm.experimental.constrained.fsub.f32(float -0.000000e+00, float [[NEGA]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
|
||||
; CHECK-NEXT: ret float [[RET]]
|
||||
; CHECK-NEXT: ret float [[A]]
|
||||
;
|
||||
%nega = fneg float %a
|
||||
%ret = call nnan float @llvm.experimental.constrained.fsub.f32(float -0.0, float %nega, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
|
||||
|
|
Loading…
Reference in a new issue