Relax an overly aggressive assert to fix PR14572.
authorChandler Carruth <chandlerc@gmail.com>
Sat, 15 Dec 2012 09:26:06 +0000 (09:26 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 15 Dec 2012 09:26:06 +0000 (09:26 +0000)
The alloca width is based on the alloc size, not the type size.

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

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

index 1c220ca0f6e98053f48188c63af6faaf0389fc8c..c65ac5a647a069c831b181dd560a5c08ffe1d88f 100644 (file)
@@ -2607,7 +2607,7 @@ private:
              TD.getTypeStoreSizeInBits(V->getType()) &&
              "Non-byte-multiple bit width");
       assert(V->getType()->getIntegerBitWidth() ==
-             TD.getTypeSizeInBits(OldAI.getAllocatedType()) &&
+             TD.getTypeAllocSizeInBits(OldAI.getAllocatedType()) &&
              "Only alloca-wide stores can be split and recomposed");
       IntegerType *NarrowTy = Type::getIntNTy(SI.getContext(), Size * 8);
       V = extractInteger(TD, IRB, V, NarrowTy, BeginOffset,
index d8b6b41a579da4d0a790ec43dd64375cb2a7ec2a..ba93e04a51db017af25683449e591933095b55d8 100644 (file)
@@ -1176,3 +1176,19 @@ entry:
   %baz = load i1* %a.i1, align 1
   ret void
 }
+
+define <3 x i8> @PR14572(i32 %x) {
+; Ensure that a split integer store which is wider than the type size of the
+; alloca (relying on the alloc size padding) doesn't trigger an assert.
+; CHECK: @PR14572
+
+entry:
+  %a = alloca <3 x i8>, align 4
+; CHECK-NOT: alloca
+
+  %cast = bitcast <3 x i8>* %a to i32*
+  store i32 %x, i32* %cast, align 1
+  %y = load <3 x i8>* %a, align 4
+  ret <3 x i8> %y
+; CHECK: ret <3 x i8>
+}