diff options
author | Lang Hames <lhames@gmail.com> | 2014-04-03 05:03:20 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-04-03 05:03:20 +0000 |
commit | 5a64ab6e032f81bb1d3d03cd957a37306b2b4b06 (patch) | |
tree | 9bcd574b2664dc7dfbe83b43d3f73be3353b4842 /lib/CodeGen | |
parent | 46aa8c8dae6693b442201c334d10503568bfdd70 (diff) | |
download | llvm-5a64ab6e032f81bb1d3d03cd957a37306b2b4b06.tar.gz llvm-5a64ab6e032f81bb1d3d03cd957a37306b2b4b06.tar.bz2 llvm-5a64ab6e032f81bb1d3d03cd957a37306b2b4b06.tar.xz |
[CodeGen] Fix peephole optimizer bug introduced in r205481. Fixes PR19318.
I should have read that comment a little more carefully. ;)
Regression test in the works, committing in the mean time to un-break people.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205511 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/PeepholeOptimizer.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/CodeGen/PeepholeOptimizer.cpp b/lib/CodeGen/PeepholeOptimizer.cpp index ca8334bf47..e18d963585 100644 --- a/lib/CodeGen/PeepholeOptimizer.cpp +++ b/lib/CodeGen/PeepholeOptimizer.cpp @@ -630,20 +630,22 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) { // earlier load into MI. if (!isLoadFoldable(MI, FoldAsLoadDefCandidates) && !FoldAsLoadDefCandidates.empty()) { - // We need to fold load after optimizeCmpInstr, since optimizeCmpInstr - // can enable folding by converting SUB to CMP. - // Save FoldAsLoadDefReg because optimizeLoadInstr() resets it and we - // need it for markUsesInDebugValueAsUndef(). const MCInstrDesc &MIDesc = MI->getDesc(); for (unsigned i = MIDesc.getNumDefs(); i != MIDesc.getNumOperands(); ++i) { const MachineOperand &MOp = MI->getOperand(i); if (!MOp.isReg()) continue; - unsigned TryFoldReg = MOp.getReg(); - if (FoldAsLoadDefCandidates.count(TryFoldReg)) { + unsigned FoldAsLoadDefReg = MOp.getReg(); + if (FoldAsLoadDefCandidates.count(FoldAsLoadDefReg)) { + // We need to fold load after optimizeCmpInstr, since + // optimizeCmpInstr can enable folding by converting SUB to CMP. + // Save FoldAsLoadDefReg because optimizeLoadInstr() resets it and + // we need it for markUsesInDebugValueAsUndef(). + unsigned FoldedReg = FoldAsLoadDefReg; MachineInstr *DefMI = 0; - MachineInstr *FoldMI = TII->optimizeLoadInstr(MI, MRI, TryFoldReg, + MachineInstr *FoldMI = TII->optimizeLoadInstr(MI, MRI, + FoldAsLoadDefReg, DefMI); if (FoldMI) { // Update LocalMIs since we replaced MI with FoldMI and deleted @@ -655,8 +657,8 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) { LocalMIs.insert(FoldMI); MI->eraseFromParent(); DefMI->eraseFromParent(); - MRI->markUsesInDebugValueAsUndef(TryFoldReg); - FoldAsLoadDefCandidates.erase(TryFoldReg); + MRI->markUsesInDebugValueAsUndef(FoldedReg); + FoldAsLoadDefCandidates.erase(FoldedReg); ++NumLoadFold; // MI is replaced with FoldMI. Changed = true; |