According to the docs, it is possible to have an
authorDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:27:46 +0000 (17:27 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:27:46 +0000 (17:27 +0000)
extending load of a vector.  Handle this case when
splitting vector loads.  I'm not completely sure
what is supposed to happen, but I think it means
hi should be set to undef.  LegalizeDAG does not
consider this case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53555 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

index a5a0331ba3a7f53f5484356693af6b919a9f7411..71fa7925c0245d1f1e853a575620edc2479fe1a2 100644 (file)
@@ -304,21 +304,29 @@ void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDOperand &Lo,
   bool isVolatile = LD->isVolatile();
 
   Lo = DAG.getLoad(LoVT, Ch, Ptr, SV, SVOffset, isVolatile, Alignment);
-  unsigned IncrementSize = LoVT.getSizeInBits()/8;
-  Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
-                    DAG.getIntPtrConstant(IncrementSize));
-  SVOffset += IncrementSize;
-  Alignment = MinAlign(Alignment, IncrementSize);
-  Hi = DAG.getLoad(HiVT, Ch, Ptr, SV, SVOffset, isVolatile, Alignment);
 
-  // Build a factor node to remember that this load is independent of the
-  // other one.
-  SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
-                             Hi.getValue(1));
+  if (LD->getExtensionType() == ISD::NON_EXTLOAD) {
+    unsigned IncrementSize = LoVT.getSizeInBits()/8;
+    Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
+                      DAG.getIntPtrConstant(IncrementSize));
+    SVOffset += IncrementSize;
+    Alignment = MinAlign(Alignment, IncrementSize);
+    Hi = DAG.getLoad(HiVT, Ch, Ptr, SV, SVOffset, isVolatile, Alignment);
+
+    // Build a factor node to remember that this load is independent of the
+    // other one.
+    Ch = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
+                     Hi.getValue(1));
+  } else {
+    assert(LD->getExtensionType() == ISD::EXTLOAD &&
+           "Unsupported vector extending load!");
+    Hi = DAG.getNode(ISD::UNDEF, HiVT);
+    Ch = Lo.getValue(1);
+  }
 
   // Legalized the chain result - switch anything that used the old chain to
   // use the new one.
-  ReplaceValueWith(SDOperand(LD, 1), TF);
+  ReplaceValueWith(SDOperand(LD, 1), Ch);
 }
 
 void DAGTypeLegalizer::SplitVecRes_BUILD_PAIR(SDNode *N, SDOperand &Lo,