mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
DAGCombiner: don't duplicate (fmul x, c) in visitFNEG if fneg is free
For targets with a free fneg, this fold is always a net loss if it ends up duplicating the multiply, so definitely avoid it. This might be true for some targets without a free fneg too, but I'll leave that for future investigation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239167 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
485adcac20
commit
5a0d6b758c
@ -8781,7 +8781,8 @@ SDValue DAGCombiner::visitFNEG(SDNode *N) {
|
||||
}
|
||||
|
||||
// (fneg (fmul c, x)) -> (fmul -c, x)
|
||||
if (N0.getOpcode() == ISD::FMUL) {
|
||||
if (N0.getOpcode() == ISD::FMUL &&
|
||||
(N0.getNode()->hasOneUse() || !TLI.isFNegFree(VT))) {
|
||||
ConstantFPSDNode *CFP1 = dyn_cast<ConstantFPSDNode>(N0.getOperand(1));
|
||||
if (CFP1) {
|
||||
APFloat CVal = CFP1->getValueAPF();
|
||||
|
@ -73,4 +73,20 @@ define void @test_mul_2_k_inv(float addrspace(1)* %out, float %x) #0 {
|
||||
ret void
|
||||
}
|
||||
|
||||
; There should be three multiplies here; %a should be used twice (once
|
||||
; negated), not duplicated into mul x, 5.0 and mul x, -5.0.
|
||||
; FUNC-LABEL: {{^}}test_mul_twouse:
|
||||
; SI: v_mul_f32
|
||||
; SI: v_mul_f32
|
||||
; SI: v_mul_f32
|
||||
; SI-NOT: v_mul_f32
|
||||
define void @test_mul_twouse(float addrspace(1)* %out, float %x, float %y) #0 {
|
||||
%a = fmul float %x, 5.0
|
||||
%b = fsub float -0.0, %a
|
||||
%c = fmul float %b, %y
|
||||
%d = fmul float %c, %a
|
||||
store float %d, float addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "unsafe-fp-math"="true" }
|
||||
|
Loading…
Reference in New Issue
Block a user