<div dir="ltr">I added !invariant.load to virtual functions load, so when optimizer see case like this<div><br></div><div>%vtable = load ...</div><div>%1 = load (...) %vtable, !invariant.load !0</div><div>call %1(...)</div><div>%2 = load (...) %vtable, !invariant.load !0</div><div>call %2(...)</div><div><br></div><div><br></div><div>can merge the 2 virtual functions load into one like this:</div><div><br></div><div><div>%vtable = load ...</div><div>%1 = load (...) %vtable, !invariant.load !0</div><div>call %1(...)</div><div>call %1(...)<br></div></div><div><br></div><div>This change requires -fstrict-vtable-pointers because without !invariant.group optimizer will not merge vtable load into one load, </div><div>and because of it !invariant.load will be useless.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 30, 2015 at 9:28 PM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@gmail.com" target="_blank">chandlerc@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span class=""><div dir="ltr">On Wed, Sep 30, 2015 at 8:52 PM Piotr Padlewski via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: prazek<br>
Date: Wed Sep 30 22:50:41 2015<br>
New Revision: 248982<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=248982&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=248982&view=rev</a><br>
Log:<br>
Decorating virtual functions load with invariant.load<br></blockquote><div><br></div></span><div>This change description really doesn't tell me anything about what this change does. Could you try to write more detailed and explanatory change logs?</div><div><br></div><div>Imagine a reader that has little or no context reading the change log to gain the context necessary to read the actual patch and understand what is going on with it.</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<a href="http://reviews.llvm.org/D13279" rel="noreferrer" target="_blank">http://reviews.llvm.org/D13279</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp<br>
    cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=248982&r1=248981&r2=248982&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=248982&r1=248981&r2=248982&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Wed Sep 30 22:50:41 2015<br>
@@ -1609,7 +1609,16 @@ llvm::Value *ItaniumCXXABI::getVirtualFu<br>
   uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);<br>
   llvm::Value *VFuncPtr =<br>
       CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");<br>
-  return CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());<br>
+  auto *Inst = CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());<br>
+<br>
+  // It's safe to add "invariant.load" without -fstrict-vtable-pointers, but it<br>
+  // would not help in devirtualization.<br>
+  if (CGM.getCodeGenOpts().OptimizationLevel > 0 &&<br>
+      CGM.getCodeGenOpts().StrictVTablePointers)<br>
+    Inst->setMetadata(llvm::LLVMContext::MD_invariant_load,<br>
+                      llvm::MDNode::get(CGM.getLLVMContext(),<br>
+                                        llvm::ArrayRef<llvm::Metadata *>()));<br>
+  return Inst;<br>
 }<br>
<br>
 llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp?rev=248982&r1=248981&r2=248982&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp?rev=248982&r1=248981&r2=248982&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/virtual-function-calls.cpp Wed Sep 30 22:50:41 2015<br>
@@ -1,4 +1,5 @@<br>
 // RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - | FileCheck %s<br>
+// RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - -fstrict-vtable-pointers -O1 | FileCheck --check-prefix=CHECK-INVARIANT %s<br>
<br>
 // PR5021<br>
 namespace PR5021 {<br>
@@ -42,10 +43,14 @@ namespace VirtualNoreturn {<br>
     [[noreturn]] virtual void f();<br>
   };<br>
<br>
-  // CHECK: @_ZN15VirtualNoreturn1f<br>
+  // CHECK-LABEL: @_ZN15VirtualNoreturn1f<br>
+  // CHECK-INVARIANT-LABEL: define void @_ZN15VirtualNoreturn1f<br>
   void f(A *p) {<br>
     p->f();<br>
     // CHECK: call {{.*}}void %{{[^#]*$}}<br>
     // CHECK-NOT: unreachable<br>
+    // CHECK-INVARIANT: load {{.*}} align 8, !invariant.load ![[EMPTY_NODE:[0-9]]]<br>
   }<br>
 }<br>
+<br>
+// CHECK-INVARIANT: ![[EMPTY_NODE]] = !{}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div></div>
</blockquote></div><br></div>