<div dir="ltr">Ping</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 21, 2014 at 9:28 PM, Luqman Aden <span dir="ltr"><<a href="mailto:me+llvm@luqman.ca" target="_blank">me+llvm@luqman.ca</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Lifetime intrinsics were preventing various optimizations like turning memset+memcpy to just memset.<br>
<br>
<a href="http://reviews.llvm.org/D5020" target="_blank">http://reviews.llvm.org/D5020</a><br>
<br>
Files:<br>
  lib/Transforms/Scalar/MemCpyOptimizer.cpp<br>
  test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll<br>
<br>
Index: lib/Transforms/Scalar/MemCpyOptimizer.cpp<br>
===================================================================<br>
--- lib/Transforms/Scalar/MemCpyOptimizer.cpp<br>
+++ lib/Transforms/Scalar/MemCpyOptimizer.cpp<br>
@@ -679,6 +679,10 @@<br>
           srcUseList.push_back(UU);<br>
       else<br>
         return false;<br>
+    } else if (const IntrinsicInst *IT = dyn_cast<IntrinsicInst>(U)) {<br>
+      if (IT->getIntrinsicID() != Intrinsic::lifetime_start &&<br>
+          IT->getIntrinsicID() != Intrinsic::lifetime_end)<br>
+        continue;<br>
     } else if (U != C && U != cpy) {<br>
       return false;<br>
     }<br>
Index: test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll<br>
===================================================================<br>
--- test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll<br>
+++ test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll<br>
@@ -0,0 +1,28 @@<br>
+; RUN: opt -basicaa -memcpyopt -instcombine -S < %s | FileCheck %s<br>
+<br>
+target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+<br>
+define void @foo([8 x i64]* noalias nocapture sret dereferenceable(64)) {<br>
+entry-block:<br>
+  %a = alloca [8 x i64], align 8<br>
+  %1 = bitcast [8 x i64]* %a to i8*<br>
+  call void @llvm.lifetime.start(i64 64, i8* %1)<br>
+  call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 64, i32 8, i1 false)<br>
+  %2 = bitcast [8 x i64]* %0 to i8*<br>
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* %1, i64 64, i32 8, i1 false)<br>
+  call void @llvm.lifetime.end(i64 64, i8* %1)<br>
+  ret void<br>
+<br>
+; CHECK-LABEL: @foo(<br>
+; CHECK: %1 = bitcast<br>
+; CHECK: call void @llvm.memset<br>
+; CHECK-NOT: call void @llvm.memcpy<br>
+; CHECK: ret void<br>
+}<br>
+<br>
+declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind<br>
+declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind<br>
+<br>
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind<br>
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind<br>
</blockquote></div><br></div>