mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-06 05:33:28 +00:00
Codegen factor nodes more intelligently according to perceived register pressure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19532 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5a6c6d98d5
commit
1d50b7fa53
@ -2088,8 +2088,20 @@ void ISel::Select(SDOperand N) {
|
|||||||
assert(0 && "Node not handled yet!");
|
assert(0 && "Node not handled yet!");
|
||||||
case ISD::EntryToken: return; // Noop
|
case ISD::EntryToken: return; // Noop
|
||||||
case ISD::TokenFactor:
|
case ISD::TokenFactor:
|
||||||
|
if (Node->getNumOperands() == 2) {
|
||||||
|
bool OneFirst =
|
||||||
|
getRegPressure(Node->getOperand(1))>getRegPressure(Node->getOperand(0));
|
||||||
|
Select(Node->getOperand(OneFirst));
|
||||||
|
Select(Node->getOperand(!OneFirst));
|
||||||
|
} else {
|
||||||
|
std::vector<std::pair<unsigned, unsigned> > OpsP;
|
||||||
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
|
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
|
||||||
Select(Node->getOperand(i));
|
OpsP.push_back(std::make_pair(getRegPressure(Node->getOperand(i)), i));
|
||||||
|
std::sort(OpsP.begin(), OpsP.end());
|
||||||
|
std::reverse(OpsP.begin(), OpsP.end());
|
||||||
|
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
|
||||||
|
Select(Node->getOperand(OpsP[i].second));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case ISD::CopyToReg:
|
case ISD::CopyToReg:
|
||||||
if (getRegPressure(N.getOperand(0)) > getRegPressure(N.getOperand(1))) {
|
if (getRegPressure(N.getOperand(0)) > getRegPressure(N.getOperand(1))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user