[SelectionDAG] Fixed constant folding issue when legalised types are smaller then...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 10 May 2015 14:14:51 +0000 (14:14 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 10 May 2015 14:14:51 +0000 (14:14 +0000)
Found when testing with llvm-stress on i686 targets.

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

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 1d8cdb60c92d4464b878fdd70d04b81734dc9671..73fe1990711025ad9be9195f5a81a432b49da20f 100644 (file)
@@ -2872,11 +2872,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,
         EVT InVT = BV->getValueType(0);
         EVT InSVT = InVT.getScalarType();
 
-        // Find legal integer scalar type for constant promotion.
+        // Find legal integer scalar type for constant promotion and
+        // ensure that its scalar size is at least as large as source.
         EVT LegalSVT = SVT;
         if (SVT.isInteger()) {
           LegalSVT = TLI->getTypeToTransformTo(*getContext(), SVT);
-          assert(LegalSVT.bitsGE(SVT) && "Unexpected legal scalar type size");
+          if (LegalSVT.bitsLT(SVT)) break;
         }
 
         // Let the above scalar folding handle the folding of each element.