AMDGPU: Remove custom BUILD_VECTOR combine

This was looping in a testcase and removing it
now slightly improves a test.

llvm-svn: 345560
This commit is contained in:
Matt Arsenault 2018-10-30 01:37:59 +00:00
parent b0b741efb8
commit abc4f29f9c
4 changed files with 33 additions and 52 deletions

View File

@ -679,7 +679,6 @@ SITargetLowering::SITargetLowering(const TargetMachine &TM,
setTargetDAGCombine(ISD::SCALAR_TO_VECTOR);
setTargetDAGCombine(ISD::ZERO_EXTEND);
setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
setTargetDAGCombine(ISD::BUILD_VECTOR);
// All memory operations. Some folding on the pointer operand is done to help
// matching the constant offsets in the addressing modes.
@ -8133,48 +8132,6 @@ SDValue SITargetLowering::performExtractVectorEltCombine(
return SDValue();
}
static bool convertBuildVectorCastElt(SelectionDAG &DAG,
SDValue &Lo, SDValue &Hi) {
if (Hi.getOpcode() == ISD::BITCAST &&
Hi.getOperand(0).getValueType() == MVT::f16 &&
(isa<ConstantSDNode>(Lo) || Lo.isUndef())) {
Lo = DAG.getNode(ISD::BITCAST, SDLoc(Lo), MVT::f16, Lo);
Hi = Hi.getOperand(0);
return true;
}
return false;
}
SDValue SITargetLowering::performBuildVectorCombine(
SDNode *N, DAGCombinerInfo &DCI) const {
SDLoc SL(N);
if (!isTypeLegal(MVT::v2i16))
return SDValue();
SelectionDAG &DAG = DCI.DAG;
EVT VT = N->getValueType(0);
if (VT == MVT::v2i16) {
SDValue Lo = N->getOperand(0);
SDValue Hi = N->getOperand(1);
// v2i16 build_vector (const|undef), (bitcast f16:$x)
// -> bitcast (v2f16 build_vector const|undef, $x
if (convertBuildVectorCastElt(DAG, Lo, Hi)) {
SDValue NewVec = DAG.getBuildVector(MVT::v2f16, SL, { Lo, Hi });
return DAG.getNode(ISD::BITCAST, SL, VT, NewVec);
}
if (convertBuildVectorCastElt(DAG, Hi, Lo)) {
SDValue NewVec = DAG.getBuildVector(MVT::v2f16, SL, { Hi, Lo });
return DAG.getNode(ISD::BITCAST, SL, VT, NewVec);
}
}
return SDValue();
}
unsigned SITargetLowering::getFusedOpcode(const SelectionDAG &DAG,
const SDNode *N0,
const SDNode *N1) const {
@ -8783,8 +8740,6 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
}
case ISD::EXTRACT_VECTOR_ELT:
return performExtractVectorEltCombine(N, DCI);
case ISD::BUILD_VECTOR:
return performBuildVectorCombine(N, DCI);
}
return AMDGPUTargetLowering::PerformDAGCombine(N, DCI);
}

View File

@ -154,7 +154,6 @@ private:
SDValue performFMed3Combine(SDNode *N, DAGCombinerInfo &DCI) const;
SDValue performCvtPkRTZCombine(SDNode *N, DAGCombinerInfo &DCI) const;
SDValue performExtractVectorEltCombine(SDNode *N, DAGCombinerInfo &DCI) const;
SDValue performBuildVectorCombine(SDNode *N, DAGCombinerInfo &DCI) const;
unsigned getFusedOpcode(const SelectionDAG &DAG,
const SDNode *N0, const SDNode *N1) const;

View File

@ -0,0 +1,27 @@
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
; There was an infinite loop in DAGCombiner from a target build_vector
; combine and a generic insert_vector_elt combine.
; GCN-LABEL: {{^}}combine_loop:
; GCN: flat_load_ushort
; GCN: flat_store_short
; GCN: v_lshlrev_b32_e32 v{{[0-9]+}}, 16,
define amdgpu_kernel void @combine_loop(i16* %arg) #0 {
bb:
br label %bb1
bb1:
%tmp = phi <2 x i16> [ <i16 15360, i16 15360>, %bb ], [ %tmp5, %bb1 ]
%tmp2 = phi half [ 0xH0000, %bb ], [ %tmp8, %bb1 ]
%tmp3 = load volatile half, half* null, align 536870912
%tmp4 = bitcast half %tmp3 to i16
%tmp5 = insertelement <2 x i16> <i16 0, i16 undef>, i16 %tmp4, i32 1
%tmp6 = bitcast i16* %arg to half*
store half %tmp2, half* %tmp6, align 2
%tmp7 = bitcast <2 x i16> %tmp to <2 x half>
%tmp8 = extractelement <2 x half> %tmp7, i32 0
br label %bb1
}
attributes #0 = { nounwind }

View File

@ -49,9 +49,9 @@ define <2 x half> @v_mad_mixhi_f16_f16lo_f16lo_f16lo_reglo(half %src0, half %src
}
; GCN-LABEL: {{^}}v_mad_mixhi_f16_f16lo_f16lo_f16lo_intpack:
; GFX9: v_mov_b32_e32 v3, 0
; GFX9-NEXT: v_mad_mixhi_f16 v3, v0, v1, v2
; GFX9-NEXT: v_mov_b32_e32 v0, v3
; GFX9: s_waitcnt
; GFX9-NEXT: v_mad_mixlo_f16 v0, v0, v1, v2 op_sel_hi:[1,1,1]
; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0
; GFX9-NEXT: s_setpc_b64
define i32 @v_mad_mixhi_f16_f16lo_f16lo_f16lo_intpack(half %src0, half %src1, half %src2) #0 {
%src0.ext = fpext half %src0 to float
@ -66,9 +66,9 @@ define i32 @v_mad_mixhi_f16_f16lo_f16lo_f16lo_intpack(half %src0, half %src1, ha
}
; GCN-LABEL: {{^}}v_mad_mixhi_f16_f16lo_f16lo_f16lo_intpack_sext:
; GFX9: v_mov_b32_e32 v3, 0
; GFX9-NEXT: v_mad_mixhi_f16 v3, v0, v1, v2
; GFX9-NEXT: v_mov_b32_e32 v0, v3
; GFX9: s_waitcnt
; GFX9-NEXT: v_mad_mixlo_f16 v0, v0, v1, v2 op_sel_hi:[1,1,1]
; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0
; GFX9-NEXT: s_setpc_b64
define i32 @v_mad_mixhi_f16_f16lo_f16lo_f16lo_intpack_sext(half %src0, half %src1, half %src2) #0 {
%src0.ext = fpext half %src0 to float