Implement trivial sinking for load instructions. This causes us to sink 567 loads...
authorChris Lattner <sabre@nondot.org>
Thu, 9 Dec 2004 07:14:34 +0000 (07:14 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 9 Dec 2004 07:14:34 +0000 (07:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18692 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 9e37d96f59e1245b0d47053415235168fc6d37fb..40b2d4854379343e40b242f7495bf4c2b39ae203 100644 (file)
@@ -4206,7 +4206,17 @@ static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) {
   if (isa<AllocaInst>(I) && I->getParent() == &DestBlock->getParent()->front())
     return false;
 
-  if (isa<LoadInst>(I)) return false;
+  // We can only sink load instructions if there is nothing between the load and
+  // the end of block that could change the value.
+  if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
+    if (LI->isVolatile()) return false;  // Don't sink volatile loads.
+
+    for (BasicBlock::iterator Scan = LI, E = LI->getParent()->end();
+         Scan != E; ++Scan)
+      if (Scan->mayWriteToMemory())
+        return false;
+    std::cerr << "SUNK LOAD: " << *LI;
+  }
 
   BasicBlock::iterator InsertPos = DestBlock->begin();
   while (isa<PHINode>(InsertPos)) ++InsertPos;