[PATCH] D20173: [InstCombine] Avoid combining the bitcast of a var that is used as both address and result of the same load instruction

Carrot Wei via llvm-commits llvm-commits at lists.llvm.org
Wed May 18 16:39:16 PDT 2016


ping

On Wed, May 11, 2016 at 4:12 PM, Guozhi Wei <carrot at google.com> wrote:

> Carrot updated this revision to Diff 56976.
> Carrot added a comment.
>
> The original patch considers only one load instruction. There may be
> multiple load instructions, each loaded value is used as address of later
> load instruction, just as Caroline's testcase, it still causes problem.
> This updated patch solves the problem. Detecting the exact pattern is too
> complex. For simplicity the code gives up if the load address comes from
> another load instruction.
>
> Please review it again.
>
>
> http://reviews.llvm.org/D20173
>
> Files:
>   lib/Transforms/InstCombine/InstCombineCasts.cpp
>   test/Transforms/InstCombine/pr27703.ll
>
> Index: test/Transforms/InstCombine/pr27703.ll
> ===================================================================
> --- test/Transforms/InstCombine/pr27703.ll
> +++ test/Transforms/InstCombine/pr27703.ll
> @@ -0,0 +1,20 @@
> +; RUN: opt < %s -instcombine -S | FileCheck %s
> +
> +define void @mem() {
> +bb:
> +  br label %bb6
> +
> +bb6:
> +  %.0 = phi i8** [ undef, %bb ], [ %t2, %bb6 ]
> +  %tmp = load i8*, i8** %.0, align 8
> +  %bc = bitcast i8* %tmp to i8**
> +  %t1 = load i8*, i8** %bc, align 8
> +  %t2 = bitcast i8* %t1 to i8**
> +  br label %bb6
> +
> +bb206:
> +  ret void
> +; CHECK: phi
> +; CHECK: bitcast
> +; CHECK: load
> +}
> Index: lib/Transforms/InstCombine/InstCombineCasts.cpp
> ===================================================================
> --- lib/Transforms/InstCombine/InstCombineCasts.cpp
> +++ lib/Transforms/InstCombine/InstCombineCasts.cpp
> @@ -1820,6 +1820,13 @@
>
>        auto *LI = dyn_cast<LoadInst>(IncValue);
>        if (LI) {
> +        // If there is a sequence of one or more load instructions, each
> loaded
> +        // value is used as address of later load instruction, bitcast is
> +        // necessary to change the value type, don't optimize it. For
> +        // simplicity we give up if the load address comes from another
> load.
> +        Value *Addr = LI->getOperand(0);
> +        if (Addr == &CI || isa<LoadInst>(Addr))
> +          return nullptr;
>          if (LI->hasOneUse() && LI->isSimple())
>            continue;
>          // If a LoadInst has more than one use, changing the type of
> loaded
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160518/fe196755/attachment.html>


More information about the llvm-commits mailing list