Allow SelectionDAG::FoldConstantArithmetic to work when it's called with a vector...
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 2 May 2014 12:35:22 +0000 (12:35 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 2 May 2014 12:35:22 +0000 (12:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207835 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/X86/vector-idiv.ll

index bf311226cd95948d120504a9d45905d2f1f77530..7058c4e95ae64996b8731938cfb8a72651bd9a43 100644 (file)
@@ -2924,11 +2924,17 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, EVT VT,
     }
   }
 
+  assert((Scalar1 && Scalar2) ||
+         VT.getVectorNumElements() == Outputs.size() && "No scalar or vector!");
+
   // Handle the scalar case first.
-  if (Scalar1 && Scalar2)
+  if (!VT.isVector())
     return Outputs.back();
 
-  // Otherwise build a big vector out of the scalar elements we generated.
+  // We may have a vector type but a scalar result. Create a splat.
+  Outputs.resize(VT.getVectorNumElements(), Outputs.back());
+
+  // Build a big vector out of the scalar elements we generated.
   return getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Outputs);
 }
 
index 5738c94e37bbc881614fb2735d272fa27d290b29..4c30184a5426b7a58c7f21c80808e525be5af5e8 100644 (file)
@@ -205,3 +205,13 @@ define <8 x i32> @test11(<8 x i32> %a) {
 ; AVX: vpadd
 ; AVX: vpmulld
 }
+
+define <2 x i16> @test12() {
+  %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
+  %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
+  %B9 = urem <2 x i16> %I9, %I9
+  ret <2 x i16> %B9
+
+; AVX-LABEL: test12:
+; AVX: xorps
+}