diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-01-19 19:45:51 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-01-19 19:45:51 +0000 |
commit | 590d16be6f335da07c66f3c92693d0e8a2f40069 (patch) | |
tree | 09708195f1b3d6aae1d8e9770c05efe1c4eb985e /lib/CodeGen/OptimizeExts.cpp | |
parent | 91093ecf0fed6f007e08f1a4531cdb6f438672a2 (diff) |
Do not extend extension results beyond the use of a PHI instruction at the start of a use block. A PHI use is expected to kill its source values.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93895 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/OptimizeExts.cpp')
-rw-r--r-- | lib/CodeGen/OptimizeExts.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/CodeGen/OptimizeExts.cpp b/lib/CodeGen/OptimizeExts.cpp index 625ff89f90..096f9d4ab4 100644 --- a/lib/CodeGen/OptimizeExts.cpp +++ b/lib/CodeGen/OptimizeExts.cpp @@ -143,11 +143,23 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB, // Now replace all uses. if (!Uses.empty()) { + SmallPtrSet<MachineBasicBlock*, 4> PHIBBs; + // Look for PHI uses of the extended result, we don't want to extend the + // liveness of a PHI input. It breaks all kinds of assumptions down + // stream. A PHI use is expected to be the kill of its source values. + UI = MRI->use_begin(DstReg); + for (MachineRegisterInfo::use_iterator UE = MRI->use_end(); UI != UE; + ++UI) + if (UI->getOpcode() == TargetInstrInfo::PHI) + PHIBBs.insert(UI->getParent()); + const TargetRegisterClass *RC = MRI->getRegClass(SrcReg); for (unsigned i = 0, e = Uses.size(); i != e; ++i) { MachineOperand *UseMO = Uses[i]; MachineInstr *UseMI = UseMO->getParent(); MachineBasicBlock *UseMBB = UseMI->getParent(); + if (PHIBBs.count(UseMBB)) + continue; unsigned NewVR = MRI->createVirtualRegister(RC); BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(), TII->get(TargetInstrInfo::EXTRACT_SUBREG), NewVR) |