mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
Fix issues with ISD::FNEG and ISD::FMA SDNodes where they would not be constant-folded
during DAGCombine in certain circumstances. Unfortunately, the circumstances required to trigger the issue seem to require a pretty specific interaction of DAGCombines, and I haven't been able to find a testcase that reproduces on X86, ARM, or AArch64. The functionality added here is replicated in essentially every other DAG combine, so it seems pretty obviously correct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214622 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
61e99f1b80
commit
ec6d4d8afb
@ -6893,6 +6893,14 @@ SDValue DAGCombiner::visitFMA(SDNode *N) {
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc dl(N);
|
||||
|
||||
|
||||
// Constant fold FMA.
|
||||
if (isa<ConstantFPSDNode>(N0) &&
|
||||
isa<ConstantFPSDNode>(N1) &&
|
||||
isa<ConstantFPSDNode>(N2)) {
|
||||
return DAG.getNode(ISD::FMA, dl, VT, N0, N1, N2);
|
||||
}
|
||||
|
||||
if (DAG.getTarget().Options.UnsafeFPMath) {
|
||||
if (N0CFP && N0CFP->isZero())
|
||||
return N2;
|
||||
@ -7293,6 +7301,10 @@ SDValue DAGCombiner::visitFNEG(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
|
||||
// Constant fold FNEG.
|
||||
if (isa<ConstantFPSDNode>(N0))
|
||||
return DAG.getNode(ISD::FNEG, SDLoc(N), VT, N->getOperand(0));
|
||||
|
||||
if (VT.isVector()) {
|
||||
SDValue FoldedVOp = SimplifyVUnaryOp(N);
|
||||
if (FoldedVOp.getNode()) return FoldedVOp;
|
||||
|
Loading…
x
Reference in New Issue
Block a user