forked from OSchip/llvm-project
Use a MemIntrinsicSDNode for ISD::PREFETCH, which touches
memory, so a MachineMemOperand is useful (not propagated into the MachineInstr yet). No functional change except for dump output. llvm-svn: 117413
This commit is contained in:
parent
5f88cc34e1
commit
e660f4d072
|
@ -936,6 +936,7 @@ public:
|
|||
// with either an intrinsic or a target opcode.
|
||||
return N->getOpcode() == ISD::LOAD ||
|
||||
N->getOpcode() == ISD::STORE ||
|
||||
N->getOpcode() == ISD::PREFETCH ||
|
||||
N->getOpcode() == ISD::ATOMIC_CMP_SWAP ||
|
||||
N->getOpcode() == ISD::ATOMIC_SWAP ||
|
||||
N->getOpcode() == ISD::ATOMIC_LOAD_ADD ||
|
||||
|
@ -1011,8 +1012,8 @@ public:
|
|||
|
||||
/// MemIntrinsicSDNode - This SDNode is used for target intrinsics that touch
|
||||
/// memory and need an associated MachineMemOperand. Its opcode may be
|
||||
/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, or a target-specific opcode with a
|
||||
/// value not less than FIRST_TARGET_MEMORY_OPCODE.
|
||||
/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, PREFETCH, or a target-specific opcode
|
||||
/// with a value not less than FIRST_TARGET_MEMORY_OPCODE.
|
||||
class MemIntrinsicSDNode : public MemSDNode {
|
||||
public:
|
||||
MemIntrinsicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
|
||||
|
@ -1028,6 +1029,7 @@ public:
|
|||
// early a node with a target opcode can be of this class
|
||||
return N->getOpcode() == ISD::INTRINSIC_W_CHAIN ||
|
||||
N->getOpcode() == ISD::INTRINSIC_VOID ||
|
||||
N->getOpcode() == ISD::PREFETCH ||
|
||||
N->isTargetMemoryOpcode();
|
||||
}
|
||||
};
|
||||
|
|
|
@ -3829,6 +3829,7 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
|
|||
EVT MemVT, MachineMemOperand *MMO) {
|
||||
assert((Opcode == ISD::INTRINSIC_VOID ||
|
||||
Opcode == ISD::INTRINSIC_W_CHAIN ||
|
||||
Opcode == ISD::PREFETCH ||
|
||||
(Opcode <= INT_MAX &&
|
||||
(int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
|
||||
"Opcode is not a memory-accessing opcode!");
|
||||
|
|
|
@ -4617,14 +4617,22 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||
|
||||
case Intrinsic::prefetch: {
|
||||
SDValue Ops[4];
|
||||
unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
|
||||
Ops[0] = getRoot();
|
||||
Ops[1] = getValue(I.getArgOperand(0));
|
||||
Ops[2] = getValue(I.getArgOperand(1));
|
||||
Ops[3] = getValue(I.getArgOperand(2));
|
||||
DAG.setRoot(DAG.getNode(ISD::PREFETCH, dl, MVT::Other, &Ops[0], 4));
|
||||
DAG.setRoot(DAG.getMemIntrinsicNode(ISD::PREFETCH, dl,
|
||||
DAG.getVTList(MVT::Other),
|
||||
&Ops[0], 4,
|
||||
EVT::getIntegerVT(*Context, 8),
|
||||
MachinePointerInfo(I.getArgOperand(0)),
|
||||
0, /* align */
|
||||
false, /* volatile */
|
||||
rw==0, /* read */
|
||||
rw==1)); /* write */
|
||||
return 0;
|
||||
}
|
||||
|
||||
case Intrinsic::memory_barrier: {
|
||||
SDValue Ops[6];
|
||||
Ops[0] = getRoot();
|
||||
|
|
|
@ -1147,7 +1147,6 @@ bool X86DAGToDAGISel::SelectAddr(SDNode *Parent, SDValue N, SDValue &Base,
|
|||
if (Parent &&
|
||||
// This list of opcodes are all the nodes that have an "addr:$ptr" operand
|
||||
// that are not a MemSDNode, and thus don't have proper addrspace info.
|
||||
Parent->getOpcode() != ISD::PREFETCH &&
|
||||
Parent->getOpcode() != ISD::INTRINSIC_W_CHAIN && // unaligned loads, fixme
|
||||
Parent->getOpcode() != ISD::INTRINSIC_VOID && // nontemporal stores
|
||||
Parent->getOpcode() != X86ISD::TLSCALL) { // Fixme
|
||||
|
|
Loading…
Reference in New Issue