summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-10-12 21:59:55 +0000
committerCraig Topper <craig.topper@intel.com>2018-10-12 21:59:55 +0000
commit435e38a5df057385d2e2d6471c330af1bf43306b (patch)
tree49b8a5130d631c25b87737bee8dc3d113ddefd80 /llvm
parentd85038871014e75abe4e1c3a1b419ef19b0d048e (diff)
downloadbcm5719-llvm-435e38a5df057385d2e2d6471c330af1bf43306b.tar.gz
bcm5719-llvm-435e38a5df057385d2e2d6471c330af1bf43306b.zip
[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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp26
-rw-r--r--llvm/test/CodeGen/Mips/cconv/vector.ll24
2 files changed, 24 insertions, 26 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 310f5ef5dc7..f4cad796863 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<SDValue, 16> 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<SDValue, 16> 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 29ffe23f712..d6e260786d1 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
OpenPOWER on IntegriCloud