<div style="font-family: arial, helvetica, sans-serif; font-size: 10pt"><div>Hi Duncan,</div><br><div class="gmail_quote">On Tue, Nov 13, 2012 at 12:27 PM, Duncan Sands <span dir="ltr"><<a href="mailto:baldrick@free.fr" target="_blank">baldrick@free.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Alexey,<div class="im">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Figure out <size> argument of llvm.lifetime intrinsics at the moment they are created (during function inlining)<br>
</blockquote>
<br></div>
wouldn't it be better to do this in instcombine?  For example, suppose you have<br>
a dynamically sized alloca with an associated lifetime intrinsic with a size of<br>
-1.  Instcombine may be able to (and often does) simplify the size of the alloca<br>
to a constant, in which case the size of the lifetime intrinsic could be fixed<br>
up to be that constant too.  I'm just saying that this optimization doesn't have<br>
anything much to do with inlining, it seems to be generally useful, so would be<br>
better off in instcombine probably.<br></blockquote><div><br></div><div>Thanks for suggestion, I'll try take a look at instcombine soon!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Ciao, Duncan.<div class="HOEnZb"><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Added:<br>
     llvm/trunk/test/Transforms/<u></u>Inline/lifetime-no-datalayout.<u></u>ll<br>
Modified:<br>
     llvm/trunk/lib/Transforms/<u></u>Utils/InlineFunction.cpp<br>
     llvm/trunk/test/Transforms/<u></u>Inline/lifetime.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/<u></u>Utils/InlineFunction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=167821&r1=167820&r2=167821&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>Transforms/Utils/<u></u>InlineFunction.cpp?rev=167821&<u></u>r1=167820&r2=167821&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/Transforms/<u></u>Utils/InlineFunction.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<u></u>Utils/InlineFunction.cpp Tue Nov 13 01:15:32 2012<br>
@@ -668,10 +668,29 @@<br>
        if (hasLifetimeMarkers(AI))<br>
          continue;<br>
<br>
-      builder.CreateLifetimeStart(<u></u>AI);<br>
+      // Try to determine the size of the allocation.<br>
+      ConstantInt *AllocaSize = 0;<br>
+      if (ConstantInt *AIArraySize =<br>
+          dyn_cast<ConstantInt>(AI-><u></u>getArraySize())) {<br>
+        if (<a href="http://IFI.TD" target="_blank">IFI.TD</a>) {<br>
+          Type *AllocaType = AI->getAllocatedType();<br>
+          uint64_t AllocaTypeSize = IFI.TD->getTypeAllocSize(<u></u>AllocaType);<br>
+          uint64_t AllocaArraySize = AIArraySize->getLimitedValue()<u></u>;<br>
+          assert(AllocaArraySize > 0 && "array size of AllocaInst is zero");<br>
+          // Check that array size doesn't saturate uint64_t and doesn't<br>
+          // overflow when it's multiplied by type size.<br>
+          if (AllocaArraySize != ~0ULL &&<br>
+              UINT64_MAX / AllocaArraySize >= AllocaTypeSize) {<br>
+            AllocaSize = ConstantInt::get(Type::<u></u>getInt64Ty(AI->getContext()),<br>
+                                          AllocaArraySize * AllocaTypeSize);<br>
+          }<br>
+        }<br>
+      }<br>
+<br>
+      builder.CreateLifetimeStart(<u></u>AI, AllocaSize);<br>
        for (unsigned ri = 0, re = Returns.size(); ri != re; ++ri) {<br>
          IRBuilder<> builder(Returns[ri]);<br>
-        builder.CreateLifetimeEnd(AI);<br>
+        builder.CreateLifetimeEnd(AI, AllocaSize);<br>
        }<br>
      }<br>
    }<br>
<br>
Added: llvm/trunk/test/Transforms/<u></u>Inline/lifetime-no-datalayout.<u></u>ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/lifetime-no-datalayout.ll?rev=167821&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/Inline/lifetime-no-<u></u>datalayout.ll?rev=167821&view=<u></u>auto</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/test/Transforms/<u></u>Inline/lifetime-no-datalayout.<u></u>ll (added)<br>
+++ llvm/trunk/test/Transforms/<u></u>Inline/lifetime-no-datalayout.<u></u>ll Tue Nov 13 01:15:32 2012<br>
@@ -0,0 +1,23 @@<br>
+; RUN: opt -inline %s -S -o - | FileCheck %s<br>
+<br>
+declare void @use(i8* %a)<br>
+<br>
+define void @helper() {<br>
+  %a = alloca i8<br>
+  call void @use(i8* %a)<br>
+  ret void<br>
+}<br>
+<br>
+; Size in llvm.lifetime.X should be -1 (unknown).<br>
+define void @test() {<br>
+; CHECK: @test<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: llvm.lifetime.start(i64 -1<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: llvm.lifetime.end(i64 -1<br>
+  call void @helper()<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: ret void<br>
+  ret void<br>
+}<br>
+<br>
<br>
Modified: llvm/trunk/test/Transforms/<u></u>Inline/lifetime.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/lifetime.ll?rev=167821&r1=167820&r2=167821&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/Inline/lifetime.ll?<u></u>rev=167821&r1=167820&r2=<u></u>167821&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/test/Transforms/<u></u>Inline/lifetime.ll (original)<br>
+++ llvm/trunk/test/Transforms/<u></u>Inline/lifetime.ll Tue Nov 13 01:15:32 2012<br>
@@ -1,22 +1,25 @@<br>
  ; RUN: opt -inline %s -S -o - | FileCheck %s<br>
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-<u></u>i16:16:16-i32:32:32-i64:64:64-<u></u>f32:32:32-f64:64:64-v64:64:64-<u></u>v128:128:128-a0:0:64-s0:64:64-<u></u>f80:128:128-n8:16:32:64-S128"<br>
<br>
  declare void @llvm.lifetime.start(i64, i8*)<br>
  declare void @llvm.lifetime.end(i64, i8*)<br>
<br>
  define void @helper_both_markers() {<br>
    %a = alloca i8<br>
-  call void @llvm.lifetime.start(i64 1, i8* %a)<br>
-  call void @llvm.lifetime.end(i64 1, i8* %a)<br>
+  ; Size in llvm.lifetime.start / llvm.lifetime.end differs from<br>
+  ; allocation size. We should use the former.<br>
+  call void @llvm.lifetime.start(i64 2, i8* %a)<br>
+  call void @llvm.lifetime.end(i64 2, i8* %a)<br>
    ret void<br>
  }<br>
<br>
  define void @test_both_markers() {<br>
  ; CHECK: @test_both_markers<br>
-; CHECK: llvm.lifetime.start(i64 1<br>
-; CHECK-NEXT: llvm.lifetime.end(i64 1<br>
+; CHECK: llvm.lifetime.start(i64 2<br>
+; CHECK-NEXT: llvm.lifetime.end(i64 2<br>
    call void @helper_both_markers()<br>
-; CHECK-NEXT: llvm.lifetime.start(i64 1<br>
-; CHECK-NEXT: llvm.lifetime.end(i64 1<br>
+; CHECK-NEXT: llvm.lifetime.start(i64 2<br>
+; CHECK-NEXT: llvm.lifetime.end(i64 2<br>
    call void @helper_both_markers()<br>
  ; CHECK-NEXT: ret void<br>
    ret void<br>
@@ -27,7 +30,7 @@<br>
  declare void @use(i8* %a)<br>
<br>
  define void @helper_no_markers() {<br>
-  %a = alloca i8<br>
+  %a = alloca i8 ; Allocation size is 1 byte.<br>
    call void @use(i8* %a)<br>
    ret void<br>
  }<br>
@@ -37,14 +40,14 @@<br>
  define void @test_no_marker() {<br>
  ; CHECK: @test_no_marker<br>
  ; CHECK-NOT: lifetime<br>
-; CHECK: llvm.lifetime.start(i64 -1<br>
+; CHECK: llvm.lifetime.start(i64 1<br>
  ; CHECK-NOT: lifetime<br>
-; CHECK: llvm.lifetime.end(i64 -1<br>
+; CHECK: llvm.lifetime.end(i64 1<br>
    call void @helper_no_markers()<br>
  ; CHECK-NOT: lifetime<br>
-; CHECK: llvm.lifetime.start(i64 -1<br>
+; CHECK: llvm.lifetime.start(i64 1<br>
  ; CHECK-NOT: lifetime<br>
-; CHECK: llvm.lifetime.end(i64 -1<br>
+; CHECK: llvm.lifetime.end(i64 1<br>
    call void @helper_no_markers()<br>
  ; CHECK-NOT: lifetime<br>
  ; CHECK: ret void<br>
@@ -76,3 +79,22 @@<br>
  ; CHECK: ret void<br>
    ret void<br>
  }<br>
+<br>
+define void @helper_arrays_alloca() {<br>
+  %a = alloca [10 x i32], align 16<br>
+  %1 = bitcast [10 x i32]* %a to i8*<br>
+  call void @use(i8* %1)<br>
+  ret void<br>
+}<br>
+<br>
+define void @test_arrays_alloca() {<br>
+; CHECK: @test_arrays_alloca<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: llvm.lifetime.start(i64 40,<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: llvm.lifetime.end(i64 40,<br>
+  call void @helper_arrays_alloca()<br>
+; CHECK-NOT: lifetime<br>
+; CHECK: ret void<br>
+  ret void<br>
+}<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
</blockquote>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div><br>
</div>