mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-28 22:00:30 +00:00
[DAGCombine] Don't delete the node if it has uses immediately
This is the follow up patch for https://reviews.llvm.org/D86183 as we miss to delete the node if NegX == NegY, which has use after we create the node. ``` if (NegX && (CostX <= CostY)) { Cost = std::min(CostX, CostZ); RemoveDeadNode(NegY); return DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags); #<-- NegY is used here if NegY == NegX. } ``` Reviewed By: spatel Differential Revision: https://reviews.llvm.org/D86689
This commit is contained in:
parent
38b940febb
commit
8eac4059bb
@ -5820,15 +5820,17 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
|
||||
// Negate the X if its cost is less or equal than Y.
|
||||
if (NegX && (CostX <= CostY)) {
|
||||
Cost = CostX;
|
||||
SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
|
||||
RemoveDeadNode(NegY);
|
||||
return DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
|
||||
return N;
|
||||
}
|
||||
|
||||
// Negate the Y if it is not expensive.
|
||||
if (NegY) {
|
||||
Cost = CostY;
|
||||
SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
|
||||
RemoveDeadNode(NegX);
|
||||
return DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
|
||||
return N;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -5865,8 +5867,9 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
|
||||
// Negate the X if its cost is less or equal than Y.
|
||||
if (NegX && (CostX <= CostY)) {
|
||||
Cost = CostX;
|
||||
SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
|
||||
RemoveDeadNode(NegY);
|
||||
return DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
|
||||
return N;
|
||||
}
|
||||
|
||||
// Ignore X * 2.0 because that is expected to be canonicalized to X + X.
|
||||
@ -5877,8 +5880,9 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
|
||||
// Negate the Y if it is not expensive.
|
||||
if (NegY) {
|
||||
Cost = CostY;
|
||||
SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
|
||||
RemoveDeadNode(NegX);
|
||||
return DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
|
||||
return N;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -5907,15 +5911,17 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
|
||||
// Negate the X if its cost is less or equal than Y.
|
||||
if (NegX && (CostX <= CostY)) {
|
||||
Cost = std::min(CostX, CostZ);
|
||||
SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
|
||||
RemoveDeadNode(NegY);
|
||||
return DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
|
||||
return N;
|
||||
}
|
||||
|
||||
// Negate the Y if it is not expensive.
|
||||
if (NegY) {
|
||||
Cost = std::min(CostY, CostZ);
|
||||
SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
|
||||
RemoveDeadNode(NegX);
|
||||
return DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
|
||||
return N;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -39,3 +39,20 @@ define float @fma_fneg_fsub(float %x, float %y0, float %y1, float %z) {
|
||||
%r = call float @llvm.fmuladd.f32(float %negx, float %negy, float %z)
|
||||
ret float %r
|
||||
}
|
||||
|
||||
; Verify that we didn't hit assertion for this case.
|
||||
define double @fneg_no_ice(float %x) {
|
||||
; CHECK-LABEL: fneg_no_ice:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: lis r3, .LCPI3_0@ha
|
||||
; CHECK-NEXT: lfs f0, .LCPI3_0@l(r3)
|
||||
; CHECK-NEXT: fsubs f0, f0, f1
|
||||
; CHECK-NEXT: fmul f1, f0, f0
|
||||
; CHECK-NEXT: fmul f1, f0, f1
|
||||
; CHECK-NEXT: blr
|
||||
%y = fsub fast float 1.0, %x
|
||||
%e = fpext float %y to double
|
||||
%e2 = fmul double %e, %e
|
||||
%e3 = fmul double %e, %e2
|
||||
ret double %e3
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user