[PATCH] D20077: [Inliner] don't assume that a Constant alloca size is a ConstantInt (PR27277)

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Mon May 9 14:29:22 PDT 2016


I'd prefer auto * in the if statement

On Monday, May 9, 2016, Sanjay Patel <spatel at rotateright.com> wrote:

> spatel updated this revision to Diff 56633.
> spatel added a comment.
>
> Patch updated:
> Add a ConstExpr test case.
>
>
> http://reviews.llvm.org/D20077
>
> Files:
>   lib/Analysis/InlineCost.cpp
>   test/Transforms/Inline/alloca_test.ll
>
> Index: test/Transforms/Inline/alloca_test.ll
> ===================================================================
> --- test/Transforms/Inline/alloca_test.ll
> +++ test/Transforms/Inline/alloca_test.ll
> @@ -1,3 +1,4 @@
> +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
>  ; This test ensures that alloca instructions in the entry block for an
> inlined
>  ; function are moved to the top of the function they are inlined into.
>  ;
> @@ -23,3 +24,32 @@
>    ret i32 %Y
>  }
>
> +; https://llvm.org/bugs/show_bug.cgi?id=27277
> +; Don't assume that the size is a ConstantInt (an undef value is also a
> constant).
> +
> +define void @PR27277(i32 %p1) {
> +; CHECK-LABEL: @PR27277(
> +; CHECK-NEXT:    [[VLA:%.*]] = alloca double, i32 %p1
> +; CHECK-NEXT:    call void @PR27277(i32 undef)
> +; CHECK-NEXT:    ret void
> +;
> +  %vla = alloca double, i32 %p1
> +  call void @PR27277(i32 undef)
> +  ret void
> +}
> +
> +; Don't assume that the size is a ConstantInt (a ConstExpr is also a
> constant).
> +
> + at GV = common global i32* null
> +
> +define void @PR27277_part2(i32 %p1) {
> +; CHECK-LABEL: @PR27277_part2(
> +; CHECK-NEXT:    [[VLA:%.*]] = alloca double, i32 %p1
> +; CHECK-NEXT:    call void @PR27277_part2(i32 ptrtoint (i32** @GV to i32))
> +; CHECK-NEXT:    ret void
> +;
> +  %vla = alloca double, i32 %p1
> +  call void @PR27277_part2(i32 ptrtoint (i32** @GV to i32))
> +  ret void
> +}
> +
> Index: lib/Analysis/InlineCost.cpp
> ===================================================================
> --- lib/Analysis/InlineCost.cpp
> +++ lib/Analysis/InlineCost.cpp
> @@ -329,12 +329,12 @@
>
>  bool CallAnalyzer::visitAlloca(AllocaInst &I) {
>    // Check whether inlining will turn a dynamic alloca into a static
> -  // alloca, and handle that case.
> +  // alloca and handle that case.
>    if (I.isArrayAllocation()) {
> -    if (Constant *Size = SimplifiedValues.lookup(I.getArraySize())) {
> -      ConstantInt *AllocSize = dyn_cast<ConstantInt>(Size);
> -      assert(AllocSize && "Allocation size not a constant int?");
> +    if (ConstantInt *AllocSize = dyn_cast_or_null<ConstantInt>(
> +            SimplifiedValues.lookup(I.getArraySize()))) {
>        Type *Ty = I.getAllocatedType();
> +      // FIXME: This can't be right. AllocatedSize is in *bytes*.
>        AllocatedSize += Ty->getPrimitiveSizeInBits() *
> AllocSize->getZExtValue();
>        return Base::visitAlloca(I);
>      }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160509/5a927b86/attachment.html>


More information about the llvm-commits mailing list