diff options
author | Roman Tereshin <rtereshin@apple.com> | 2019-01-19 03:37:25 +0000 |
---|---|---|
committer | Roman Tereshin <rtereshin@apple.com> | 2019-01-19 03:37:25 +0000 |
commit | a0383d6c1f41b53f64d609d28b6b783c6a0cf9d0 (patch) | |
tree | 5db456157a342e1a50be4c8950e058bc251fae98 /llvm/lib/CodeGen | |
parent | a32dd04238421e96768b312763241eb44e1333c4 (diff) | |
download | bcm5719-llvm-a0383d6c1f41b53f64d609d28b6b783c6a0cf9d0.tar.gz bcm5719-llvm-a0383d6c1f41b53f64d609d28b6b783c6a0cf9d0.zip |
Reapply "[CGP] Check for existing inttotpr before creating new one"
Original commit: r351582
llvm-svn: 351626
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index c35f8666fa3..56a4312cec6 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -4664,13 +4664,27 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // will look through it and provide only the integer value. In that case, // use it here. if (!DL->isNonIntegralPointerType(Addr->getType())) { + const auto getResultPtr = [MemoryInst, Addr, + &Builder](Value *Reg) -> Value * { + BasicBlock *BB = MemoryInst->getParent(); + for (User *U : Reg->users()) + if (auto *I2P = dyn_cast<IntToPtrInst>(U)) + if (I2P->getType() == Addr->getType() && I2P->getParent() == BB) { + auto *RegInst = dyn_cast<Instruction>(Reg); + if (RegInst && RegInst->getParent() == BB && + !isa<PHINode>(RegInst) && !RegInst->isEHPad()) + I2P->moveAfter(RegInst); + else + I2P->moveBefore(*BB, BB->getFirstInsertionPt()); + return I2P; + } + return Builder.CreateIntToPtr(Reg, Addr->getType(), "sunkaddr"); + }; if (!ResultPtr && AddrMode.BaseReg) { - ResultPtr = Builder.CreateIntToPtr(AddrMode.BaseReg, Addr->getType(), - "sunkaddr"); + ResultPtr = getResultPtr(AddrMode.BaseReg); AddrMode.BaseReg = nullptr; } else if (!ResultPtr && AddrMode.Scale == 1) { - ResultPtr = Builder.CreateIntToPtr(AddrMode.ScaledReg, Addr->getType(), - "sunkaddr"); + ResultPtr = getResultPtr(AddrMode.ScaledReg); AddrMode.Scale = 0; } } |