summaryrefslogtreecommitdiff
path: root/lib/CodeGen/PeepholeOptimizer.cpp
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
commitcf75ab597514effb6f8e915f05d74f45debb89ec (patch)
tree7741739b9c806f0c85fb5a6c0f3d22b76fc1f3c5 /lib/CodeGen/PeepholeOptimizer.cpp
parente98d646b1194c522b121e1a70906efe4ea578fc8 (diff)
downloadllvm-cf75ab597514effb6f8e915f05d74f45debb89ec.tar.gz
llvm-cf75ab597514effb6f8e915f05d74f45debb89ec.tar.bz2
llvm-cf75ab597514effb6f8e915f05d74f45debb89ec.tar.xz
Fix PR8854. Track inserted copies to avoid read before write. Sorry, it's hard to reduce a sensible small test case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125523 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PeepholeOptimizer.cpp')
-rw-r--r--lib/CodeGen/PeepholeOptimizer.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/CodeGen/PeepholeOptimizer.cpp b/lib/CodeGen/PeepholeOptimizer.cpp
index 5f6ee306f4..3474f755b8 100644
--- a/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/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;
}
}