<div dir="ltr">ping</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 8, 2015 at 3:26 PM, Akira Hatanaka <span dir="ltr"><<a href="mailto:ahatanak@gmail.com" target="_blank">ahatanak@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ahatanak created this revision.<br>
ahatanak added a subscriber: llvm-commits.<br>
<br>
This patch attaches the merged metadata to the load instruction that is newly created in InstCombiner::FoldPHIArgLoadIntoPHI.<br>
<br>
<a href="http://reviews.llvm.org/D12710" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12710</a><br>
<br>
Files:<br>
  lib/Transforms/InstCombine/InstCombinePHI.cpp<br>
  test/Transforms/InstCombine/fold-phi-load-tbaa.ll<br>
<br>
Index: test/Transforms/InstCombine/fold-phi-load-tbaa.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/Transforms/InstCombine/fold-phi-load-tbaa.ll<br>
@@ -0,0 +1,42 @@<br>
+; RUN: opt -instcombine -S < %s | FileCheck %s<br>
+<br>
+%struct.S1 = type { i32, float }<br>
+%struct.S2 = type { float, i32 }<br>
+<br>
+; Check that tbaa metadata is preserved after merging the two loads.<br>
+;<br>
+; CHECK: return:<br>
+; CHECK: load i32, i32* %{{[a-z0-9.]+}}, align 4, !tbaa !0<br>
+<br>
+; Function Attrs: nounwind ssp uwtable<br>
+define i32 @phi_load_tbaa(%struct.S1* %s1, %struct.S2* %s2, i32 %c) #0 {<br>
+entry:<br>
+  %tobool = icmp eq i32 %c, 0<br>
+  br i1 %tobool, label %if.end, label %if.then<br>
+<br>
+if.then:                                          ; preds = %entry<br>
+  %i = getelementptr inbounds %struct.S2, %struct.S2* %s2, i64 0, i32 1<br>
+  %val = load i32, i32* %i, align 4, !tbaa !0<br>
+  br label %return<br>
+<br>
+if.end:                                           ; preds = %entry<br>
+  %i2 = getelementptr inbounds %struct.S1, %struct.S1* %s1, i64 0, i32 0<br>
+  %val2 = load i32, i32* %i2, align 4, !tbaa !2<br>
+  br label %return<br>
+<br>
+return:                                           ; preds = %if.end, %if.then<br>
+  %retval = phi i32 [ %val, %if.then ], [ %val2, %if.end ]<br>
+  ret i32 %retval<br>
+}<br>
+<br>
+; CHECK: !0 = !{!1, !1, i64 0}<br>
+; CHECK: !1 = !{!"int", !{{[0-9]}}, i64 0}<br>
+<br>
+!0 = !{!1, !4, i64 4}<br>
+!1 = !{!"", !7, i64 0, !4, i64 4}<br>
+!2 = !{!3, !4, i64 0}<br>
+!3 = !{!"", !4, i64 0, !7, i64 4}<br>
+!4 = !{!"int", !5, i64 0}<br>
+!5 = !{!"omnipotent char", !6, i64 0}<br>
+!6 = !{!"Simple C/C++ TBAA"}<br>
+!7 = !{!"float", !5, i64 0}<br>
Index: lib/Transforms/InstCombine/InstCombinePHI.cpp<br>
===================================================================<br>
--- lib/Transforms/InstCombine/InstCombinePHI.cpp<br>
+++ lib/Transforms/InstCombine/InstCombinePHI.cpp<br>
@@ -15,6 +15,7 @@<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/ADT/SmallPtrSet.h"<br>
 #include "llvm/Analysis/InstructionSimplify.h"<br>
+#include "llvm/Transforms/Utils/Local.h"<br>
 using namespace llvm;<br>
<br>
 #define DEBUG_TYPE "instcombine"<br>
@@ -350,9 +351,11 @@<br>
   Value *InVal = FirstLI->getOperand(0);<br>
   NewPN->addIncoming(InVal, PN.getIncomingBlock(0));<br>
<br>
-  // Add all operands to the new PHI.<br>
+  // Add all operands to the new PHI and combine TBAA metadata.<br>
   for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {<br>
-    Value *NewInVal = cast<LoadInst>(PN.getIncomingValue(i))->getOperand(0);<br>
+    LoadInst *LI = cast<LoadInst>(PN.getIncomingValue(i));<br>
+    combineMetadata(FirstLI, LI, { LLVMContext::MD_tbaa });<br>
+    Value *NewInVal = LI->getOperand(0);<br>
     if (NewInVal != InVal)<br>
       InVal = nullptr;<br>
     NewPN->addIncoming(NewInVal, PN.getIncomingBlock(i));<br>
@@ -377,6 +380,8 @@<br>
       cast<LoadInst>(IncValue)->setVolatile(false);<br>
<br>
   LoadInst *NewLI = new LoadInst(PhiVal, "", isVolatile, LoadAlignment);<br>
+  NewLI->setMetadata(LLVMContext::MD_tbaa,<br>
+                     FirstLI->getMetadata(LLVMContext::MD_tbaa));<br>
   NewLI->setDebugLoc(FirstLI->getDebugLoc());<br>
   return NewLI;<br>
 }<br>
<br>
<br>
</blockquote></div><br></div>