[SimplifyCFG] Use the error checking provided by getPrevNode.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 15 Oct 2016 13:15:05 +0000 (13:15 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 15 Oct 2016 13:15:05 +0000 (13:15 +0000)
BasicBlock::size is O(insts), making this loop O(blocks*insts), which
can be really slow on generated code. getPrevNode already checks if
we're at the beginning of the block and returns nullptr if so, just use
that instead. No functionality change intended.

llvm-svn: 284303

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

index a45a0c7..21bb87b 100644 (file)
@@ -1584,12 +1584,15 @@ namespace {
       Fail = false;
       Insts.clear();
       for (auto *BB : Blocks) {
-        if (BB->size() <= 1) {
-          // Block wasn't big enough
-          Fail = true;
-          return;
+        if (Instruction *Terminator = BB->getTerminator()) {
+          if (Instruction *LastNonTerminator = Terminator->getPrevNode()) {
+            Insts.push_back(LastNonTerminator);
+            continue;
+          }
         }
-        Insts.push_back(BB->getTerminator()->getPrevNode());
+        // Block wasn't big enough.
+        Fail = true;
+        return;
       }
     }
 
@@ -1601,11 +1604,12 @@ namespace {
       if (Fail)
         return;
       for (auto *&Inst : Insts) {
-        if (Inst == &Inst->getParent()->front()) {
+        Inst = Inst->getPrevNode();
+        // Already at beginning of block.
+        if (!Inst) {
           Fail = true;
           return;
         }
-        Inst = Inst->getPrevNode();
       }
     }