From f3e1d6977ee5fb6b66df314d65e28e2c35d6e244 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 26 Nov 2004 21:20:09 +0000 Subject: [PATCH] Provide size information when checking to see if we can LICM a load, this allows us to hoist more loads in some cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18265 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LICM.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 435bb4bb084..e9f2b330eef 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -170,9 +170,9 @@ namespace { /// pointerInvalidatedByLoop - Return true if the body of this loop may /// store into the memory location pointed to by V. /// - bool pointerInvalidatedByLoop(Value *V) { + bool pointerInvalidatedByLoop(Value *V, unsigned Size) { // Check to see if any of the basic blocks in CurLoop invalidate *V. - return CurAST->getAliasSetForPointer(V, 0).isMod(); + return CurAST->getAliasSetForPointer(V, Size).isMod(); } bool canSinkOrHoistInst(Instruction &I); @@ -351,7 +351,10 @@ bool LICM::canSinkOrHoistInst(Instruction &I) { return false; // Don't hoist volatile loads! // Don't hoist loads which have may-aliased stores in loop. - return !pointerInvalidatedByLoop(LI->getOperand(0)); + unsigned Size = 0; + if (LI->getType()->isSized()) + Size = AA->getTargetData().getTypeSize(LI->getType()); + return !pointerInvalidatedByLoop(LI->getOperand(0), Size); } else if (CallInst *CI = dyn_cast(&I)) { // Handle obvious cases efficiently. if (Function *Callee = CI->getCalledFunction()) {