Fix constant folding for one lane vector types. Constant folding one lane vector...
authorSilviu Baranga <silviu.baranga@arm.com>
Thu, 25 Apr 2013 09:32:33 +0000 (09:32 +0000)
committerSilviu Baranga <silviu.baranga@arm.com>
Thu, 25 Apr 2013 09:32:33 +0000 (09:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180254 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/ARM/v1-constant-fold.ll [new file with mode: 0644]

index 3082ee7caae433054d21f579cfb495b425f8131b..5e30c251e75609c3e2aca4c9d0bff505d1213703 100644 (file)
@@ -2785,7 +2785,7 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, EVT VT,
   }
 
   // Handle the scalar case first.
-  if (Outputs.size() == 1)
+  if (Scalar1 && Scalar2)
     return Outputs.back();
 
   // Otherwise build a big vector out of the scalar elements we generated.
diff --git a/test/CodeGen/ARM/v1-constant-fold.ll b/test/CodeGen/ARM/v1-constant-fold.ll
new file mode 100644 (file)
index 0000000..b86d5db
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -mattr=+v7,+vfp3,-neon  | FileCheck %s
+
+; PR15611. Check that we don't crash when constant folding v1i32 types.
+
+; CHECK: foo:
+define void @foo(i32 %arg) {
+bb:
+  %tmp = insertelement <4 x i32> undef, i32 %arg, i32 0
+  %tmp1 = insertelement <4 x i32> %tmp, i32 0, i32 1
+  %tmp2 = insertelement <4 x i32> %tmp1, i32 0, i32 2
+  %tmp3 = insertelement <4 x i32> %tmp2, i32 0, i32 3
+  %tmp4 = add <4 x i32> %tmp3, <i32 -1, i32 -1, i32 -1, i32 -1>
+; CHECK:  bl bar
+  tail call void @bar(<4 x i32> %tmp4)
+  ret void
+}
+
+declare void @bar(<4 x i32>)