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 | bf43525a2933c3ddb60f00a89e22c52c06bc77d6 (patch) | |
tree | 67d758041cb871ce6792661e98740b56066d4965 /llvm/lib/CodeGen | |
parent | 6b8232ff82f85f40ecda480f2852bf5ec8ccf87c (diff) | |
download | bcm5719-llvm-bf43525a2933c3ddb60f00a89e22c52c06bc77d6.tar.gz bcm5719-llvm-bf43525a2933c3ddb60f00a89e22c52c06bc77d6.zip |
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.
llvm-svn: 93895
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/OptimizeExts.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/OptimizeExts.cpp b/llvm/lib/CodeGen/OptimizeExts.cpp index 625ff89f90e..096f9d4ab46 100644 --- a/llvm/lib/CodeGen/OptimizeExts.cpp +++ b/llvm/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) |