summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-12-14 08:25:58 +0000
committerCraig Topper <craig.topper@intel.com>2017-12-14 08:25:58 +0000
commiteab2d4665fdb6a28664c6936d58adc6b35796db1 (patch)
tree231e6e3bab5b6b848067ff49d9ee3607931da46b /llvm/lib/CodeGen
parent271a5c72a0f43f8da540800dba016f5d1337c997 (diff)
downloadbcm5719-llvm-eab2d4665fdb6a28664c6936d58adc6b35796db1.tar.gz
bcm5719-llvm-eab2d4665fdb6a28664c6936d58adc6b35796db1.zip
[SelectionDAG][X86] Improve legalization of v32i1 CONCAT_VECTORS of v16i1 for AVX512F.
A v32i1 CONCAT_VECTORS of v16i1 uses promotion to v32i8 to legalize the v32i1. This results in a bunch of extract_vector_elts and a build_vector that ultimately gets scalarized. This patch checks to see if v16i8 is legal and inserts a any_extend to that so that we can concat v16i8 to v32i8 and avoid creating the extracts. llvm-svn: 320674
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 8db0d043dd1..29f0bb475b0 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -3497,6 +3497,21 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) {
assert(NumElem * NumOperands == NumOutElem &&
"Unexpected number of elements");
+ // If the input type is legal and we can promote it to a legal type with the
+ // same element size, go ahead do that to create a new concat.
+ if (getTypeAction(N->getOperand(0).getValueType()) ==
+ TargetLowering::TypeLegal) {
+ EVT InPromotedTy = EVT::getVectorVT(*DAG.getContext(), OutElemTy, NumElem);
+ if (TLI.isTypeLegal(InPromotedTy)) {
+ SmallVector<SDValue, 8> Ops(NumOperands);
+ for (unsigned i = 0; i < NumOperands; ++i) {
+ Ops[i] = DAG.getNode(ISD::ANY_EXTEND, dl, InPromotedTy,
+ N->getOperand(i));
+ }
+ return DAG.getNode(ISD::CONCAT_VECTORS, dl, NOutVT, Ops);
+ }
+ }
+
// Take the elements from the first vector.
SmallVector<SDValue, 8> Ops(NumOutElem);
for (unsigned i = 0; i < NumOperands; ++i) {
OpenPOWER on IntegriCloud