Revise my previous change 68996 as suggested by Duncan.
authorBob Wilson <bob.wilson@apple.com>
Mon, 20 Apr 2009 17:27:09 +0000 (17:27 +0000)
committerBob Wilson <bob.wilson@apple.com>
Mon, 20 Apr 2009 17:27:09 +0000 (17:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69607 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 56706689fd6b68484cfab90b7165b563b247eeaa..aaa39674d780f751a98d754d503e70c78677cf67 100644 (file)
@@ -288,13 +288,12 @@ namespace ISD {
     // value as an integer 0/1 value.
     FGETSIGN,
 
-    /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a vector
-    /// with the specified, possibly variable, elements.  The number of elements
-    /// is required to be a power of two.  The types of the operands must
-    /// all be the same.  They must match the vector element type, except if an 
-    /// integer element type is not legal for the target, the operands may 
-    /// be promoted to a legal type, in which case the operands are implicitly
-    /// truncated to the vector element types.
+    /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a vector with the
+    /// specified, possibly variable, elements.  The number of elements is
+    /// required to be a power of two.  The types of the operands must all be
+    /// the same and must match the vector element type, except that integer
+    /// types are allowed to be larger than the element type, in which case
+    /// the operands are implicitly truncated.
     BUILD_VECTOR,
 
     /// INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element
index d1ef0815c810945b0c831bc996607ec57aae3f01..72b3e3627ed53133104d703c13d81b3a83fca66c 100644 (file)
@@ -3811,12 +3811,8 @@ ConstantFoldBIT_CONVERTofBUILD_VECTOR(SDNode *BV, MVT DstEltVT) {
       SDValue Op = BV->getOperand(i);
       // If the vector element type is not legal, the BUILD_VECTOR operands
       // are promoted and implicitly truncated.  Make that explicit here.
-      if (Op.getValueType() != SrcEltVT) {
-        if (Op.getOpcode() == ISD::UNDEF)
-          Op = DAG.getUNDEF(SrcEltVT);
-        else
-          Op = DAG.getNode(ISD::TRUNCATE, BV->getDebugLoc(), SrcEltVT, Op);
-      }
+      if (Op.getValueType() != SrcEltVT)
+        Op = DAG.getNode(ISD::TRUNCATE, BV->getDebugLoc(), SrcEltVT, Op);
       Ops.push_back(DAG.getNode(ISD::BIT_CONVERT, BV->getDebugLoc(),
                                 DstEltVT, Op));
       AddToWorkList(Ops.back().getNode());
index 2dfe0e3b7de2e3d0da0fb058956108793ce056de..b2581131f9fc1eb1667f378c1329c573bdf593a9 100644 (file)
@@ -808,9 +808,8 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
          "Type of inserted value narrower than vector element type!");
 
   SmallVector<SDValue, 16> NewOps;
-  for (unsigned i = 0; i < NumElts; ++i) {
+  for (unsigned i = 0; i < NumElts; ++i)
     NewOps.push_back(GetPromotedInteger(N->getOperand(i)));
-  }
 
   return DAG.UpdateNodeOperands(SDValue(N, 0), &NewOps[0], NumElts);
 }
index be0102c846ade619b86d2ae1063664c2710a6a13..33103cb9be56217456323c2bd493fee3d676d537 100644 (file)
@@ -2556,7 +2556,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, MVT VT,
       if (Elt.getValueType() != VT) {
         // If the vector element type is not legal, the BUILD_VECTOR operands
         // are promoted and implicitly truncated.  Make that explicit here.
-        assert(Elt.getValueType() == TLI.getTypeToTransformTo(VT) &&
+        assert(VT.isInteger() && Elt.getValueType().isInteger() &&
+               VT.bitsLE(Elt.getValueType()) &&
                "Bad type for BUILD_VECTOR operand");
         Elt = getNode(ISD::TRUNCATE, DL, VT, Elt);
       }