From 435e38a5df057385d2e2d6471c330af1bf43306b Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 12 Oct 2018 21:59:55 +0000 Subject: [PATCH] [LegalizeVectorTypes] When widening the result of a bitcast from a scalar type, use a scalar_to_vector to turn the scalar into a vector intead of a build vector full of mostly undefs. This is more consistent with what we usually do and matches some code X86 custom emits in some cases that I think I can cleanup. The MIPS test change just looks to be an instruction ordering change. llvm-svn: 344422 --- .../CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 26 ++++++++++------------ llvm/test/CodeGen/Mips/cconv/vector.ll | 24 ++++++++++---------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 310f5ef..f4cad79 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -3022,22 +3022,20 @@ SDValue DAGTypeLegalizer::WidenVecRes_BITCAST(SDNode *N) { } if (TLI.isTypeLegal(NewInVT)) { - // Because the result and the input are different vector types, widening - // the result could create a legal type but widening the input might make - // it an illegal type that might lead to repeatedly splitting the input - // and then widening it. To avoid this, we widen the input only if - // it results in a legal type. - SmallVector Ops(NewNumElts); - SDValue UndefVal = DAG.getUNDEF(InVT); - Ops[0] = InOp; - for (unsigned i = 1; i < NewNumElts; ++i) - Ops[i] = UndefVal; - SDValue NewVec; - if (InVT.isVector()) + if (InVT.isVector()) { + // Because the result and the input are different vector types, widening + // the result could create a legal type but widening the input might make + // it an illegal type that might lead to repeatedly splitting the input + // and then widening it. To avoid this, we widen the input only if + // it results in a legal type. + SmallVector Ops(NewNumElts, DAG.getUNDEF(InVT)); + Ops[0] = InOp; + NewVec = DAG.getNode(ISD::CONCAT_VECTORS, dl, NewInVT, Ops); - else - NewVec = DAG.getBuildVector(NewInVT, dl, Ops); + } else { + NewVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, NewInVT, InOp); + } return DAG.getNode(ISD::BITCAST, dl, WidenVT, NewVec); } } diff --git a/llvm/test/CodeGen/Mips/cconv/vector.ll b/llvm/test/CodeGen/Mips/cconv/vector.ll index 29ffe23..d6e2607 100644 --- a/llvm/test/CodeGen/Mips/cconv/vector.ll +++ b/llvm/test/CodeGen/Mips/cconv/vector.ll @@ -2420,10 +2420,10 @@ define void @float_2(<2 x float> %a, <2 x float> %b) { ; MIPS64R5EB-NEXT: lui $1, %hi(%neg(%gp_rel(float_2))) ; MIPS64R5EB-NEXT: daddu $1, $1, $25 ; MIPS64R5EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(float_2))) -; MIPS64R5EB-NEXT: sd $5, 0($sp) -; MIPS64R5EB-NEXT: sd $4, 16($sp) -; MIPS64R5EB-NEXT: ld.w $w0, 0($sp) -; MIPS64R5EB-NEXT: ld.w $w1, 16($sp) +; MIPS64R5EB-NEXT: sd $5, 16($sp) +; MIPS64R5EB-NEXT: sd $4, 0($sp) +; MIPS64R5EB-NEXT: ld.w $w0, 16($sp) +; MIPS64R5EB-NEXT: ld.w $w1, 0($sp) ; MIPS64R5EB-NEXT: fadd.w $w0, $w1, $w0 ; MIPS64R5EB-NEXT: shf.w $w0, $w0, 177 ; MIPS64R5EB-NEXT: copy_s.d $2, $w0[0] @@ -2463,10 +2463,10 @@ define void @float_2(<2 x float> %a, <2 x float> %b) { ; MIPS64R5EL-NEXT: lui $1, %hi(%neg(%gp_rel(float_2))) ; MIPS64R5EL-NEXT: daddu $1, $1, $25 ; MIPS64R5EL-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(float_2))) -; MIPS64R5EL-NEXT: sd $5, 0($sp) -; MIPS64R5EL-NEXT: sd $4, 16($sp) -; MIPS64R5EL-NEXT: ld.w $w0, 0($sp) -; MIPS64R5EL-NEXT: ld.w $w1, 16($sp) +; MIPS64R5EL-NEXT: sd $5, 16($sp) +; MIPS64R5EL-NEXT: sd $4, 0($sp) +; MIPS64R5EL-NEXT: ld.w $w0, 16($sp) +; MIPS64R5EL-NEXT: ld.w $w1, 0($sp) ; MIPS64R5EL-NEXT: fadd.w $w0, $w1, $w0 ; MIPS64R5EL-NEXT: copy_s.d $2, $w0[0] ; MIPS64R5EL-NEXT: ld $1, %got_disp(float_res_v2f32)($1) @@ -6211,14 +6211,14 @@ define float @mixed_i8(<2 x float> %a, i8 %b, <2 x float> %c) { ; MIPS64R5-NEXT: andi $1, $1, 255 ; MIPS64R5-NEXT: sw $1, 36($sp) ; MIPS64R5-NEXT: sw $1, 32($sp) -; MIPS64R5-NEXT: sd $4, 16($sp) +; MIPS64R5-NEXT: sd $4, 0($sp) ; MIPS64R5-NEXT: ld.w $w0, 32($sp) ; MIPS64R5-NEXT: ffint_s.w $w0, $w0 -; MIPS64R5-NEXT: ld.w $w1, 16($sp) -; MIPS64R5-NEXT: fadd.w $w0, $w0, $w1 -; MIPS64R5-NEXT: sd $6, 0($sp) ; MIPS64R5-NEXT: ld.w $w1, 0($sp) ; MIPS64R5-NEXT: fadd.w $w0, $w0, $w1 +; MIPS64R5-NEXT: sd $6, 16($sp) +; MIPS64R5-NEXT: ld.w $w1, 16($sp) +; MIPS64R5-NEXT: fadd.w $w0, $w0, $w1 ; MIPS64R5-NEXT: splati.w $w1, $w0[1] ; MIPS64R5-NEXT: add.s $f0, $f0, $f1 ; MIPS64R5-NEXT: daddiu $sp, $sp, 48 -- 2.7.4