diff options
| author | Dan Gohman <gohman@apple.com> | 2010-06-22 02:07:21 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2010-06-22 02:07:21 +0000 |
| commit | 2370e2fe0f7585c2215aca9051db84640d41ee8a (patch) | |
| tree | 9802e44607c0641df5d10efa069d500745297a50 /llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | |
| parent | b6e058da187de7d9ec86a57d78044379543d0203 (diff) | |
| download | bcm5719-llvm-2370e2fe0f7585c2215aca9051db84640d41ee8a.tar.gz bcm5719-llvm-2370e2fe0f7585c2215aca9051db84640d41ee8a.zip | |
When unfolding a load, avoid assuming which instruction that
kill and dead flags will end up on.
llvm-svn: 106520
Diffstat (limited to 'llvm/lib/CodeGen/TwoAddressInstructionPass.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 017d8b772f9..0c97dad48b8 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -964,10 +964,24 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi, if (MO.isReg() && MO.getReg() != 0 && TargetRegisterInfo::isVirtualRegister(MO.getReg())) { if (MO.isUse()) { - if (MO.isKill()) - LV->replaceKillInstruction(MO.getReg(), mi, NewMIs[0]); - } else if (LV->removeVirtualRegisterDead(MO.getReg(), mi)) - LV->addVirtualRegisterDead(MO.getReg(), NewMIs[1]); + if (MO.isKill()) { + if (NewMIs[0]->killsRegister(MO.getReg())) + LV->replaceKillInstruction(MO.getReg(), mi, NewMIs[0]); + else { + assert(NewMIs[1]->killsRegister(MO.getReg()) && + "Kill missing after load unfold!"); + LV->replaceKillInstruction(MO.getReg(), mi, NewMIs[1]); + } + } + } else if (LV->removeVirtualRegisterDead(MO.getReg(), mi)) { + if (NewMIs[1]->registerDefIsDead(MO.getReg())) + LV->addVirtualRegisterDead(MO.getReg(), NewMIs[1]); + else { + assert(NewMIs[0]->registerDefIsDead(MO.getReg()) && + "Dead flag missing after load unfold!"); + LV->addVirtualRegisterDead(MO.getReg(), NewMIs[0]); + } + } } } LV->addVirtualRegisterKilled(Reg, NewMIs[1]); |

