mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[DAG] Move canFoldInAddressingMode before foldBinOpIntoSelect. NFC.
Reduces the diff in D90113.
This commit is contained in:
parent
7df4051e58
commit
25e5e32d22
@ -2022,6 +2022,62 @@ static ConstantSDNode *getAsNonOpaqueConstant(SDValue N) {
|
|||||||
return Const != nullptr && !Const->isOpaque() ? Const : nullptr;
|
return Const != nullptr && !Const->isOpaque() ? Const : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return true if 'Use' is a load or a store that uses N as its base pointer
|
||||||
|
/// and that N may be folded in the load / store addressing mode.
|
||||||
|
static bool canFoldInAddressingMode(SDNode *N, SDNode *Use, SelectionDAG &DAG,
|
||||||
|
const TargetLowering &TLI) {
|
||||||
|
EVT VT;
|
||||||
|
unsigned AS;
|
||||||
|
|
||||||
|
if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Use)) {
|
||||||
|
if (LD->isIndexed() || LD->getBasePtr().getNode() != N)
|
||||||
|
return false;
|
||||||
|
VT = LD->getMemoryVT();
|
||||||
|
AS = LD->getAddressSpace();
|
||||||
|
} else if (StoreSDNode *ST = dyn_cast<StoreSDNode>(Use)) {
|
||||||
|
if (ST->isIndexed() || ST->getBasePtr().getNode() != N)
|
||||||
|
return false;
|
||||||
|
VT = ST->getMemoryVT();
|
||||||
|
AS = ST->getAddressSpace();
|
||||||
|
} else if (MaskedLoadSDNode *LD = dyn_cast<MaskedLoadSDNode>(Use)) {
|
||||||
|
if (LD->isIndexed() || LD->getBasePtr().getNode() != N)
|
||||||
|
return false;
|
||||||
|
VT = LD->getMemoryVT();
|
||||||
|
AS = LD->getAddressSpace();
|
||||||
|
} else if (MaskedStoreSDNode *ST = dyn_cast<MaskedStoreSDNode>(Use)) {
|
||||||
|
if (ST->isIndexed() || ST->getBasePtr().getNode() != N)
|
||||||
|
return false;
|
||||||
|
VT = ST->getMemoryVT();
|
||||||
|
AS = ST->getAddressSpace();
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
TargetLowering::AddrMode AM;
|
||||||
|
if (N->getOpcode() == ISD::ADD) {
|
||||||
|
AM.HasBaseReg = true;
|
||||||
|
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
||||||
|
if (Offset)
|
||||||
|
// [reg +/- imm]
|
||||||
|
AM.BaseOffs = Offset->getSExtValue();
|
||||||
|
else
|
||||||
|
// [reg +/- reg]
|
||||||
|
AM.Scale = 1;
|
||||||
|
} else if (N->getOpcode() == ISD::SUB) {
|
||||||
|
AM.HasBaseReg = true;
|
||||||
|
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
||||||
|
if (Offset)
|
||||||
|
// [reg +/- imm]
|
||||||
|
AM.BaseOffs = -Offset->getSExtValue();
|
||||||
|
else
|
||||||
|
// [reg +/- reg]
|
||||||
|
AM.Scale = 1;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return TLI.isLegalAddressingMode(DAG.getDataLayout(), AM,
|
||||||
|
VT.getTypeForEVT(*DAG.getContext()), AS);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue DAGCombiner::foldBinOpIntoSelect(SDNode *BO) {
|
SDValue DAGCombiner::foldBinOpIntoSelect(SDNode *BO) {
|
||||||
assert(TLI.isBinOp(BO->getOpcode()) && BO->getNumValues() == 1 &&
|
assert(TLI.isBinOp(BO->getOpcode()) && BO->getNumValues() == 1 &&
|
||||||
"Unexpected binary operator");
|
"Unexpected binary operator");
|
||||||
@ -14372,63 +14428,6 @@ SDValue DAGCombiner::visitBR_CC(SDNode *N) {
|
|||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if 'Use' is a load or a store that uses N as its base pointer
|
|
||||||
/// and that N may be folded in the load / store addressing mode.
|
|
||||||
static bool canFoldInAddressingMode(SDNode *N, SDNode *Use,
|
|
||||||
SelectionDAG &DAG,
|
|
||||||
const TargetLowering &TLI) {
|
|
||||||
EVT VT;
|
|
||||||
unsigned AS;
|
|
||||||
|
|
||||||
if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Use)) {
|
|
||||||
if (LD->isIndexed() || LD->getBasePtr().getNode() != N)
|
|
||||||
return false;
|
|
||||||
VT = LD->getMemoryVT();
|
|
||||||
AS = LD->getAddressSpace();
|
|
||||||
} else if (StoreSDNode *ST = dyn_cast<StoreSDNode>(Use)) {
|
|
||||||
if (ST->isIndexed() || ST->getBasePtr().getNode() != N)
|
|
||||||
return false;
|
|
||||||
VT = ST->getMemoryVT();
|
|
||||||
AS = ST->getAddressSpace();
|
|
||||||
} else if (MaskedLoadSDNode *LD = dyn_cast<MaskedLoadSDNode>(Use)) {
|
|
||||||
if (LD->isIndexed() || LD->getBasePtr().getNode() != N)
|
|
||||||
return false;
|
|
||||||
VT = LD->getMemoryVT();
|
|
||||||
AS = LD->getAddressSpace();
|
|
||||||
} else if (MaskedStoreSDNode *ST = dyn_cast<MaskedStoreSDNode>(Use)) {
|
|
||||||
if (ST->isIndexed() || ST->getBasePtr().getNode() != N)
|
|
||||||
return false;
|
|
||||||
VT = ST->getMemoryVT();
|
|
||||||
AS = ST->getAddressSpace();
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
|
|
||||||
TargetLowering::AddrMode AM;
|
|
||||||
if (N->getOpcode() == ISD::ADD) {
|
|
||||||
AM.HasBaseReg = true;
|
|
||||||
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
|
||||||
if (Offset)
|
|
||||||
// [reg +/- imm]
|
|
||||||
AM.BaseOffs = Offset->getSExtValue();
|
|
||||||
else
|
|
||||||
// [reg +/- reg]
|
|
||||||
AM.Scale = 1;
|
|
||||||
} else if (N->getOpcode() == ISD::SUB) {
|
|
||||||
AM.HasBaseReg = true;
|
|
||||||
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
|
||||||
if (Offset)
|
|
||||||
// [reg +/- imm]
|
|
||||||
AM.BaseOffs = -Offset->getSExtValue();
|
|
||||||
else
|
|
||||||
// [reg +/- reg]
|
|
||||||
AM.Scale = 1;
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return TLI.isLegalAddressingMode(DAG.getDataLayout(), AM,
|
|
||||||
VT.getTypeForEVT(*DAG.getContext()), AS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool getCombineLoadStoreParts(SDNode *N, unsigned Inc, unsigned Dec,
|
static bool getCombineLoadStoreParts(SDNode *N, unsigned Inc, unsigned Dec,
|
||||||
bool &IsLoad, bool &IsMasked, SDValue &Ptr,
|
bool &IsLoad, bool &IsMasked, SDValue &Ptr,
|
||||||
const TargetLowering &TLI) {
|
const TargetLowering &TLI) {
|
||||||
|
Loading…
Reference in New Issue
Block a user