summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorRoman Tereshin <rtereshin@apple.com>2019-01-19 01:41:03 +0000
committerRoman Tereshin <rtereshin@apple.com>2019-01-19 01:41:03 +0000
commitdd6f9f68bb55696b7335f44941291cb3fe1e1b31 (patch)
tree83a735ed2ca052f1db0920b1c7a9388a0ecb9fff /llvm/lib/CodeGen
parentd5015edb37173444caccb03680656722fafd3643 (diff)
downloadbcm5719-llvm-dd6f9f68bb55696b7335f44941291cb3fe1e1b31.tar.gz
bcm5719-llvm-dd6f9f68bb55696b7335f44941291cb3fe1e1b31.zip
Reapply "[CGP] Check for existing inttotpr before creating new one"
Original commit: r351582 llvm-svn: 351618
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/CodeGenPrepare.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index c35f8666fa3..e33178c961d 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -4664,13 +4664,26 @@ 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) {
+ if (isa<Instruction>(Reg) &&
+ cast<Instruction>(Reg)->getParent() == BB)
+ I2P->moveAfter(cast<Instruction>(Reg));
+ else
+ I2P->moveBefore(BB->getFirstNonPHI());
+ 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;
}
}
OpenPOWER on IntegriCloud