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

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 3 10:15:38 PST 2016


+llvm-commit
> On Feb 3, 2016, at 10:14 AM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
> Hi David,
> 
> Sorry to bring that commit up, but I’ve reverted it in r259674.
> According to git bisect, this is the root cause of a miscompile in Regex.
> I’ve put the detailed on how to reproduce in the commit message of r259674.
> 
> I am working on reducing the test case (which right now is a bootstrap, then build llvm-extract with lto).
> 
> I am guessing that the bug is not actually in this commit but exposes more opportunities to another optimization to go wrong.
> 
> Anyhow, I’ve reverted it, because we have some internal bots that hit this now.
> 
> Thanks,
> -Quentin
> 
>> On May 28, 2015, at 11:52 AM, David Majnemer <david.majnemer at gmail.com <mailto:david.majnemer at gmail.com>> wrote:
>> 
>> Patch by Philip Pfaffe!
>> 
>> On Thu, May 28, 2015 at 11:39 AM, David Majnemer <david.majnemer at gmail.com <mailto: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 <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=>
>> 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 <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=>
>> 
>> 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 <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=>
>> ==============================================================================
>> --- 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 <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=>
>> ==============================================================================
>> --- 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 <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=>
>> ==============================================================================
>> --- 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 <mailto:llvm-commits at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu <mailto: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/20160203/aa5c1555/attachment-0001.html>


More information about the llvm-commits mailing list