Skip to content

Commit 7c55c8d

Browse files
author
Tim Renouf
committedApr 18, 2019
[AMDGPU] Avoid DAG combining assert with fneg(fadd(A,0))
fneg combining attempts to turn it into fadd(fneg(A), fneg(0)), but creating the new fadd folds to just fneg(A). When A has multiple uses, this confuses it and you get an assert. Fixed. Differential Revision: https://reviews.llvm.org/D60633 Change-Id: I0ddc9b7286abe78edc0cd8d734fdeb05ff09821c llvm-svn: 358640
1 parent 6263365 commit 7c55c8d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed
 

‎llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -3692,6 +3692,8 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
36923692
RHS = RHS.getOperand(0);
36933693

36943694
SDValue Res = DAG.getNode(ISD::FADD, SL, VT, LHS, RHS, N0->getFlags());
3695+
if (Res.getOpcode() != ISD::FADD)
3696+
return SDValue(); // Op got folded away.
36953697
if (!N0.hasOneUse())
36963698
DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res));
36973699
return Res;
@@ -3711,6 +3713,8 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
37113713
RHS = DAG.getNode(ISD::FNEG, SL, VT, RHS);
37123714

37133715
SDValue Res = DAG.getNode(Opc, SL, VT, LHS, RHS, N0->getFlags());
3716+
if (Res.getOpcode() != Opc)
3717+
return SDValue(); // Op got folded away.
37143718
if (!N0.hasOneUse())
37153719
DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res));
37163720
return Res;
@@ -3738,6 +3742,8 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
37383742
RHS = RHS.getOperand(0);
37393743

37403744
SDValue Res = DAG.getNode(Opc, SL, VT, LHS, MHS, RHS);
3745+
if (Res.getOpcode() != Opc)
3746+
return SDValue(); // Op got folded away.
37413747
if (!N0.hasOneUse())
37423748
DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res));
37433749
return Res;
@@ -3766,6 +3772,8 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
37663772
unsigned Opposite = inverseMinMax(Opc);
37673773

37683774
SDValue Res = DAG.getNode(Opposite, SL, VT, NegLHS, NegRHS, N0->getFlags());
3775+
if (Res.getOpcode() != Opposite)
3776+
return SDValue(); // Op got folded away.
37693777
if (!N0.hasOneUse())
37703778
DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res));
37713779
return Res;
@@ -3776,6 +3784,8 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
37763784
Ops[I] = DAG.getNode(ISD::FNEG, SL, VT, N0->getOperand(I), N0->getFlags());
37773785

37783786
SDValue Res = DAG.getNode(AMDGPUISD::FMED3, SL, VT, Ops, N0->getFlags());
3787+
if (Res.getOpcode() != AMDGPUISD::FMED3)
3788+
return SDValue(); // Op got folded away.
37793789
if (!N0.hasOneUse())
37803790
DAG.ReplaceAllUsesWith(N0, DAG.getNode(ISD::FNEG, SL, VT, Res));
37813791
return Res;

‎llvm/test/CodeGen/AMDGPU/fneg-combines.ll

+22
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,28 @@ define amdgpu_kernel void @v_fneg_add_multi_use_fneg_x_f32(float addrspace(1)* %
214214
ret void
215215
}
216216

217+
; This one asserted with -enable-no-signed-zeros-fp-math
218+
; GCN-LABEL: {{^}}fneg_fadd_0:
219+
; GCN-SAFE-DAG: v_mad_f32 [[A:v[0-9]+]],
220+
; GCN-SAFE-DAG: v_xor_b32_e32 [[B:v[0-9]+]], 0x80000000
221+
; GCN-SAFE-DAG: v_cmp_ngt_f32_e32 {{.*}}, [[A]]
222+
; GCN-NSZ-DAG: v_mac_f32_e32 [[C:v[0-9]+]],
223+
; GCN-NSZ-DAG: v_cmp_nlt_f32_e64 {{.*}}, -[[C]]
224+
225+
define amdgpu_ps float @fneg_fadd_0(float inreg %tmp2, float inreg %tmp6, <4 x i32> %arg) local_unnamed_addr #0 {
226+
.entry:
227+
%tmp7 = fdiv float 1.000000e+00, %tmp6
228+
%tmp8 = fmul float 0.000000e+00, %tmp7
229+
%tmp9 = fmul reassoc nnan arcp contract float 0.000000e+00, %tmp8
230+
%.i188 = fadd float %tmp9, 0.000000e+00
231+
%tmp10 = fcmp uge float %.i188, %tmp2
232+
%tmp11 = fsub float -0.000000e+00, %.i188
233+
%.i092 = select i1 %tmp10, float %tmp2, float %tmp11
234+
%tmp12 = fcmp ule float %.i092, 0.000000e+00
235+
%.i198 = select i1 %tmp12, float 0.000000e+00, float 0x7FF8000000000000
236+
ret float %.i198
237+
}
238+
217239
; --------------------------------------------------------------------------------
218240
; fmul tests
219241
; --------------------------------------------------------------------------------

0 commit comments

Comments
 (0)
Please sign in to comment.