diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-01-12 00:32:16 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-01-12 00:32:16 +0000 |
commit | 63f953795e05cbfe30125be6c0bcf7beb94099c5 (patch) | |
tree | d5458b855393599a85fcb8ba341a073052556c0a /llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp | |
parent | 4103a81d6d5caecd7e65d8d616963e3160b62c10 (diff) | |
download | bcm5719-llvm-63f953795e05cbfe30125be6c0bcf7beb94099c5.tar.gz bcm5719-llvm-63f953795e05cbfe30125be6c0bcf7beb94099c5.zip |
AMDGPU: Fold fneg into fma or fmad
Patch mostly by Fiona Glaser
llvm-svn: 291733
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp index 6973c7593ba..94953440eeb 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp @@ -2875,6 +2875,30 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N, DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res)); return Res; } + case ISD::FMA: + case ISD::FMAD: { + // (fneg (fma x, y, z)) -> (fma x, (fneg y), (fneg z)) + SDValue LHS = N0.getOperand(0); + SDValue MHS = N0.getOperand(1); + SDValue RHS = N0.getOperand(2); + + if (LHS.getOpcode() == ISD::FNEG) + LHS = LHS.getOperand(0); + else if (MHS.getOpcode() == ISD::FNEG) + MHS = MHS.getOperand(0); + else + MHS = DAG.getNode(ISD::FNEG, SL, VT, MHS); + + if (RHS.getOpcode() != ISD::FNEG) + RHS = DAG.getNode(ISD::FNEG, SL, VT, RHS); + else + RHS = RHS.getOperand(0); + + SDValue Res = DAG.getNode(Opc, SL, VT, LHS, MHS, RHS); + if (!N0.hasOneUse()) + DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res)); + return Res; + } default: return SDValue(); } |