Fix another assert failure very similar to PR16651's test case. This
authorChandler Carruth <chandlerc@gmail.com>
Fri, 19 Jul 2013 10:57:32 +0000 (10:57 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 19 Jul 2013 10:57:32 +0000 (10:57 +0000)
test case came from Benjamin and found the parallel bug in the vector
promotion code.

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

lib/Transforms/Scalar/SROA.cpp
test/Transforms/SROA/basictest.ll

index 7235c0d6f22e2ada00a6541b07f709665d1bd907..5d7fa4b01f9d4e9350d46c5817777d34d4ed1288 100644 (file)
@@ -1539,6 +1539,8 @@ static bool isVectorPromotionViableForSlice(
     }
     if (!canConvertValue(DL, STy, SliceTy))
       return false;
+  } else {
+    return false;
   }
 
   return true;
index 9e5a26104db5b5d8e4940c805aa8f530bfa7721a..458b0df3c803f08f93cbba90e4af0c3295d92e5b 100644 (file)
@@ -1318,12 +1318,12 @@ define void @PR15805(i1 %a, i1 %b) {
   ret void
 }
 
-define void @PR16651(i8* %a) {
+define void @PR16651.1(i8* %a) {
 ; This test case caused a crash due to the volatile memcpy in combination with
 ; lowering to integer loads and stores of a width other than that of the original
 ; memcpy.
 ;
-; CHECK-LABEL: @PR16651(
+; CHECK-LABEL: @PR16651.1(
 ; CHECK: alloca i16
 ; CHECK: alloca i8
 ; CHECK: alloca i8
@@ -1337,3 +1337,23 @@ entry:
   load i8* %b.gep, align 2
   unreachable
 }
+
+define void @PR16651.2() {
+; This test case caused a crash due to failing to promote given a select that
+; can't be speculated. It shouldn't be promoted, but we missed that fact when
+; analyzing whether we could form a vector promotion because that code didn't
+; bail on select instructions.
+;
+; CHECK-LABEL: @PR16651.2(
+; CHECK: alloca <2 x float>
+; CHECK: ret void
+
+entry:
+  %tv1 = alloca { <2 x float>, <2 x float> }, align 8
+  %0 = getelementptr { <2 x float>, <2 x float> }* %tv1, i64 0, i32 1
+  store <2 x float> undef, <2 x float>* %0, align 8
+  %1 = getelementptr inbounds { <2 x float>, <2 x float> }* %tv1, i64 0, i32 1, i64 0
+  %cond105.in.i.i = select i1 undef, float* null, float* %1
+  %cond105.i.i = load float* %cond105.in.i.i, align 8
+  ret void
+}