[PATCH] D12710: InstCombine: Preserve tbaa metadata when merging loads that are phi arguments
Akira Hatanaka via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 8 15:26:06 PDT 2015
ahatanak created this revision.
ahatanak added a subscriber: llvm-commits.
This patch attaches the merged metadata to the load instruction that is newly created in InstCombiner::FoldPHIArgLoadIntoPHI.
http://reviews.llvm.org/D12710
Files:
lib/Transforms/InstCombine/InstCombinePHI.cpp
test/Transforms/InstCombine/fold-phi-load-tbaa.ll
Index: test/Transforms/InstCombine/fold-phi-load-tbaa.ll
===================================================================
--- /dev/null
+++ test/Transforms/InstCombine/fold-phi-load-tbaa.ll
@@ -0,0 +1,42 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+%struct.S1 = type { i32, float }
+%struct.S2 = type { float, i32 }
+
+; Check that tbaa metadata is preserved after merging the two loads.
+;
+; CHECK: return:
+; CHECK: load i32, i32* %{{[a-z0-9.]+}}, align 4, !tbaa !0
+
+; Function Attrs: nounwind ssp uwtable
+define i32 @phi_load_tbaa(%struct.S1* %s1, %struct.S2* %s2, i32 %c) #0 {
+entry:
+ %tobool = icmp eq i32 %c, 0
+ br i1 %tobool, label %if.end, label %if.then
+
+if.then: ; preds = %entry
+ %i = getelementptr inbounds %struct.S2, %struct.S2* %s2, i64 0, i32 1
+ %val = load i32, i32* %i, align 4, !tbaa !0
+ br label %return
+
+if.end: ; preds = %entry
+ %i2 = getelementptr inbounds %struct.S1, %struct.S1* %s1, i64 0, i32 0
+ %val2 = load i32, i32* %i2, align 4, !tbaa !2
+ br label %return
+
+return: ; preds = %if.end, %if.then
+ %retval = phi i32 [ %val, %if.then ], [ %val2, %if.end ]
+ ret i32 %retval
+}
+
+; CHECK: !0 = !{!1, !1, i64 0}
+; CHECK: !1 = !{!"int", !{{[0-9]}}, i64 0}
+
+!0 = !{!1, !4, i64 4}
+!1 = !{!"", !7, i64 0, !4, i64 4}
+!2 = !{!3, !4, i64 0}
+!3 = !{!"", !4, i64 0, !7, i64 4}
+!4 = !{!"int", !5, i64 0}
+!5 = !{!"omnipotent char", !6, i64 0}
+!6 = !{!"Simple C/C++ TBAA"}
+!7 = !{!"float", !5, i64 0}
Index: lib/Transforms/InstCombine/InstCombinePHI.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombinePHI.cpp
+++ lib/Transforms/InstCombine/InstCombinePHI.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Analysis/InstructionSimplify.h"
+#include "llvm/Transforms/Utils/Local.h"
using namespace llvm;
#define DEBUG_TYPE "instcombine"
@@ -350,9 +351,11 @@
Value *InVal = FirstLI->getOperand(0);
NewPN->addIncoming(InVal, PN.getIncomingBlock(0));
- // Add all operands to the new PHI.
+ // Add all operands to the new PHI and combine TBAA metadata.
for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
- Value *NewInVal = cast<LoadInst>(PN.getIncomingValue(i))->getOperand(0);
+ LoadInst *LI = cast<LoadInst>(PN.getIncomingValue(i));
+ combineMetadata(FirstLI, LI, { LLVMContext::MD_tbaa });
+ Value *NewInVal = LI->getOperand(0);
if (NewInVal != InVal)
InVal = nullptr;
NewPN->addIncoming(NewInVal, PN.getIncomingBlock(i));
@@ -377,6 +380,8 @@
cast<LoadInst>(IncValue)->setVolatile(false);
LoadInst *NewLI = new LoadInst(PhiVal, "", isVolatile, LoadAlignment);
+ NewLI->setMetadata(LLVMContext::MD_tbaa,
+ FirstLI->getMetadata(LLVMContext::MD_tbaa));
NewLI->setDebugLoc(FirstLI->getDebugLoc());
return NewLI;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12710.34272.patch
Type: text/x-patch
Size: 3019 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150908/d4581a52/attachment.bin>
More information about the llvm-commits
mailing list