<div dir="ltr">Patch by Philip Pfaffe!</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 28, 2015 at 11:39 AM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Thu May 28 13:39:17 2015<br>
New Revision: 238452<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D238452-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=olNjq2h6jOqNEfp-gkn0gkdSmC_Cq2PIHP67QCufkSY&s=sY9wqRVuCtMcwCgMuzhFlmNBzaeMHGzxurg-FS2sE_w&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=238452&view=rev</a><br>
Log:<br>
[InstCombine] Fold IntToPtr and PtrToInt into preceding loads.<br>
<br>
Currently we only fold a BitCast into a Load when the BitCast is its<br>
only user.<br>
<br>
Do the same for any no-op cast.<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9152&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=olNjq2h6jOqNEfp-gkn0gkdSmC_Cq2PIHP67QCufkSY&s=0ErPMlQC5TI1p-lxa0ZTYmfyih7fQVsAo9kgeBsBiLo&e=" target="_blank">http://reviews.llvm.org/D9152</a><br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll<br>
    llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_InstCombine_InstCombineLoadStoreAlloca.cpp-3Frev-3D238452-26r1-3D238451-26r2-3D238452-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=olNjq2h6jOqNEfp-gkn0gkdSmC_Cq2PIHP67QCufkSY&s=QM30wzxtVasww-Km95KLdBoCNDt_25E5FeFDPrMWQp4&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp?rev=238452&r1=238451&r2=238452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp Thu May 28 13:39:17 2015<br>
@@ -483,12 +483,17 @@ static Instruction *combineLoadToOperati<br>
   }<br>
<br>
   // Fold away bit casts of the loaded value by loading the desired type.<br>
+  // We can do this for BitCastInsts as well as casts from and to pointer types,<br>
+  // as long as those are noops (i.e., the source or dest type have the same<br>
+  // bitwidth as the target's pointers).<br>
   if (LI.hasOneUse())<br>
-    if (auto *BC = dyn_cast<BitCastInst>(LI.user_back())) {<br>
-      LoadInst *NewLoad = combineLoadToNewType(IC, LI, BC->getDestTy());<br>
-      BC->replaceAllUsesWith(NewLoad);<br>
-      IC.EraseInstFromFunction(*BC);<br>
-      return &LI;<br>
+    if (auto* CI = dyn_cast<CastInst>(LI.user_back())) {<br>
+      if (CI->isNoopCast(DL)) {<br>
+        LoadInst *NewLoad = combineLoadToNewType(IC, LI, CI->getDestTy());<br>
+        CI->replaceAllUsesWith(NewLoad);<br>
+        IC.EraseInstFromFunction(*CI);<br>
+        return &LI;<br>
+      }<br>
     }<br>
<br>
   // FIXME: We should also canonicalize loads of vectors when their elements are<br>
<br>
Added: llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_InstCombine_load-2Dbitcast32.ll-3Frev-3D238452-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=olNjq2h6jOqNEfp-gkn0gkdSmC_Cq2PIHP67QCufkSY&s=NrPn-jA9V0ieNNsVOi8wYa31xU_WEeNqb6Qk8C4cnJA&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll?rev=238452&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll (added)<br>
+++ llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll Thu May 28 13:39:17 2015<br>
@@ -0,0 +1,79 @@<br>
+; RUN: opt -instcombine -S < %s | FileCheck %s<br>
+<br>
+target datalayout = "p:32:32:32"<br>
+<br>
+<br>
+define i64* @test1(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test1(<br>
+; CHECK: load i64, i64*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i64*<br>
+  %b = load i64, i64* %a<br>
+  %c = inttoptr i64 %b to i64*<br>
+<br>
+  ret i64* %c<br>
+}<br>
+<br>
+define i32* @test2(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test2(<br>
+; CHECK: load i32*, i32**<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32*<br>
+  %b = load i32, i32* %a<br>
+  %c = inttoptr i32 %b to i32*<br>
+<br>
+  ret i32* %c<br>
+}<br>
+<br>
+define i64* @test3(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test3(<br>
+; CHECK: load i64*, i64**<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32*<br>
+  %b = load i32, i32* %a<br>
+  %c = inttoptr i32 %b to i64*<br>
+<br>
+  ret i64* %c<br>
+}<br>
+<br>
+define i64 @test4(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test4(<br>
+; CHECK: load i32, i32*<br>
+; CHECK: zext<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i64**<br>
+  %b = load i64*, i64** %a<br>
+  %c = ptrtoint i64* %b to i64<br>
+<br>
+  ret i64 %c<br>
+}<br>
+<br>
+define i32 @test5(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test5(<br>
+; CHECK: load i32, i32*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32**<br>
+  %b = load i32*, i32** %a<br>
+  %c = ptrtoint i32* %b to i32<br>
+<br>
+  ret i32 %c<br>
+}<br>
+<br>
+define i64 @test6(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test6(<br>
+; CHECK: load i32, i32*<br>
+; CHECK: zext<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32**<br>
+  %b = load i32*, i32** %a<br>
+  %c = ptrtoint i32* %b to i64<br>
+<br>
+  ret i64 %c<br>
+}<br>
+<br>
<br>
Added: llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_InstCombine_load-2Dbitcast64.ll-3Frev-3D238452-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=olNjq2h6jOqNEfp-gkn0gkdSmC_Cq2PIHP67QCufkSY&s=Ct7qAC1oyddLnff8X5WXL8bZlU4kgWSD4P7ZT45sFt8&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll?rev=238452&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll (added)<br>
+++ llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll Thu May 28 13:39:17 2015<br>
@@ -0,0 +1,78 @@<br>
+; RUN: opt -instcombine -S < %s | FileCheck %s<br>
+<br>
+target datalayout = "p:64:64:64"<br>
+<br>
+<br>
+define i64* @test1(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test1(<br>
+; CHECK: load i64*, i64**<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i64*<br>
+  %b = load i64, i64* %a<br>
+  %c = inttoptr i64 %b to i64*<br>
+<br>
+  ret i64* %c<br>
+}<br>
+<br>
+define i32* @test2(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test2(<br>
+; CHECK: load i32, i32*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32*<br>
+  %b = load i32, i32* %a<br>
+  %c = inttoptr i32 %b to i32*<br>
+<br>
+  ret i32* %c<br>
+}<br>
+<br>
+define i64* @test3(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test3(<br>
+; CHECK: load i32, i32*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32*<br>
+  %b = load i32, i32* %a<br>
+  %c = inttoptr i32 %b to i64*<br>
+<br>
+  ret i64* %c<br>
+}<br>
+<br>
+define i64 @test4(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test4(<br>
+; CHECK: load i64, i64*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i64**<br>
+  %b = load i64*, i64** %a<br>
+  %c = ptrtoint i64* %b to i64<br>
+<br>
+  ret i64 %c<br>
+}<br>
+<br>
+define i32 @test5(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test5(<br>
+; CHECK: load i64, i64*<br>
+; CHECK: trunc<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32**<br>
+  %b = load i32*, i32** %a<br>
+  %c = ptrtoint i32* %b to i32<br>
+<br>
+  ret i32 %c<br>
+}<br>
+<br>
+define i64 @test6(i8* %x) {<br>
+entry:<br>
+; CHECK-LABEL: @test6(<br>
+; CHECK: load i64, i64*<br>
+; CHECK: ret<br>
+  %a = bitcast i8* %x to i32**<br>
+  %b = load i32*, i32** %a<br>
+  %c = ptrtoint i32* %b to i64<br>
+<br>
+  ret i64 %c<br>
+}<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>