[PATCH] D12710: InstCombine: Preserve tbaa metadata when merging loads that are phi arguments

Akira Hatanaka via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 17 09:03:38 PDT 2015


ping

On Tue, Sep 8, 2015 at 3:26 PM, Akira Hatanaka <ahatanak at gmail.com> wrote:

> 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 --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150917/bda47ab7/attachment.html>


More information about the llvm-commits mailing list