// Helper for AddGlue to clone node operands. static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, SmallVectorImpl<EVT> &VTs, SDValue ExtraOper = SDValue()) { SmallVector<SDValue, 4> Ops; for (unsigned I = 0, E = N->getNumOperands(); I != E; ++I) Ops.push_back(N->getOperand(I)); if (ExtraOper.getNode()) Ops.push_back(ExtraOper); SDVTList VTList = DAG->getVTList(&VTs[0], VTs.size()); MachineSDNode::mmo_iterator Begin = 0, End = 0; MachineSDNode *MN = dyn_cast<MachineSDNode>(N); // Store memory references. if (MN) { Begin = MN->memoperands_begin(); End = MN->memoperands_end(); } DAG->MorphNodeTo(N, N->getOpcode(), VTList, &Ops[0], Ops.size()); // Reset the memory references if (MN) MN->setMemRefs(Begin, End); }
// Helper for AddGlue to clone node operands. static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, ArrayRef<EVT> VTs, SDValue ExtraOper = SDValue()) { SmallVector<SDValue, 8> Ops(N->op_begin(), N->op_end()); if (ExtraOper.getNode()) Ops.push_back(ExtraOper); SDVTList VTList = DAG->getVTList(VTs); MachineSDNode *MN = dyn_cast<MachineSDNode>(N); // Store memory references. SmallVector<MachineMemOperand *, 2> MMOs; if (MN) MMOs.assign(MN->memoperands_begin(), MN->memoperands_end()); DAG->MorphNodeTo(N, N->getOpcode(), VTList, Ops); // Reset the memory references if (MN) DAG->setNodeMemRefs(MN, MMOs); }
static void AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) { SmallVector<EVT, 4> VTs; SDNode *GlueDestNode = Glue.getNode(); // Don't add glue from a node to itself. if (GlueDestNode == N) return; // Don't add glue to something that already has it, either as a use or value. if (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue || 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 (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 (GlueDestNode) Ops.push_back(Glue); SDVTList VTList = DAG->getVTList(&VTs[0], VTs.size()); MachineSDNode::mmo_iterator Begin = 0, End = 0; MachineSDNode *MN = dyn_cast<MachineSDNode>(N); // Store memory references. if (MN) { Begin = MN->memoperands_begin(); End = MN->memoperands_end(); } DAG->MorphNodeTo(N, N->getOpcode(), VTList, &Ops[0], Ops.size()); // Reset the memory references if (MN) MN->setMemRefs(Begin, End); }
static void AddFlags(SDNode *N, SDValue Flag, bool AddFlag, SelectionDAG *DAG) { SmallVector<EVT, 4> VTs; SDNode *FlagDestNode = Flag.getNode(); // Don't add a flag from a node to itself. if (FlagDestNode == N) return; // Don't add a flag to something which already has a flag. if (N->getValueType(N->getNumValues() - 1) == MVT::Flag) return; for (unsigned I = 0, E = N->getNumValues(); I != E; ++I) VTs.push_back(N->getValueType(I)); if (AddFlag) VTs.push_back(MVT::Flag); 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); SDVTList VTList = DAG->getVTList(&VTs[0], VTs.size()); MachineSDNode::mmo_iterator Begin = 0, End = 0; MachineSDNode *MN = dyn_cast<MachineSDNode>(N); // Store memory references. if (MN) { Begin = MN->memoperands_begin(); End = MN->memoperands_end(); } DAG->MorphNodeTo(N, N->getOpcode(), VTList, &Ops[0], Ops.size()); // Reset the memory references if (MN) MN->setMemRefs(Begin, End); }
// Helper for AddGlue to clone node operands. static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, ArrayRef<EVT> VTs, SDValue ExtraOper = SDValue()) { SmallVector<SDValue, 8> Ops(N->op_begin(), N->op_end()); if (ExtraOper.getNode()) Ops.push_back(ExtraOper); SDVTList VTList = DAG->getVTList(VTs); MachineSDNode::mmo_iterator Begin = nullptr, End = nullptr; MachineSDNode *MN = dyn_cast<MachineSDNode>(N); // Store memory references. if (MN) { Begin = MN->memoperands_begin(); End = MN->memoperands_end(); } DAG->MorphNodeTo(N, N->getOpcode(), VTList, Ops); // Reset the memory references if (MN) MN->setMemRefs(Begin, End); }