mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
Two changes:
1. Fold [mem] += (1|-1) into inc [mem]/dec [mem] to save some icache space. 2. Do not let token factor nodes prevent forming '[mem] op= val' folds. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19643 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a651cf67b7
commit
5c65981a57
@ -2242,18 +2242,51 @@ bool ISel::TryToFoldLoadOpStore(SDNode *Node) {
|
||||
assert(Node->getOpcode() == ISD::STORE && "Can only do this for stores!");
|
||||
SDOperand Chain = Node->getOperand(0);
|
||||
SDOperand StVal = Node->getOperand(1);
|
||||
SDOperand StPtr = Node->getOperand(2);
|
||||
|
||||
// The chain has to be a load, the stored value must be an integer binary
|
||||
// operation with one use.
|
||||
if (Chain.getOpcode() != ISD::LOAD || !StVal.Val->hasOneUse() ||
|
||||
StVal.Val->getNumOperands() != 2 ||
|
||||
if (!StVal.Val->hasOneUse() || StVal.Val->getNumOperands() != 2 ||
|
||||
MVT::isFloatingPoint(StVal.getValueType()))
|
||||
return false;
|
||||
|
||||
SDOperand TheLoad = Chain.getValue(0);
|
||||
// Token chain must either be a factor node or the load to fold.
|
||||
if (Chain.getOpcode() != ISD::LOAD && Chain.getOpcode() != ISD::TokenFactor)
|
||||
return false;
|
||||
|
||||
// Check to see if we are loading the same pointer that we're storing to.
|
||||
if (TheLoad.getOperand(1) != Node->getOperand(2))
|
||||
SDOperand TheLoad;
|
||||
|
||||
// Check to see if there is a load from the same pointer that we're storing
|
||||
// to in either operand of the binop.
|
||||
if (StVal.getOperand(0).getOpcode() == ISD::LOAD &&
|
||||
StVal.getOperand(0).getOperand(1) == StPtr)
|
||||
TheLoad = StVal.getOperand(0);
|
||||
else if (StVal.getOperand(1).getOpcode() == ISD::LOAD &&
|
||||
StVal.getOperand(1).getOperand(1) == StPtr)
|
||||
TheLoad = StVal.getOperand(1);
|
||||
else
|
||||
return false; // No matching load operand.
|
||||
|
||||
// We can only fold the load if there are no intervening side-effecting
|
||||
// operations. This means that the store uses the load as its token chain, or
|
||||
// there are only token factor nodes in between the store and load.
|
||||
if (Chain != TheLoad.getValue(1)) {
|
||||
// Okay, the other option is that we have a store referring to (possibly
|
||||
// nested) token factor nodes. For now, just try peeking through one level
|
||||
// of token factors to see if this is the case.
|
||||
bool ChainOk = false;
|
||||
if (Chain.getOpcode() == ISD::TokenFactor) {
|
||||
for (unsigned i = 0, e = Chain.getNumOperands(); i != e; ++i)
|
||||
if (Chain.getOperand(i) == TheLoad.getValue(1)) {
|
||||
ChainOk = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ChainOk) return false;
|
||||
}
|
||||
|
||||
if (TheLoad.getOperand(1) != StPtr)
|
||||
return false;
|
||||
|
||||
// Make sure that one of the operands of the binop is the load, and that the
|
||||
@ -2333,6 +2366,9 @@ bool ISel::TryToFoldLoadOpStore(SDNode *Node) {
|
||||
}
|
||||
|
||||
if (Opc) {
|
||||
LoweredTokens.insert(TheLoad.getValue(1));
|
||||
Select(Chain);
|
||||
|
||||
X86AddressMode AM;
|
||||
if (getRegPressure(TheLoad.getOperand(0)) >
|
||||
getRegPressure(TheLoad.getOperand(1))) {
|
||||
@ -2343,6 +2379,36 @@ bool ISel::TryToFoldLoadOpStore(SDNode *Node) {
|
||||
Select(TheLoad.getOperand(0));
|
||||
}
|
||||
|
||||
if (StVal.getOpcode() == ISD::ADD) {
|
||||
if (CN->getValue() == 1) {
|
||||
switch (Op0.getValueType()) {
|
||||
default: break;
|
||||
case MVT::i8:
|
||||
addFullAddress(BuildMI(BB, X86::INC8m, 4), AM);
|
||||
return true;
|
||||
case MVT::i16: Opc = TabPtr[1];
|
||||
addFullAddress(BuildMI(BB, X86::INC16m, 4), AM);
|
||||
return true;
|
||||
case MVT::i32: Opc = TabPtr[2];
|
||||
addFullAddress(BuildMI(BB, X86::INC32m, 4), AM);
|
||||
return true;
|
||||
}
|
||||
} else if (CN->getValue()+1 == 0) { // [X] += -1 -> DEC [X]
|
||||
switch (Op0.getValueType()) {
|
||||
default: break;
|
||||
case MVT::i8:
|
||||
addFullAddress(BuildMI(BB, X86::DEC8m, 4), AM);
|
||||
return true;
|
||||
case MVT::i16: Opc = TabPtr[1];
|
||||
addFullAddress(BuildMI(BB, X86::DEC16m, 4), AM);
|
||||
return true;
|
||||
case MVT::i32: Opc = TabPtr[2];
|
||||
addFullAddress(BuildMI(BB, X86::DEC32m, 4), AM);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
addFullAddress(BuildMI(BB, Opc, 4+1),AM).addImm(CN->getValue());
|
||||
return true;
|
||||
}
|
||||
@ -2365,6 +2431,9 @@ bool ISel::TryToFoldLoadOpStore(SDNode *Node) {
|
||||
case MVT::i32: Opc = TabPtr[5]; break;
|
||||
}
|
||||
|
||||
LoweredTokens.insert(TheLoad.getValue(1));
|
||||
Select(Chain);
|
||||
|
||||
Select(TheLoad.getOperand(0));
|
||||
X86AddressMode AM;
|
||||
SelectAddress(TheLoad.getOperand(1), AM);
|
||||
|
Loading…
x
Reference in New Issue
Block a user