<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Thu, Sep 26, 2013 at 1:02 PM, Duncan Sands <span dir="ltr"><<a href="mailto:duncan.sands@gmail.com" target="_blank">duncan.sands@gmail.com</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>
<br>
On 25/09/13 13:32, Alexey Samsonov wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi nicholas,<br>
<br>
This change prevents GlobalOpt from turning globals into<br>
stack-allocated locals, if these variables may serve as a leak checker<br>
root. For instance, transforming<br>
   Foo *x;<br>
   int main() { x = new Foo(); }<br>
into<br>
   int main() { Foo *x = new Foo(); }<br>
will make LeakSanitizer treat "x" as definitely leaked, which is<br>
undesirable.<br>
</blockquote>
<br></div>
having magic semantics for globals with a certain type seems like a bad idea<br>
to me.  Here the global in effect has a secret external use, but that isn't<br>
clear from the IR.  In my opinion it's only asking for trouble and it would be<br>
better to make it explicit by requiring all GC roots to be used by (eg) a new<br>
llvm.gc_root global, analogous to llvm.used.<br></blockquote><div><br></div><div>Just to clarify this - who should create llvm.gc_root array - do you suggest to add a new __attribute__</div><div>the user should specify, or to emit llvm.gc_root in frontend, or in the backend before running</div>
<div>optimization passes?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Ciao, Duncan.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
<br>
<a href="http://llvm-reviews.chandlerc.com/D1754" target="_blank">http://llvm-reviews.chandlerc.<u></u>com/D1754</a><br>
<br>
Files:<br>
   test/Transforms/GlobalOpt/<u></u>metadata.ll<br>
   test/Transforms/GlobalOpt/<u></u>dont-localize-pointer.ll<br>
   lib/Transforms/IPO/GlobalOpt.<u></u>cpp<br>
<br>
Index: test/Transforms/GlobalOpt/<u></u>metadata.ll<br>
==============================<u></u>==============================<u></u>=======<br>
--- test/Transforms/GlobalOpt/<u></u>metadata.ll<br>
+++ test/Transforms/GlobalOpt/<u></u>metadata.ll<br>
@@ -3,24 +3,24 @@<br>
  ; PR6112 - When globalopt does RAUW(@G, %G), the metadata reference should drop<br>
  ; to null.  Function local metadata that references @G from a different function<br>
  ; to that containing %G should likewise drop to null.<br>
-@G = internal global i8** null<br>
+@G = internal global i32 0<br>
<br>
  define i32 @main(i32 %argc, i8** %argv) {<br>
  ; CHECK-LABEL: @main(<br>
  ; CHECK: %G = alloca<br>
-  store i8** %argv, i8*** @G<br>
+  store i32 %argc, i32* @G<br>
    ret i32 0<br>
  }<br>
<br>
  define void @foo(i32 %x) {<br>
-  call void @llvm.foo(metadata !{i8*** @G, i32 %x})<br>
+  call void @llvm.foo(metadata !{i32* @G, i32 %x})<br>
  ; CHECK: call void @llvm.foo(metadata !{null, i32 %x})<br>
    ret void<br>
  }<br>
<br>
  declare void @llvm.foo(metadata) nounwind readnone<br>
<br>
  !named = !{!0}<br>
<br>
-!0 = metadata !{i8*** @G}<br>
+!0 = metadata !{i32* @G}<br>
  ; CHECK: !0 = metadata !{null}<br>
Index: test/Transforms/GlobalOpt/<u></u>dont-localize-pointer.ll<br>
==============================<u></u>==============================<u></u>=======<br>
--- /dev/null<br>
+++ test/Transforms/GlobalOpt/<u></u>dont-localize-pointer.ll<br>
@@ -0,0 +1,10 @@<br>
+; RUN: opt -S -globalopt < %s | FileCheck %s<br>
+<br>
+@G = internal global i8** null<br>
+<br>
+define i32 @main(i32 %argc, i8** %argv) {<br>
+; CHECK-LABEL: @main(<br>
+; CHECK-NOT: alloca<br>
+  store i8** %argv, i8*** @G<br>
+  ret i32 0<br>
+}<br>
Index: lib/Transforms/IPO/GlobalOpt.<u></u>cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- lib/Transforms/IPO/GlobalOpt.<u></u>cpp<br>
+++ lib/Transforms/IPO/GlobalOpt.<u></u>cpp<br>
@@ -1951,7 +1951,8 @@<br>
        GV->getType()->getElementType(<u></u>)->isSingleValueType() &&<br>
        GS.AccessingFunction->getName(<u></u>) == "main" &&<br>
        GS.AccessingFunction-><u></u>hasExternalLinkage() &&<br>
-      GV->getType()-><u></u>getAddressSpace() == 0) {<br>
+      GV->getType()-><u></u>getAddressSpace() == 0 &&<br>
+      !isLeakCheckerRoot(GV)) {<br>
      DEBUG(dbgs() << "LOCALIZING GLOBAL: " << *GV);<br>
      Instruction &FirstI = const_cast<Instruction&>(*GS.<u></u>AccessingFunction<br>
                                                     ->getEntryBlock().begin());<br>
<br>
<br>
<br></div></div><div class="im">
______________________________<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>
</div></blockquote><div class="HOEnZb"><div class="h5">
<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>
</div></div>