Fix a bug in getCopyFromParts turned up in the testcase for PR1132.
authorDan Gohman <gohman@apple.com>
Mon, 30 Jul 2007 19:09:17 +0000 (19:09 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 30 Jul 2007 19:09:17 +0000 (19:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40598 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
test/CodeGen/Alpha/illegal-element-type.ll [new file with mode: 0644]
test/CodeGen/PowerPC/illegal-element-type.ll [new file with mode: 0644]

index ce09eb4f4874eee9010ac9706b79dace1077b813..39535f1d1a180b5b58b763297949c70e9bf5ccca 100644 (file)
@@ -695,9 +695,9 @@ static SDOperand getCopyFromParts(SelectionDAG &DAG,
   } else if (NumParts > 0) {
     // If the intermediate type was expanded, build the intermediate operands
     // from the parts.
-    assert(NumIntermediates % NumParts == 0 &&
+    assert(NumParts % NumIntermediates == 0 &&
            "Must expand into a divisible number of parts!");
-    unsigned Factor = NumIntermediates / NumParts;
+    unsigned Factor = NumParts / NumIntermediates;
     for (unsigned i = 0; i != NumIntermediates; ++i)
       Ops[i] = getCopyFromParts(DAG, &Parts[i * Factor], Factor,
                                 PartVT, IntermediateVT);
@@ -708,7 +708,7 @@ static SDOperand getCopyFromParts(SelectionDAG &DAG,
   return DAG.getNode(MVT::isVector(IntermediateVT) ?
                        ISD::CONCAT_VECTORS :
                        ISD::BUILD_VECTOR,
-                     ValueVT, &Ops[0], NumParts);
+                     ValueVT, &Ops[0], NumIntermediates);
 }
 
 /// getCopyToParts - Create a series of nodes that contain the
diff --git a/test/CodeGen/Alpha/illegal-element-type.ll b/test/CodeGen/Alpha/illegal-element-type.ll
new file mode 100644 (file)
index 0000000..c95d571
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llvm-as < %s | llc -mtriple=alphaev6-unknown-linux-gnu
+
+define void @foo() {
+entry:
+        br label %bb
+
+bb:             ; preds = %bb, %entry
+        br i1 false, label %bb26, label %bb
+
+bb19:           ; preds = %bb26
+        ret void
+
+bb26:           ; preds = %bb
+        br i1 false, label %bb30, label %bb19
+
+bb30:           ; preds = %bb26
+        br label %bb45
+
+bb45:           ; preds = %bb45, %bb30
+        %V.0 = phi <8 x i16> [ %tmp42, %bb45 ], [ zeroinitializer, %bb30 ]     ; <<8 x i16>> [#uses=1]
+        %tmp42 = mul <8 x i16> zeroinitializer, %V.0            ; <<8 x i16>> [#uses=1]
+        br label %bb45
+}
diff --git a/test/CodeGen/PowerPC/illegal-element-type.ll b/test/CodeGen/PowerPC/illegal-element-type.ll
new file mode 100644 (file)
index 0000000..54a0665
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g3
+
+define void @foo() {
+entry:
+        br label %bb
+
+bb:             ; preds = %bb, %entry
+        br i1 false, label %bb26, label %bb
+
+bb19:           ; preds = %bb26
+        ret void
+
+bb26:           ; preds = %bb
+        br i1 false, label %bb30, label %bb19
+
+bb30:           ; preds = %bb26
+        br label %bb45
+
+bb45:           ; preds = %bb45, %bb30
+        %V.0 = phi <8 x i16> [ %tmp42, %bb45 ], [ zeroinitializer, %bb30 ]     ; <<8 x i16>> [#uses=1]
+        %tmp42 = mul <8 x i16> zeroinitializer, %V.0            ; <<8 x i16>> [#uses=1]
+        br label %bb45
+}