Skip to content

Commit deb4b25

Browse files
QingShan ZhangJinsong Ji
authored andcommitted
[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
1 parent 2ddf795 commit deb4b25

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5820,15 +5820,17 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
58205820
// Negate the X if its cost is less or equal than Y.
58215821
if (NegX && (CostX <= CostY)) {
58225822
Cost = CostX;
5823+
SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
58235824
RemoveDeadNode(NegY);
5824-
return DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
5825+
return N;
58255826
}
58265827

58275828
// Negate the Y if it is not expensive.
58285829
if (NegY) {
58295830
Cost = CostY;
5831+
SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
58305832
RemoveDeadNode(NegX);
5831-
return DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
5833+
return N;
58325834
}
58335835
break;
58345836
}
@@ -5865,8 +5867,9 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
58655867
// Negate the X if its cost is less or equal than Y.
58665868
if (NegX && (CostX <= CostY)) {
58675869
Cost = CostX;
5870+
SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
58685871
RemoveDeadNode(NegY);
5869-
return DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
5872+
return N;
58705873
}
58715874

58725875
// 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,
58775880
// Negate the Y if it is not expensive.
58785881
if (NegY) {
58795882
Cost = CostY;
5883+
SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
58805884
RemoveDeadNode(NegX);
5881-
return DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
5885+
return N;
58825886
}
58835887
break;
58845888
}
@@ -5907,15 +5911,17 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
59075911
// Negate the X if its cost is less or equal than Y.
59085912
if (NegX && (CostX <= CostY)) {
59095913
Cost = std::min(CostX, CostZ);
5914+
SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
59105915
RemoveDeadNode(NegY);
5911-
return DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
5916+
return N;
59125917
}
59135918

59145919
// Negate the Y if it is not expensive.
59155920
if (NegY) {
59165921
Cost = std::min(CostY, CostZ);
5922+
SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
59175923
RemoveDeadNode(NegX);
5918-
return DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
5924+
return N;
59195925
}
59205926
break;
59215927
}

llvm/test/CodeGen/PowerPC/fneg.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,20 @@ define float @fma_fneg_fsub(float %x, float %y0, float %y1, float %z) {
3939
%r = call float @llvm.fmuladd.f32(float %negx, float %negy, float %z)
4040
ret float %r
4141
}
42+
43+
; Verify that we didn't hit assertion for this case.
44+
define double @fneg_no_ice(float %x) {
45+
; CHECK-LABEL: fneg_no_ice:
46+
; CHECK: # %bb.0:
47+
; CHECK-NEXT: lis r3, .LCPI3_0@ha
48+
; CHECK-NEXT: lfs f0, .LCPI3_0@l(r3)
49+
; CHECK-NEXT: fsubs f0, f0, f1
50+
; CHECK-NEXT: fmul f1, f0, f0
51+
; CHECK-NEXT: fmul f1, f0, f1
52+
; CHECK-NEXT: blr
53+
%y = fsub fast float 1.0, %x
54+
%e = fpext float %y to double
55+
%e2 = fmul double %e, %e
56+
%e3 = fmul double %e, %e2
57+
ret double %e3
58+
}

0 commit comments

Comments
 (0)