[llvm] r238452 - [InstCombine] Fold IntToPtr and PtrToInt into preceding loads.

David Majnemer david.majnemer at gmail.com
Thu May 28 11:52:13 PDT 2015


Patch by Philip Pfaffe!

On Thu, May 28, 2015 at 11:39 AM, David Majnemer <david.majnemer at gmail.com>
wrote:

> Author: majnemer
> Date: Thu May 28 13:39:17 2015
> New Revision: 238452
>
> URL: http://llvm.org/viewvc/llvm-project?rev=238452&view=rev
> Log:
> [InstCombine] Fold IntToPtr and PtrToInt into preceding loads.
>
> Currently we only fold a BitCast into a Load when the BitCast is its
> only user.
>
> Do the same for any no-op cast.
>
> Differential Revision: http://reviews.llvm.org/D9152
>
> Added:
>     llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll
>     llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll
> Modified:
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
>
> Modified:
> llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp?rev=238452&r1=238451&r2=238452&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
> Thu May 28 13:39:17 2015
> @@ -483,12 +483,17 @@ static Instruction *combineLoadToOperati
>    }
>
>    // Fold away bit casts of the loaded value by loading the desired type.
> +  // We can do this for BitCastInsts as well as casts from and to pointer
> types,
> +  // as long as those are noops (i.e., the source or dest type have the
> same
> +  // bitwidth as the target's pointers).
>    if (LI.hasOneUse())
> -    if (auto *BC = dyn_cast<BitCastInst>(LI.user_back())) {
> -      LoadInst *NewLoad = combineLoadToNewType(IC, LI, BC->getDestTy());
> -      BC->replaceAllUsesWith(NewLoad);
> -      IC.EraseInstFromFunction(*BC);
> -      return &LI;
> +    if (auto* CI = dyn_cast<CastInst>(LI.user_back())) {
> +      if (CI->isNoopCast(DL)) {
> +        LoadInst *NewLoad = combineLoadToNewType(IC, LI, CI->getDestTy());
> +        CI->replaceAllUsesWith(NewLoad);
> +        IC.EraseInstFromFunction(*CI);
> +        return &LI;
> +      }
>      }
>
>    // FIXME: We should also canonicalize loads of vectors when their
> elements are
>
> Added: llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll?rev=238452&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll Thu May 28
> 13:39:17 2015
> @@ -0,0 +1,79 @@
> +; RUN: opt -instcombine -S < %s | FileCheck %s
> +
> +target datalayout = "p:32:32:32"
> +
> +
> +define i64* @test1(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test1(
> +; CHECK: load i64, i64*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i64*
> +  %b = load i64, i64* %a
> +  %c = inttoptr i64 %b to i64*
> +
> +  ret i64* %c
> +}
> +
> +define i32* @test2(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test2(
> +; CHECK: load i32*, i32**
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32*
> +  %b = load i32, i32* %a
> +  %c = inttoptr i32 %b to i32*
> +
> +  ret i32* %c
> +}
> +
> +define i64* @test3(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test3(
> +; CHECK: load i64*, i64**
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32*
> +  %b = load i32, i32* %a
> +  %c = inttoptr i32 %b to i64*
> +
> +  ret i64* %c
> +}
> +
> +define i64 @test4(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test4(
> +; CHECK: load i32, i32*
> +; CHECK: zext
> +; CHECK: ret
> +  %a = bitcast i8* %x to i64**
> +  %b = load i64*, i64** %a
> +  %c = ptrtoint i64* %b to i64
> +
> +  ret i64 %c
> +}
> +
> +define i32 @test5(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test5(
> +; CHECK: load i32, i32*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32**
> +  %b = load i32*, i32** %a
> +  %c = ptrtoint i32* %b to i32
> +
> +  ret i32 %c
> +}
> +
> +define i64 @test6(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test6(
> +; CHECK: load i32, i32*
> +; CHECK: zext
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32**
> +  %b = load i32*, i32** %a
> +  %c = ptrtoint i32* %b to i64
> +
> +  ret i64 %c
> +}
> +
>
> Added: llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll?rev=238452&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll Thu May 28
> 13:39:17 2015
> @@ -0,0 +1,78 @@
> +; RUN: opt -instcombine -S < %s | FileCheck %s
> +
> +target datalayout = "p:64:64:64"
> +
> +
> +define i64* @test1(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test1(
> +; CHECK: load i64*, i64**
> +; CHECK: ret
> +  %a = bitcast i8* %x to i64*
> +  %b = load i64, i64* %a
> +  %c = inttoptr i64 %b to i64*
> +
> +  ret i64* %c
> +}
> +
> +define i32* @test2(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test2(
> +; CHECK: load i32, i32*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32*
> +  %b = load i32, i32* %a
> +  %c = inttoptr i32 %b to i32*
> +
> +  ret i32* %c
> +}
> +
> +define i64* @test3(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test3(
> +; CHECK: load i32, i32*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32*
> +  %b = load i32, i32* %a
> +  %c = inttoptr i32 %b to i64*
> +
> +  ret i64* %c
> +}
> +
> +define i64 @test4(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test4(
> +; CHECK: load i64, i64*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i64**
> +  %b = load i64*, i64** %a
> +  %c = ptrtoint i64* %b to i64
> +
> +  ret i64 %c
> +}
> +
> +define i32 @test5(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test5(
> +; CHECK: load i64, i64*
> +; CHECK: trunc
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32**
> +  %b = load i32*, i32** %a
> +  %c = ptrtoint i32* %b to i32
> +
> +  ret i32 %c
> +}
> +
> +define i64 @test6(i8* %x) {
> +entry:
> +; CHECK-LABEL: @test6(
> +; CHECK: load i64, i64*
> +; CHECK: ret
> +  %a = bitcast i8* %x to i32**
> +  %b = load i32*, i32** %a
> +  %c = ptrtoint i32* %b to i64
> +
> +  ret i64 %c
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150528/982e272c/attachment.html>


More information about the llvm-commits mailing list