mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
We need to verify that the machine instruction we're using as a replacement for
our current machine instruction defines a register with the same register class as what's being replaced. This showed up in the SPEC 403.gcc benchmark, where it would ICE because a tail call was expecting one register class but was given another. (The machine instruction verifier catches this situation.) <rdar://problem/10270968> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141830 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -430,13 +430,24 @@ bool MachineCSE::ProcessBlock(MachineBasicBlock *MBB) {
|
||||
unsigned NewReg = CSMI->getOperand(i).getReg();
|
||||
if (OldReg == NewReg)
|
||||
continue;
|
||||
|
||||
assert(TargetRegisterInfo::isVirtualRegister(OldReg) &&
|
||||
TargetRegisterInfo::isVirtualRegister(NewReg) &&
|
||||
"Do not CSE physical register defs!");
|
||||
|
||||
if (!isProfitableToCSE(NewReg, OldReg, CSMI, MI)) {
|
||||
DoCSE = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// Don't perform CSE if the result of the old instruction cannot exist
|
||||
// within the register class of the new instruction.
|
||||
const TargetRegisterClass *OldRC = MRI->getRegClass(OldReg);
|
||||
if (!MRI->constrainRegClass(NewReg, OldRC)) {
|
||||
DoCSE = false;
|
||||
break;
|
||||
}
|
||||
|
||||
CSEPairs.push_back(std::make_pair(OldReg, NewReg));
|
||||
--NumDefs;
|
||||
}
|
||||
|
Reference in New Issue
Block a user