aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-01-04 07:27:30 +0000
committerChris Lattner <sabre@nondot.org>2011-01-04 07:27:30 +0000
commitb7e9ef0ed1e246bd64d97a768555c8334c0d86e9 (patch)
tree51cd09d1d636f40cbe3bc5783bec88db1cf7aa15
parent645b1d2f12e6637840d3b118231f60b3a587073a (diff)
restructure this a bit. Initialize the WeakVH with "I", the
instruction *after* the store. The store will always be deleted if the transformation kicks in, so we'd do an N^2 scan of every loop block. Whoops. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122805 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/LoopIdiomRecognize.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
index fc707755e9..d67f6c1e95 100644
--- a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
+++ b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
@@ -207,19 +207,22 @@ bool LoopIdiomRecognize::runOnLoopBlock(BasicBlock *BB, const SCEV *BECount,
bool MadeChange = false;
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
- // Look for store instructions, which may be memsets.
- StoreInst *SI = dyn_cast<StoreInst>(I++);
- if (SI == 0 || SI->isVolatile()) continue;
+ Instruction *Inst = I++;
+ // Look for store instructions, which may be optimized to memset/memcpy.
+ if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
+ if (SI->isVolatile()) continue;
- WeakVH InstPtr(SI);
- if (!processLoopStore(SI, BECount)) continue;
-
- MadeChange = true;
+ WeakVH InstPtr(I);
+ if (!processLoopStore(SI, BECount)) continue;
+ MadeChange = true;
+
+ // If processing the store invalidated our iterator, start over from the
+ // head of the loop.
+ if (InstPtr == 0)
+ I = BB->begin();
+ continue;
+ }
- // If processing the store invalidated our iterator, start over from the
- // head of the loop.
- if (InstPtr == 0)
- I = BB->begin();
}
return MadeChange;