mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-19 10:53:55 +00:00
flags -> glue for selectiondag
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122509 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a4359be032
commit
29d8f0cae4
@ -398,21 +398,21 @@ public:
|
||||
}
|
||||
|
||||
// This version of the getCopyToReg method takes an extra operand, which
|
||||
// indicates that there is potentially an incoming flag value (if Flag is not
|
||||
// null) and that there should be a flag result.
|
||||
// indicates that there is potentially an incoming glue value (if Glue is not
|
||||
// null) and that there should be a glue result.
|
||||
SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
|
||||
SDValue Flag) {
|
||||
SDValue Glue) {
|
||||
SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
|
||||
SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
|
||||
return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
|
||||
SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Glue };
|
||||
return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
|
||||
}
|
||||
|
||||
// Similar to last getCopyToReg() except parameter Reg is a SDValue
|
||||
SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
|
||||
SDValue Flag) {
|
||||
SDValue Glue) {
|
||||
SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
|
||||
SDValue Ops[] = { Chain, Reg, N, Flag };
|
||||
return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
|
||||
SDValue Ops[] = { Chain, Reg, N, Glue };
|
||||
return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
|
||||
}
|
||||
|
||||
SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT) {
|
||||
@ -422,13 +422,13 @@ public:
|
||||
}
|
||||
|
||||
// This version of the getCopyFromReg method takes an extra operand, which
|
||||
// indicates that there is potentially an incoming flag value (if Flag is not
|
||||
// null) and that there should be a flag result.
|
||||
// indicates that there is potentially an incoming glue value (if Glue is not
|
||||
// null) and that there should be a glue result.
|
||||
SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT,
|
||||
SDValue Flag) {
|
||||
SDValue Glue) {
|
||||
SDVTList VTs = getVTList(VT, MVT::Other, MVT::Glue);
|
||||
SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
|
||||
return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2);
|
||||
SDValue Ops[] = { Chain, getRegister(Reg, VT), Glue };
|
||||
return getNode(ISD::CopyFromReg, dl, VTs, Ops, Glue.getNode() ? 3 : 2);
|
||||
}
|
||||
|
||||
SDValue getCondCode(ISD::CondCode Cond);
|
||||
@ -462,7 +462,7 @@ public:
|
||||
SDValue getNOT(DebugLoc DL, SDValue Val, EVT VT);
|
||||
|
||||
/// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
|
||||
/// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a
|
||||
/// a glue result (to ensure it's not CSE'd). CALLSEQ_START does not have a
|
||||
/// useful DebugLoc.
|
||||
SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
|
||||
SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
|
||||
@ -471,18 +471,18 @@ public:
|
||||
}
|
||||
|
||||
/// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
|
||||
/// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have
|
||||
/// glue result (to ensure it's not CSE'd). CALLSEQ_END does not have
|
||||
/// a useful DebugLoc.
|
||||
SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
|
||||
SDValue InFlag) {
|
||||
SDValue InGlue) {
|
||||
SDVTList NodeTys = getVTList(MVT::Other, MVT::Glue);
|
||||
SmallVector<SDValue, 4> Ops;
|
||||
Ops.push_back(Chain);
|
||||
Ops.push_back(Op1);
|
||||
Ops.push_back(Op2);
|
||||
Ops.push_back(InFlag);
|
||||
Ops.push_back(InGlue);
|
||||
return getNode(ISD::CALLSEQ_END, DebugLoc(), NodeTys, &Ops[0],
|
||||
(unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
|
||||
(unsigned)Ops.size() - (InGlue.getNode() == 0 ? 1 : 0));
|
||||
}
|
||||
|
||||
/// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc.
|
||||
|
@ -110,7 +110,7 @@ public:
|
||||
OPC_RecordChild0, OPC_RecordChild1, OPC_RecordChild2, OPC_RecordChild3,
|
||||
OPC_RecordChild4, OPC_RecordChild5, OPC_RecordChild6, OPC_RecordChild7,
|
||||
OPC_RecordMemRef,
|
||||
OPC_CaptureFlagInput,
|
||||
OPC_CaptureGlueInput,
|
||||
OPC_MoveChild,
|
||||
OPC_MoveParent,
|
||||
OPC_CheckSame,
|
||||
@ -140,12 +140,12 @@ public:
|
||||
OPC_EmitNodeXForm,
|
||||
OPC_EmitNode,
|
||||
OPC_MorphNodeTo,
|
||||
OPC_MarkFlagResults,
|
||||
OPC_MarkGlueResults,
|
||||
OPC_CompleteMatch
|
||||
};
|
||||
|
||||
enum {
|
||||
OPFL_None = 0, // Node has no chain or flag input and isn't variadic.
|
||||
OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
|
||||
OPFL_Chain = 1, // Node has a chain input.
|
||||
OPFL_GlueInput = 2, // Node has a glue input.
|
||||
OPFL_GlueOutput = 4, // Node has a glue output.
|
||||
|
@ -524,9 +524,9 @@ public:
|
||||
return X;
|
||||
}
|
||||
|
||||
/// getFlaggedNode - If this node has a flag operand, return the node
|
||||
/// to which the flag operand points. Otherwise return NULL.
|
||||
SDNode *getFlaggedNode() const {
|
||||
/// getGluedNode - If this node has a glue operand, return the node
|
||||
/// to which the glue operand points. Otherwise return NULL.
|
||||
SDNode *getGluedNode() const {
|
||||
if (getNumOperands() != 0 &&
|
||||
getOperand(getNumOperands()-1).getValueType() == MVT::Glue)
|
||||
return getOperand(getNumOperands()-1).getNode();
|
||||
@ -534,14 +534,14 @@ public:
|
||||
}
|
||||
|
||||
// If this is a pseudo op, like copyfromreg, look to see if there is a
|
||||
// real target node flagged to it. If so, return the target node.
|
||||
const SDNode *getFlaggedMachineNode() const {
|
||||
// real target node glued to it. If so, return the target node.
|
||||
const SDNode *getGluedMachineNode() const {
|
||||
const SDNode *FoundNode = this;
|
||||
|
||||
// Climb up flag edges until a machine-opcode node is found, or the
|
||||
// Climb up glue edges until a machine-opcode node is found, or the
|
||||
// end of the chain is reached.
|
||||
while (!FoundNode->isMachineOpcode()) {
|
||||
const SDNode *N = FoundNode->getFlaggedNode();
|
||||
const SDNode *N = FoundNode->getGluedNode();
|
||||
if (!N) break;
|
||||
FoundNode = N;
|
||||
}
|
||||
@ -549,9 +549,9 @@ public:
|
||||
return FoundNode;
|
||||
}
|
||||
|
||||
/// getFlaggedUser - If this node has a flag value with a user, return
|
||||
/// getGluedUser - If this node has a glue value with a user, return
|
||||
/// the user (there is at most one). Otherwise return NULL.
|
||||
SDNode *getFlaggedUser() const {
|
||||
SDNode *getGluedUser() const {
|
||||
for (use_iterator UI = use_begin(), UE = use_end(); UI != UE; ++UI)
|
||||
if (UI.getUse().get().getValueType() == MVT::Glue)
|
||||
return *UI;
|
||||
|
@ -31,7 +31,7 @@
|
||||
using namespace llvm;
|
||||
|
||||
/// CountResults - The results of target nodes have register or immediate
|
||||
/// operands first, then an optional chain, and optional flag operands (which do
|
||||
/// operands first, then an optional chain, and optional glue operands (which do
|
||||
/// not go into the resulting MachineInstr).
|
||||
unsigned InstrEmitter::CountResults(SDNode *Node) {
|
||||
unsigned N = Node->getNumValues();
|
||||
@ -43,7 +43,7 @@ unsigned InstrEmitter::CountResults(SDNode *Node) {
|
||||
}
|
||||
|
||||
/// CountOperands - The inputs to target nodes have any actual inputs first,
|
||||
/// followed by an optional chain operand, then an optional flag operand.
|
||||
/// followed by an optional chain operand, then an optional glue operand.
|
||||
/// Compute the number of actual operands that will go into the resulting
|
||||
/// MachineInstr.
|
||||
unsigned InstrEmitter::CountOperands(SDNode *Node) {
|
||||
@ -265,7 +265,7 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
|
||||
bool IsDebug, bool IsClone, bool IsCloned) {
|
||||
assert(Op.getValueType() != MVT::Other &&
|
||||
Op.getValueType() != MVT::Glue &&
|
||||
"Chain and flag operands should occur at end of operand list!");
|
||||
"Chain and glue operands should occur at end of operand list!");
|
||||
// Get/emit the operand.
|
||||
unsigned VReg = getVR(Op, VRBaseMap);
|
||||
assert(TargetRegisterInfo::isVirtualRegister(VReg) && "Not a vreg?");
|
||||
@ -378,7 +378,7 @@ void InstrEmitter::AddOperand(MachineInstr *MI, SDValue Op,
|
||||
} else {
|
||||
assert(Op.getValueType() != MVT::Other &&
|
||||
Op.getValueType() != MVT::Glue &&
|
||||
"Chain and flag operands should occur at end of operand list!");
|
||||
"Chain and glue operands should occur at end of operand list!");
|
||||
AddRegisterOperand(MI, Op, IIOpNum, II, VRBaseMap,
|
||||
IsDebug, IsClone, IsCloned);
|
||||
}
|
||||
@ -674,7 +674,7 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
|
||||
Node->getValueType(Node->getNumValues()-1) == MVT::Glue) {
|
||||
// First, collect all used registers.
|
||||
SmallVector<unsigned, 8> UsedRegs;
|
||||
for (SDNode *F = Node->getFlaggedUser(); F; F = F->getFlaggedUser())
|
||||
for (SDNode *F = Node->getGluedUser(); F; F = F->getGluedUser())
|
||||
if (F->getOpcode() == ISD::CopyFromReg)
|
||||
UsedRegs.push_back(cast<RegisterSDNode>(F->getOperand(1))->getReg());
|
||||
else {
|
||||
@ -727,16 +727,16 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
|
||||
EmitCopyFromReg(Node, i, IsClone, IsCloned, Reg, VRBaseMap);
|
||||
// If there are no uses, mark the register as dead now, so that
|
||||
// MachineLICM/Sink can see that it's dead. Don't do this if the
|
||||
// node has a Flag value, for the benefit of targets still using
|
||||
// Flag for values in physregs.
|
||||
// node has a Glue value, for the benefit of targets still using
|
||||
// Glue for values in physregs.
|
||||
else if (Node->getValueType(Node->getNumValues()-1) != MVT::Glue)
|
||||
MI->addRegisterDead(Reg, TRI);
|
||||
}
|
||||
}
|
||||
|
||||
// If the instruction has implicit defs and the node doesn't, mark the
|
||||
// implicit def as dead. If the node has any flag outputs, we don't do this
|
||||
// because we don't know what implicit defs are being used by flagged nodes.
|
||||
// implicit def as dead. If the node has any glue outputs, we don't do this
|
||||
// because we don't know what implicit defs are being used by glued nodes.
|
||||
if (Node->getValueType(Node->getNumValues()-1) != MVT::Glue)
|
||||
if (const unsigned *IDList = II.getImplicitDefs()) {
|
||||
for (unsigned i = NumResults, e = II.getNumDefs()+II.getNumImplicitDefs();
|
||||
@ -794,7 +794,7 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
|
||||
case ISD::INLINEASM: {
|
||||
unsigned NumOps = Node->getNumOperands();
|
||||
if (Node->getOperand(NumOps-1).getValueType() == MVT::Glue)
|
||||
--NumOps; // Ignore the flag operand.
|
||||
--NumOps; // Ignore the glue operand.
|
||||
|
||||
// Create the inline asm machine instruction.
|
||||
MachineInstr *MI = BuildMI(*MF, Node->getDebugLoc(),
|
||||
|
@ -205,7 +205,7 @@ void ScheduleDAGFast::ScheduleNodeBottomUp(SUnit *SU, unsigned CurCycle) {
|
||||
/// CopyAndMoveSuccessors - Clone the specified node and move its scheduled
|
||||
/// successors to the newly created node.
|
||||
SUnit *ScheduleDAGFast::CopyAndMoveSuccessors(SUnit *SU) {
|
||||
if (SU->getNode()->getFlaggedNode())
|
||||
if (SU->getNode()->getGluedNode())
|
||||
return NULL;
|
||||
|
||||
SDNode *N = SU->getNode();
|
||||
@ -476,12 +476,12 @@ bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit *SU,
|
||||
}
|
||||
}
|
||||
|
||||
for (SDNode *Node = SU->getNode(); Node; Node = Node->getFlaggedNode()) {
|
||||
for (SDNode *Node = SU->getNode(); Node; Node = Node->getGluedNode()) {
|
||||
if (Node->getOpcode() == ISD::INLINEASM) {
|
||||
// Inline asm can clobber physical defs.
|
||||
unsigned NumOps = Node->getNumOperands();
|
||||
if (Node->getOperand(NumOps-1).getValueType() == MVT::Glue)
|
||||
--NumOps; // Ignore the flag operand.
|
||||
--NumOps; // Ignore the glue operand.
|
||||
|
||||
for (unsigned i = InlineAsm::Op_FirstOperand; i != NumOps;) {
|
||||
unsigned Flags =
|
||||
|
@ -407,7 +407,7 @@ void ScheduleDAGRRList::BacktrackBottomUp(SUnit *SU, unsigned BtCycle) {
|
||||
|
||||
static bool isOperandOf(const SUnit *SU, SDNode *N) {
|
||||
for (const SDNode *SUNode = SU->getNode(); SUNode;
|
||||
SUNode = SUNode->getFlaggedNode()) {
|
||||
SUNode = SUNode->getGluedNode()) {
|
||||
if (SUNode->isOperandOf(N))
|
||||
return true;
|
||||
}
|
||||
@ -417,7 +417,7 @@ static bool isOperandOf(const SUnit *SU, SDNode *N) {
|
||||
/// CopyAndMoveSuccessors - Clone the specified node and move its scheduled
|
||||
/// successors to the newly created node.
|
||||
SUnit *ScheduleDAGRRList::CopyAndMoveSuccessors(SUnit *SU) {
|
||||
if (SU->getNode()->getFlaggedNode())
|
||||
if (SU->getNode()->getGluedNode())
|
||||
return NULL;
|
||||
|
||||
SDNode *N = SU->getNode();
|
||||
@ -700,12 +700,12 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
|
||||
RegAdded, LRegs, TRI);
|
||||
}
|
||||
|
||||
for (SDNode *Node = SU->getNode(); Node; Node = Node->getFlaggedNode()) {
|
||||
for (SDNode *Node = SU->getNode(); Node; Node = Node->getGluedNode()) {
|
||||
if (Node->getOpcode() == ISD::INLINEASM) {
|
||||
// Inline asm can clobber physical defs.
|
||||
unsigned NumOps = Node->getNumOperands();
|
||||
if (Node->getOperand(NumOps-1).getValueType() == MVT::Glue)
|
||||
--NumOps; // Ignore the flag operand.
|
||||
--NumOps; // Ignore the glue operand.
|
||||
|
||||
for (unsigned i = InlineAsm::Op_FirstOperand; i != NumOps;) {
|
||||
unsigned Flags =
|
||||
@ -1752,7 +1752,7 @@ static bool canClobberPhysRegDefs(const SUnit *SuccSU, const SUnit *SU,
|
||||
const unsigned *ImpDefs = TII->get(N->getMachineOpcode()).getImplicitDefs();
|
||||
assert(ImpDefs && "Caller should check hasPhysRegDefs");
|
||||
for (const SDNode *SUNode = SU->getNode(); SUNode;
|
||||
SUNode = SUNode->getFlaggedNode()) {
|
||||
SUNode = SUNode->getGluedNode()) {
|
||||
if (!SUNode->isMachineOpcode())
|
||||
continue;
|
||||
const unsigned *SUImpDefs =
|
||||
@ -1908,7 +1908,7 @@ void RegReductionPriorityQueue<SF>::AddPseudoTwoAddrDeps() {
|
||||
continue;
|
||||
|
||||
SDNode *Node = SU->getNode();
|
||||
if (!Node || !Node->isMachineOpcode() || SU->getNode()->getFlaggedNode())
|
||||
if (!Node || !Node->isMachineOpcode() || SU->getNode()->getGluedNode())
|
||||
continue;
|
||||
|
||||
bool isLiveOut = hasOnlyLiveOutUses(SU);
|
||||
|
@ -109,29 +109,28 @@ static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op,
|
||||
}
|
||||
}
|
||||
|
||||
static void AddFlags(SDNode *N, SDValue Flag, bool AddFlag,
|
||||
SelectionDAG *DAG) {
|
||||
static void AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) {
|
||||
SmallVector<EVT, 4> VTs;
|
||||
SDNode *FlagDestNode = Flag.getNode();
|
||||
SDNode *GlueDestNode = Glue.getNode();
|
||||
|
||||
// Don't add a flag from a node to itself.
|
||||
if (FlagDestNode == N) return;
|
||||
// Don't add glue from a node to itself.
|
||||
if (GlueDestNode == N) return;
|
||||
|
||||
// Don't add a flag to something which already has a flag.
|
||||
// Don't add glue to something which already has glue.
|
||||
if (N->getValueType(N->getNumValues() - 1) == MVT::Glue) return;
|
||||
|
||||
for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
|
||||
VTs.push_back(N->getValueType(I));
|
||||
|
||||
if (AddFlag)
|
||||
if (AddGlue)
|
||||
VTs.push_back(MVT::Glue);
|
||||
|
||||
SmallVector<SDValue, 4> Ops;
|
||||
for (unsigned I = 0, E = N->getNumOperands(); I != E; ++I)
|
||||
Ops.push_back(N->getOperand(I));
|
||||
|
||||
if (FlagDestNode)
|
||||
Ops.push_back(Flag);
|
||||
if (GlueDestNode)
|
||||
Ops.push_back(Glue);
|
||||
|
||||
SDVTList VTList = DAG->getVTList(&VTs[0], VTs.size());
|
||||
MachineSDNode::mmo_iterator Begin = 0, End = 0;
|
||||
@ -150,7 +149,7 @@ static void AddFlags(SDNode *N, SDValue Flag, bool AddFlag,
|
||||
MN->setMemRefs(Begin, End);
|
||||
}
|
||||
|
||||
/// ClusterNeighboringLoads - Force nearby loads together by "flagging" them.
|
||||
/// ClusterNeighboringLoads - Force nearby loads together by "gluing" them.
|
||||
/// This function finds loads of the same base and different offsets. If the
|
||||
/// offsets are not far apart (target specific), it add MVT::Glue inputs and
|
||||
/// outputs to ensure they are scheduled together and in order. This
|
||||
@ -217,17 +216,17 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {
|
||||
// Cluster loads by adding MVT::Glue outputs and inputs. This also
|
||||
// ensure they are scheduled in order of increasing addresses.
|
||||
SDNode *Lead = Loads[0];
|
||||
AddFlags(Lead, SDValue(0, 0), true, DAG);
|
||||
AddGlue(Lead, SDValue(0, 0), true, DAG);
|
||||
|
||||
SDValue InFlag = SDValue(Lead, Lead->getNumValues() - 1);
|
||||
SDValue InGlue = SDValue(Lead, Lead->getNumValues() - 1);
|
||||
for (unsigned I = 1, E = Loads.size(); I != E; ++I) {
|
||||
bool OutFlag = I < E - 1;
|
||||
bool OutGlue = I < E - 1;
|
||||
SDNode *Load = Loads[I];
|
||||
|
||||
AddFlags(Load, InFlag, OutFlag, DAG);
|
||||
AddGlue(Load, InGlue, OutGlue, DAG);
|
||||
|
||||
if (OutFlag)
|
||||
InFlag = SDValue(Load, Load->getNumValues() - 1);
|
||||
if (OutGlue)
|
||||
InGlue = SDValue(Load, Load->getNumValues() - 1);
|
||||
|
||||
++LoadsClustered;
|
||||
}
|
||||
@ -290,11 +289,11 @@ void ScheduleDAGSDNodes::BuildSchedUnits() {
|
||||
|
||||
SUnit *NodeSUnit = NewSUnit(NI);
|
||||
|
||||
// See if anything is flagged to this node, if so, add them to flagged
|
||||
// nodes. Nodes can have at most one flag input and one flag output. Flags
|
||||
// are required to be the last operand and result of a node.
|
||||
// See if anything is glued to this node, if so, add them to glued
|
||||
// nodes. Nodes can have at most one glue input and one glue output. Glue
|
||||
// is required to be the last operand and result of a node.
|
||||
|
||||
// Scan up to find flagged preds.
|
||||
// Scan up to find glued preds.
|
||||
SDNode *N = NI;
|
||||
while (N->getNumOperands() &&
|
||||
N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) {
|
||||
@ -305,17 +304,17 @@ void ScheduleDAGSDNodes::BuildSchedUnits() {
|
||||
NodeSUnit->isCall = true;
|
||||
}
|
||||
|
||||
// Scan down to find any flagged succs.
|
||||
// Scan down to find any glued succs.
|
||||
N = NI;
|
||||
while (N->getValueType(N->getNumValues()-1) == MVT::Glue) {
|
||||
SDValue FlagVal(N, N->getNumValues()-1);
|
||||
SDValue GlueVal(N, N->getNumValues()-1);
|
||||
|
||||
// There are either zero or one users of the Flag result.
|
||||
bool HasFlagUse = false;
|
||||
// There are either zero or one users of the Glue result.
|
||||
bool HasGlueUse = false;
|
||||
for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end();
|
||||
UI != E; ++UI)
|
||||
if (FlagVal.isOperandOf(*UI)) {
|
||||
HasFlagUse = true;
|
||||
if (GlueVal.isOperandOf(*UI)) {
|
||||
HasGlueUse = true;
|
||||
assert(N->getNodeId() == -1 && "Node already inserted!");
|
||||
N->setNodeId(NodeSUnit->NodeNum);
|
||||
N = *UI;
|
||||
@ -323,11 +322,11 @@ void ScheduleDAGSDNodes::BuildSchedUnits() {
|
||||
NodeSUnit->isCall = true;
|
||||
break;
|
||||
}
|
||||
if (!HasFlagUse) break;
|
||||
if (!HasGlueUse) break;
|
||||
}
|
||||
|
||||
// If there are flag operands involved, N is now the bottom-most node
|
||||
// of the sequence of nodes that are flagged together.
|
||||
// If there are glue operands involved, N is now the bottom-most node
|
||||
// of the sequence of nodes that are glued together.
|
||||
// Update the SUnit.
|
||||
NodeSUnit->setNode(N);
|
||||
assert(N->getNodeId() == -1 && "Node already inserted!");
|
||||
@ -363,7 +362,7 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
|
||||
}
|
||||
|
||||
// Find all predecessors and successors of the group.
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getFlaggedNode()) {
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getGluedNode()) {
|
||||
if (N->isMachineOpcode() &&
|
||||
TII->get(N->getMachineOpcode()).getImplicitDefs()) {
|
||||
SU->hasPhysRegClobbers = true;
|
||||
@ -382,7 +381,7 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
|
||||
if (OpSU == SU) continue; // In the same group.
|
||||
|
||||
EVT OpVT = N->getOperand(i).getValueType();
|
||||
assert(OpVT != MVT::Glue && "Flagged nodes should be in same sunit!");
|
||||
assert(OpVT != MVT::Glue && "Glued nodes should be in same sunit!");
|
||||
bool isChain = OpVT == MVT::Other;
|
||||
|
||||
unsigned PhysReg = 0;
|
||||
@ -417,7 +416,7 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
|
||||
/// BuildSchedGraph - Build the SUnit graph from the selection dag that we
|
||||
/// are input. This SUnit graph is similar to the SelectionDAG, but
|
||||
/// excludes nodes that aren't interesting to scheduling, and represents
|
||||
/// flagged together nodes with a single SUnit.
|
||||
/// glued together nodes with a single SUnit.
|
||||
void ScheduleDAGSDNodes::BuildSchedGraph(AliasAnalysis *AA) {
|
||||
// Cluster certain nodes which should be scheduled together.
|
||||
ClusterNodes();
|
||||
@ -440,9 +439,9 @@ void ScheduleDAGSDNodes::ComputeLatency(SUnit *SU) {
|
||||
}
|
||||
|
||||
// Compute the latency for the node. We use the sum of the latencies for
|
||||
// all nodes flagged together into this SUnit.
|
||||
// all nodes glued together into this SUnit.
|
||||
SU->Latency = 0;
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getFlaggedNode())
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getGluedNode())
|
||||
if (N->isMachineOpcode())
|
||||
SU->Latency += TII->getInstrLatency(InstrItins, N);
|
||||
}
|
||||
@ -482,14 +481,14 @@ void ScheduleDAGSDNodes::dumpNode(const SUnit *SU) const {
|
||||
|
||||
SU->getNode()->dump(DAG);
|
||||
dbgs() << "\n";
|
||||
SmallVector<SDNode *, 4> FlaggedNodes;
|
||||
for (SDNode *N = SU->getNode()->getFlaggedNode(); N; N = N->getFlaggedNode())
|
||||
FlaggedNodes.push_back(N);
|
||||
while (!FlaggedNodes.empty()) {
|
||||
SmallVector<SDNode *, 4> GluedNodes;
|
||||
for (SDNode *N = SU->getNode()->getGluedNode(); N; N = N->getGluedNode())
|
||||
GluedNodes.push_back(N);
|
||||
while (!GluedNodes.empty()) {
|
||||
dbgs() << " ";
|
||||
FlaggedNodes.back()->dump(DAG);
|
||||
GluedNodes.back()->dump(DAG);
|
||||
dbgs() << "\n";
|
||||
FlaggedNodes.pop_back();
|
||||
GluedNodes.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
@ -573,25 +572,25 @@ MachineBasicBlock *ScheduleDAGSDNodes::EmitSchedule() {
|
||||
}
|
||||
|
||||
// For pre-regalloc scheduling, create instructions corresponding to the
|
||||
// SDNode and any flagged SDNodes and append them to the block.
|
||||
// SDNode and any glued SDNodes and append them to the block.
|
||||
if (!SU->getNode()) {
|
||||
// Emit a copy.
|
||||
EmitPhysRegCopy(SU, CopyVRBaseMap);
|
||||
continue;
|
||||
}
|
||||
|
||||
SmallVector<SDNode *, 4> FlaggedNodes;
|
||||
for (SDNode *N = SU->getNode()->getFlaggedNode(); N;
|
||||
N = N->getFlaggedNode())
|
||||
FlaggedNodes.push_back(N);
|
||||
while (!FlaggedNodes.empty()) {
|
||||
SDNode *N = FlaggedNodes.back();
|
||||
Emitter.EmitNode(FlaggedNodes.back(), SU->OrigNode != SU, SU->isCloned,
|
||||
SmallVector<SDNode *, 4> GluedNodes;
|
||||
for (SDNode *N = SU->getNode()->getGluedNode(); N;
|
||||
N = N->getGluedNode())
|
||||
GluedNodes.push_back(N);
|
||||
while (!GluedNodes.empty()) {
|
||||
SDNode *N = GluedNodes.back();
|
||||
Emitter.EmitNode(GluedNodes.back(), SU->OrigNode != SU, SU->isCloned,
|
||||
VRBaseMap);
|
||||
// Remember the source order of the inserted instruction.
|
||||
if (HasDbg)
|
||||
ProcessSourceNode(N, DAG, Emitter, VRBaseMap, Orders, Seen);
|
||||
FlaggedNodes.pop_back();
|
||||
GluedNodes.pop_back();
|
||||
}
|
||||
Emitter.EmitNode(SU->getNode(), SU->OrigNode != SU, SU->isCloned,
|
||||
VRBaseMap);
|
||||
|
@ -2190,7 +2190,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
MatchedMemRefs.push_back(cast<MemSDNode>(N)->getMemOperand());
|
||||
continue;
|
||||
|
||||
case OPC_CaptureFlagInput:
|
||||
case OPC_CaptureGlueInput:
|
||||
// If the current node has an input glue, capture it in InputGlue.
|
||||
if (N->getNumOperands() != 0 &&
|
||||
N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue)
|
||||
@ -2608,7 +2608,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
continue;
|
||||
}
|
||||
|
||||
case OPC_MarkFlagResults: {
|
||||
case OPC_MarkGlueResults: {
|
||||
unsigned NumNodes = MatcherTable[MatcherIndex++];
|
||||
|
||||
// Read and remember all the glue-result nodes.
|
||||
@ -2650,7 +2650,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
CurDAG->ReplaceAllUsesOfValueWith(SDValue(NodeToMatch, i), Res);
|
||||
}
|
||||
|
||||
// If the root node defines glue, add it to the flag nodes to update list.
|
||||
// If the root node defines glue, add it to the glue nodes to update list.
|
||||
if (NodeToMatch->getValueType(NodeToMatch->getNumValues()-1) == MVT::Glue)
|
||||
GlueResultNodesMatched.push_back(NodeToMatch);
|
||||
|
||||
|
@ -273,14 +273,14 @@ std::string ScheduleDAGSDNodes::getGraphNodeLabel(const SUnit *SU) const {
|
||||
raw_string_ostream O(s);
|
||||
O << "SU(" << SU->NodeNum << "): ";
|
||||
if (SU->getNode()) {
|
||||
SmallVector<SDNode *, 4> FlaggedNodes;
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getFlaggedNode())
|
||||
FlaggedNodes.push_back(N);
|
||||
while (!FlaggedNodes.empty()) {
|
||||
SmallVector<SDNode *, 4> GluedNodes;
|
||||
for (SDNode *N = SU->getNode(); N; N = N->getGluedNode())
|
||||
GluedNodes.push_back(N);
|
||||
while (!GluedNodes.empty()) {
|
||||
O << DOTGraphTraits<SelectionDAG*>
|
||||
::getSimpleNodeLabel(FlaggedNodes.back(), DAG);
|
||||
FlaggedNodes.pop_back();
|
||||
if (!FlaggedNodes.empty())
|
||||
::getSimpleNodeLabel(GluedNodes.back(), DAG);
|
||||
GluedNodes.pop_back();
|
||||
if (!GluedNodes.empty())
|
||||
O << "\n ";
|
||||
}
|
||||
} else {
|
||||
|
@ -123,7 +123,7 @@ isLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const {
|
||||
/// pipeline flush.
|
||||
ScheduleHazardRecognizer::HazardType PPCHazardRecognizer970::
|
||||
getHazardType(SUnit *SU) {
|
||||
const SDNode *Node = SU->getNode()->getFlaggedMachineNode();
|
||||
const SDNode *Node = SU->getNode()->getGluedMachineNode();
|
||||
bool isFirst, isSingle, isCracked, isLoad, isStore;
|
||||
PPCII::PPC970_Unit InstrType =
|
||||
GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
|
||||
@ -222,7 +222,7 @@ getHazardType(SUnit *SU) {
|
||||
}
|
||||
|
||||
void PPCHazardRecognizer970::EmitInstruction(SUnit *SU) {
|
||||
const SDNode *Node = SU->getNode()->getFlaggedMachineNode();
|
||||
const SDNode *Node = SU->getNode()->getGluedMachineNode();
|
||||
bool isFirst, isSingle, isCracked, isLoad, isStore;
|
||||
PPCII::PPC970_Unit InstrType =
|
||||
GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
|
||||
|
@ -221,7 +221,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
return 1;
|
||||
|
||||
case Matcher::CaptureGlueInput:
|
||||
OS << "OPC_CaptureFlagInput,\n";
|
||||
OS << "OPC_CaptureGlueInput,\n";
|
||||
return 1;
|
||||
|
||||
case Matcher::MoveChild:
|
||||
@ -533,7 +533,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
}
|
||||
case Matcher::MarkGlueResults: {
|
||||
const MarkGlueResultsMatcher *CFR = cast<MarkGlueResultsMatcher>(N);
|
||||
OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
|
||||
OS << "OPC_MarkGlueResults, " << CFR->getNumNodes() << ", ";
|
||||
unsigned NumOperandBytes = 0;
|
||||
for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
|
||||
NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
|
||||
@ -742,7 +742,7 @@ void MatcherTableEmitter::EmitHistogram(const Matcher *M,
|
||||
case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
|
||||
case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
|
||||
case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
|
||||
case Matcher::CaptureGlueInput: OS << "OPC_CaptureFlagInput"; break;
|
||||
case Matcher::CaptureGlueInput: OS << "OPC_CaptureGlueInput"; break;
|
||||
case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
|
||||
case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
|
||||
case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
|
||||
@ -771,7 +771,7 @@ void MatcherTableEmitter::EmitHistogram(const Matcher *M,
|
||||
case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
|
||||
case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
|
||||
case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
|
||||
case Matcher::MarkGlueResults: OS << "OPC_MarkFlagResults"; break;
|
||||
case Matcher::MarkGlueResults: OS << "OPC_MarkGlueResults"; break;
|
||||
case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user