[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