[llvm-commits] [llvm] r167821 - in /llvm/trunk: lib/Transforms/Utils/InlineFunction.cpp test/Transforms/Inline/lifetime-no-datalayout.ll test/Transforms/Inline/lifetime.ll
Alexey Samsonov
samsonov at google.com
Tue Nov 13 06:27:17 PST 2012
Hi Duncan,
On Tue, Nov 13, 2012 at 12:27 PM, Duncan Sands <baldrick at free.fr> wrote:
> Hi Alexey,
>
> Figure out <size> argument of llvm.lifetime intrinsics at the moment they
>> are created (during function inlining)
>>
>
> wouldn't it be better to do this in instcombine? For example, suppose you
> have
> a dynamically sized alloca with an associated lifetime intrinsic with a
> size of
> -1. Instcombine may be able to (and often does) simplify the size of the
> alloca
> to a constant, in which case the size of the lifetime intrinsic could be
> fixed
> up to be that constant too. I'm just saying that this optimization
> doesn't have
> anything much to do with inlining, it seems to be generally useful, so
> would be
> better off in instcombine probably.
>
Thanks for suggestion, I'll try take a look at instcombine soon!
>
> Ciao, Duncan.
>
>
>
>> Added:
>> llvm/trunk/test/Transforms/**Inline/lifetime-no-datalayout.**ll
>> Modified:
>> llvm/trunk/lib/Transforms/**Utils/InlineFunction.cpp
>> llvm/trunk/test/Transforms/**Inline/lifetime.ll
>>
>> Modified: llvm/trunk/lib/Transforms/**Utils/InlineFunction.cpp
>> URL: http://llvm.org/viewvc/llvm-**project/llvm/trunk/lib/**
>> Transforms/Utils/**InlineFunction.cpp?rev=167821&**
>> r1=167820&r2=167821&view=diff<http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=167821&r1=167820&r2=167821&view=diff>
>> ==============================**==============================**
>> ==================
>> --- llvm/trunk/lib/Transforms/**Utils/InlineFunction.cpp (original)
>> +++ llvm/trunk/lib/Transforms/**Utils/InlineFunction.cpp Tue Nov 13
>> 01:15:32 2012
>> @@ -668,10 +668,29 @@
>> if (hasLifetimeMarkers(AI))
>> continue;
>>
>> - builder.CreateLifetimeStart(**AI);
>> + // Try to determine the size of the allocation.
>> + ConstantInt *AllocaSize = 0;
>> + if (ConstantInt *AIArraySize =
>> + dyn_cast<ConstantInt>(AI->**getArraySize())) {
>> + if (IFI.TD) {
>> + Type *AllocaType = AI->getAllocatedType();
>> + uint64_t AllocaTypeSize = IFI.TD->getTypeAllocSize(**
>> AllocaType);
>> + uint64_t AllocaArraySize = AIArraySize->getLimitedValue()**;
>> + assert(AllocaArraySize > 0 && "array size of AllocaInst is
>> zero");
>> + // Check that array size doesn't saturate uint64_t and doesn't
>> + // overflow when it's multiplied by type size.
>> + if (AllocaArraySize != ~0ULL &&
>> + UINT64_MAX / AllocaArraySize >= AllocaTypeSize) {
>> + AllocaSize = ConstantInt::get(Type::**
>> getInt64Ty(AI->getContext()),
>> + AllocaArraySize *
>> AllocaTypeSize);
>> + }
>> + }
>> + }
>> +
>> + builder.CreateLifetimeStart(**AI, AllocaSize);
>> for (unsigned ri = 0, re = Returns.size(); ri != re; ++ri) {
>> IRBuilder<> builder(Returns[ri]);
>> - builder.CreateLifetimeEnd(AI);
>> + builder.CreateLifetimeEnd(AI, AllocaSize);
>> }
>> }
>> }
>>
>> Added: llvm/trunk/test/Transforms/**Inline/lifetime-no-datalayout.**ll
>> URL: http://llvm.org/viewvc/llvm-**project/llvm/trunk/test/**
>> Transforms/Inline/lifetime-no-**datalayout.ll?rev=167821&view=**auto<http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/lifetime-no-datalayout.ll?rev=167821&view=auto>
>> ==============================**==============================**
>> ==================
>> --- llvm/trunk/test/Transforms/**Inline/lifetime-no-datalayout.**ll
>> (added)
>> +++ llvm/trunk/test/Transforms/**Inline/lifetime-no-datalayout.**ll Tue
>> Nov 13 01:15:32 2012
>> @@ -0,0 +1,23 @@
>> +; RUN: opt -inline %s -S -o - | FileCheck %s
>> +
>> +declare void @use(i8* %a)
>> +
>> +define void @helper() {
>> + %a = alloca i8
>> + call void @use(i8* %a)
>> + ret void
>> +}
>> +
>> +; Size in llvm.lifetime.X should be -1 (unknown).
>> +define void @test() {
>> +; CHECK: @test
>> +; CHECK-NOT: lifetime
>> +; CHECK: llvm.lifetime.start(i64 -1
>> +; CHECK-NOT: lifetime
>> +; CHECK: llvm.lifetime.end(i64 -1
>> + call void @helper()
>> +; CHECK-NOT: lifetime
>> +; CHECK: ret void
>> + ret void
>> +}
>> +
>>
>> Modified: llvm/trunk/test/Transforms/**Inline/lifetime.ll
>> URL: http://llvm.org/viewvc/llvm-**project/llvm/trunk/test/**
>> Transforms/Inline/lifetime.ll?**rev=167821&r1=167820&r2=**
>> 167821&view=diff<http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/lifetime.ll?rev=167821&r1=167820&r2=167821&view=diff>
>> ==============================**==============================**
>> ==================
>> --- llvm/trunk/test/Transforms/**Inline/lifetime.ll (original)
>> +++ llvm/trunk/test/Transforms/**Inline/lifetime.ll Tue Nov 13 01:15:32
>> 2012
>> @@ -1,22 +1,25 @@
>> ; RUN: opt -inline %s -S -o - | FileCheck %s
>> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-**
>> i16:16:16-i32:32:32-i64:64:64-**f32:32:32-f64:64:64-v64:64:64-**
>> v128:128:128-a0:0:64-s0:64:64-**f80:128:128-n8:16:32:64-S128"
>>
>> declare void @llvm.lifetime.start(i64, i8*)
>> declare void @llvm.lifetime.end(i64, i8*)
>>
>> define void @helper_both_markers() {
>> %a = alloca i8
>> - call void @llvm.lifetime.start(i64 1, i8* %a)
>> - call void @llvm.lifetime.end(i64 1, i8* %a)
>> + ; Size in llvm.lifetime.start / llvm.lifetime.end differs from
>> + ; allocation size. We should use the former.
>> + call void @llvm.lifetime.start(i64 2, i8* %a)
>> + call void @llvm.lifetime.end(i64 2, i8* %a)
>> ret void
>> }
>>
>> define void @test_both_markers() {
>> ; CHECK: @test_both_markers
>> -; CHECK: llvm.lifetime.start(i64 1
>> -; CHECK-NEXT: llvm.lifetime.end(i64 1
>> +; CHECK: llvm.lifetime.start(i64 2
>> +; CHECK-NEXT: llvm.lifetime.end(i64 2
>> call void @helper_both_markers()
>> -; CHECK-NEXT: llvm.lifetime.start(i64 1
>> -; CHECK-NEXT: llvm.lifetime.end(i64 1
>> +; CHECK-NEXT: llvm.lifetime.start(i64 2
>> +; CHECK-NEXT: llvm.lifetime.end(i64 2
>> call void @helper_both_markers()
>> ; CHECK-NEXT: ret void
>> ret void
>> @@ -27,7 +30,7 @@
>> declare void @use(i8* %a)
>>
>> define void @helper_no_markers() {
>> - %a = alloca i8
>> + %a = alloca i8 ; Allocation size is 1 byte.
>> call void @use(i8* %a)
>> ret void
>> }
>> @@ -37,14 +40,14 @@
>> define void @test_no_marker() {
>> ; CHECK: @test_no_marker
>> ; CHECK-NOT: lifetime
>> -; CHECK: llvm.lifetime.start(i64 -1
>> +; CHECK: llvm.lifetime.start(i64 1
>> ; CHECK-NOT: lifetime
>> -; CHECK: llvm.lifetime.end(i64 -1
>> +; CHECK: llvm.lifetime.end(i64 1
>> call void @helper_no_markers()
>> ; CHECK-NOT: lifetime
>> -; CHECK: llvm.lifetime.start(i64 -1
>> +; CHECK: llvm.lifetime.start(i64 1
>> ; CHECK-NOT: lifetime
>> -; CHECK: llvm.lifetime.end(i64 -1
>> +; CHECK: llvm.lifetime.end(i64 1
>> call void @helper_no_markers()
>> ; CHECK-NOT: lifetime
>> ; CHECK: ret void
>> @@ -76,3 +79,22 @@
>> ; CHECK: ret void
>> ret void
>> }
>> +
>> +define void @helper_arrays_alloca() {
>> + %a = alloca [10 x i32], align 16
>> + %1 = bitcast [10 x i32]* %a to i8*
>> + call void @use(i8* %1)
>> + ret void
>> +}
>> +
>> +define void @test_arrays_alloca() {
>> +; CHECK: @test_arrays_alloca
>> +; CHECK-NOT: lifetime
>> +; CHECK: llvm.lifetime.start(i64 40,
>> +; CHECK-NOT: lifetime
>> +; CHECK: llvm.lifetime.end(i64 40,
>> + call void @helper_arrays_alloca()
>> +; CHECK-NOT: lifetime
>> +; CHECK: ret void
>> + ret void
>> +}
>>
>>
>> ______________________________**_________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>
>>
> ______________________________**_________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>
--
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121113/46b215bc/attachment.html>
More information about the llvm-commits
mailing list