summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2011-02-14 21:50:37 +0000
committerEvan Cheng <evan.cheng@apple.com>2011-02-14 21:50:37 +0000
commit9bf3f8e08b56236f139b5fe017a5a4a2775192c4 (patch)
tree9250b1b3165f86027043ff5d757663551b3db67f /llvm/lib/CodeGen
parentc2448f6175a61930fdd6063d208c21d9ac8d7c5a (diff)
downloadbcm5719-llvm-9bf3f8e08b56236f139b5fe017a5a4a2775192c4.tar.gz
bcm5719-llvm-9bf3f8e08b56236f139b5fe017a5a4a2775192c4.zip
Fix PR8854. Track inserted copies to avoid read before write. Sorry, it's hard to reduce a sensible small test case.
llvm-svn: 125523
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/PeepholeOptimizer.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/PeepholeOptimizer.cpp b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
index 5f6ee306f48..3474f755b8e 100644
--- a/llvm/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
@@ -331,25 +331,37 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
ImmDefRegs.clear();
ImmDefMIs.clear();
+ MachineBasicBlock::iterator PMII = I->begin();
for (MachineBasicBlock::iterator
MII = I->begin(), MIE = I->end(); MII != MIE; ) {
- MachineInstr *MI = &*MII++;
+ MachineInstr *MI = &*MII;
LocalMIs.insert(MI);
if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() ||
MI->isKill() || MI->isInlineAsm() || MI->isDebugValue() ||
- MI->hasUnmodeledSideEffects())
+ MI->hasUnmodeledSideEffects()) {
+ ++MII;
continue;
+ }
if (MI->getDesc().isCompare()) {
- Changed |= OptimizeCmpInstr(MI, MBB);
- } else if (isMoveImmediate(MI, ImmDefRegs, ImmDefMIs)) {
+ if (OptimizeCmpInstr(MI, MBB)) {
+ // MI is deleted.
+ Changed = true;
+ MII = llvm::next(PMII);
+ continue;
+ }
+ }
+
+ if (isMoveImmediate(MI, ImmDefRegs, ImmDefMIs)) {
SeenMoveImm = true;
} else {
Changed |= OptimizeExtInstr(MI, MBB, LocalMIs);
if (SeenMoveImm)
Changed |= FoldImmediate(MI, MBB, ImmDefRegs, ImmDefMIs);
}
+ PMII = MII;
+ ++MII;
}
}
OpenPOWER on IntegriCloud