From 85a0467a11bc748a242a858dfb950fce2956fa79 Mon Sep 17 00:00:00 2001 From: Roman Tereshin Date: Fri, 18 Jan 2019 20:13:42 +0000 Subject: [CGP] Check for existing inttotpr before creating new one Make sure CodeGenPrepare doesn't emit multiple inttoptr instructions of the same integer value while sinking address computations, but rather CSEs them on the fly: excessive inttoptr's confuse SCEV into thinking that related pointers have nothing to do with each other. This problem blocks LoadStoreVectorizer from vectorizing some of the loads / stores in a downstream target. Reviewed By: hfinkel Differential Revision: https://reviews.llvm.org/D56838 llvm-svn: 351582 --- llvm/lib/CodeGen/CodeGenPrepare.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'llvm/lib/CodeGen') diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index c35f866..0c7c9de 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -4664,13 +4664,22 @@ 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 * { + for (User *U : Reg->users()) + if (auto *I2P = dyn_cast(U)) + if (I2P->getType() == Addr->getType() && + I2P->getParent() == MemoryInst->getParent()) { + I2P->moveBefore(MemoryInst->getParent()->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; } } -- cgit v1.1