Provide size information when checking to see if we can LICM a load, this
authorChris Lattner <sabre@nondot.org>
Fri, 26 Nov 2004 21:20:09 +0000 (21:20 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 26 Nov 2004 21:20:09 +0000 (21:20 +0000)
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

index 435bb4bb0842328707dc1a0563aa664ad57bed31..e9f2b330eefbb04dfc58f4ea5d11cd30ee7ac0bf 100644 (file)
@@ -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<CallInst>(&I)) {
     // Handle obvious cases efficiently.
     if (Function *Callee = CI->getCalledFunction()) {