diff options
author | Chris Lattner <sabre@nondot.org> | 2012-12-31 08:10:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-12-31 08:10:58 +0000 |
commit | eeefe1bc07ac7ce7f774220fc4f099b6ba24bacd (patch) | |
tree | 3ffb5c9a08d3b30d3fe7a0b77e2a575a0a61cd89 | |
parent | 82f61bf4b69e39b6f0b8ac82a8c9be953148b5e2 (diff) | |
download | bcm5719-llvm-eeefe1bc07ac7ce7f774220fc4f099b6ba24bacd.tar.gz bcm5719-llvm-eeefe1bc07ac7ce7f774220fc4f099b6ba24bacd.zip |
teach instcombine to preserve TBAA tag when merging two stores, part of
PR14753
llvm-svn: 171279
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/store.ll | 34 |
2 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index 5726d3a91de..ca069572812 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -802,6 +802,13 @@ bool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) { InsertNewInstBefore(NewSI, *BBI); NewSI->setDebugLoc(OtherStore->getDebugLoc()); + // If the two stores had the same TBAA tag, preserve it. + if (MDNode *TBAATag1 = SI.getMetadata(LLVMContext::MD_tbaa)) + if (MDNode *TBAATag2 = OtherStore->getMetadata(LLVMContext::MD_tbaa)) + if (TBAATag1 == TBAATag2) + NewSI->setMetadata(LLVMContext::MD_tbaa, TBAATag1); + + // Nuke the old stores. EraseInstFromFunction(SI); EraseInstFromFunction(*OtherStore); diff --git a/llvm/test/Transforms/InstCombine/store.ll b/llvm/test/Transforms/InstCombine/store.ll index 64460d7a6d6..164ba763268 100644 --- a/llvm/test/Transforms/InstCombine/store.ll +++ b/llvm/test/Transforms/InstCombine/store.ll @@ -83,3 +83,37 @@ Cont: ; CHECK-NEXT: ret void } + +; PR14753 - merging two stores should preserve the TBAA tag. +define void @test6(i32 %n, float* %a, i32* %gi) nounwind uwtable ssp { +entry: + store i32 42, i32* %gi, align 4, !tbaa !0 + br label %for.cond + +for.cond: ; preds = %for.body, %entry + %storemerge = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i32* %gi, align 4, !tbaa !0 + %cmp = icmp slt i32 %0, %n + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %idxprom = sext i32 %0 to i64 + %arrayidx = getelementptr inbounds float* %a, i64 %idxprom + store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3 + %1 = load i32* %gi, align 4, !tbaa !0 + %inc = add nsw i32 %1, 1 + store i32 %inc, i32* %gi, align 4, !tbaa !0 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +; CHECK: @test6 +; CHECK: for.cond: +; CHECK-NEXT: phi i32 [ 42 +; CHECK-NEXT: store i32 %storemerge, i32* %gi, align 4, !tbaa !0 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"float", metadata !1} |