mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
DAGCombine: prevent formation of illegal ConstantFP nodes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207850 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3cddd1607c
commit
b20252764d
@ -7181,11 +7181,16 @@ SDValue DAGCombiner::visitFNEG(SDNode *N) {
|
||||
// (fneg (fmul c, x)) -> (fmul -c, x)
|
||||
if (N0.getOpcode() == ISD::FMUL) {
|
||||
ConstantFPSDNode *CFP1 = dyn_cast<ConstantFPSDNode>(N0.getOperand(1));
|
||||
if (CFP1)
|
||||
return DAG.getNode(ISD::FMUL, SDLoc(N), VT,
|
||||
N0.getOperand(0),
|
||||
DAG.getNode(ISD::FNEG, SDLoc(N), VT,
|
||||
N0.getOperand(1)));
|
||||
if (CFP1) {
|
||||
APFloat CVal = CFP1->getValueAPF();
|
||||
CVal.changeSign();
|
||||
if (Level >= AfterLegalizeDAG &&
|
||||
(TLI.isFPImmLegal(CVal, N->getValueType(0)) ||
|
||||
TLI.isOperationLegal(ISD::ConstantFP, N->getValueType(0))))
|
||||
return DAG.getNode(
|
||||
ISD::FMUL, SDLoc(N), VT, N0.getOperand(0),
|
||||
DAG.getNode(ISD::FNEG, SDLoc(N), VT, N0.getOperand(1)));
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
|
14
test/CodeGen/ARM64/fp-contract-zero.ll
Normal file
14
test/CodeGen/ARM64/fp-contract-zero.ll
Normal file
@ -0,0 +1,14 @@
|
||||
; RUN: llc -mtriple=arm64 -fp-contract=fast -o - %s | FileCheck %s
|
||||
|
||||
|
||||
; Make sure we don't try to fold an fneg into +0.0, creating an illegal constant
|
||||
; -0.0. It's also good, though not essential, that we don't resort to a litpool.
|
||||
define double @test_fms_fold(double %a, double %b) {
|
||||
; CHECK-LABEL: test_fms_fold:
|
||||
; CHECK: fmov {{d[0-9]+}}, xzr
|
||||
; CHECK: ret
|
||||
%mul = fmul double %a, 0.000000e+00
|
||||
%mul1 = fmul double %b, 0.000000e+00
|
||||
%sub = fsub double %mul, %mul1
|
||||
ret double %sub
|
||||
}
|
Loading…
Reference in New Issue
Block a user