[llvm] deb4b25 - [DAGCombine] Don't delete the node if it has uses immediately
Jinsong Ji via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 28 09:13:57 PDT 2020
Author: QingShan Zhang
Date: 2020-08-28T16:13:43Z
New Revision: deb4b2580715810ecd5cb7eefa5ffbe65e5eedc8
URL: https://github.com/llvm/llvm-project/commit/deb4b2580715810ecd5cb7eefa5ffbe65e5eedc8
DIFF: https://github.com/llvm/llvm-project/commit/deb4b2580715810ecd5cb7eefa5ffbe65e5eedc8.diff
LOG: [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
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/PowerPC/fneg.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 559bdbe9da20..310c28f81968 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -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;
}
diff --git a/llvm/test/CodeGen/PowerPC/fneg.ll b/llvm/test/CodeGen/PowerPC/fneg.ll
index 328ffecd1762..aea34e216d64 100644
--- a/llvm/test/CodeGen/PowerPC/fneg.ll
+++ b/llvm/test/CodeGen/PowerPC/fneg.ll
@@ -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 at ha
+; CHECK-NEXT: lfs f0, .LCPI3_0 at 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
+}
More information about the llvm-commits
mailing list