diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h index 70c7185c613..c40295891c9 100644 --- a/include/llvm/CodeGen/SelectionDAG.h +++ b/include/llvm/CodeGen/SelectionDAG.h @@ -359,12 +359,12 @@ public: /// getAtomic - Gets a node for an atomic op, produces result and chain, takes // 3 operands SDOperand getAtomic(unsigned Opcode, SDOperand Chain, SDOperand Ptr, - SDOperand A2, SDOperand A3, MVT::ValueType VT); + SDOperand Cmp, SDOperand Swp, MVT::ValueType VT); /// getAtomic - Gets a node for an atomic op, produces result and chain, takes // 2 operands SDOperand getAtomic(unsigned Opcode, SDOperand Chain, SDOperand Ptr, - SDOperand A2, MVT::ValueType VT); + SDOperand Val, MVT::ValueType VT); /// getLoad - Loads are not normal binary operators: their result type is not /// determined by their operands, and they produce a value AND a token chain. diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 293bb73a239..bffcfb245e1 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -1193,26 +1193,27 @@ class AtomicSDNode : public SDNode { SDOperand Ops[4]; MVT::ValueType OrigVT; public: - AtomicSDNode(unsigned Opc, SDVTList VTL, SDOperand Chain, SDOperand X, - SDOperand Y, SDOperand Z, MVT::ValueType VT) + AtomicSDNode(unsigned Opc, SDVTList VTL, SDOperand Chain, SDOperand Ptr, + SDOperand Cmp, SDOperand Swp, MVT::ValueType VT) : SDNode(Opc, VTL) { Ops[0] = Chain; - Ops[1] = X; - Ops[2] = Y; - Ops[3] = Z; + Ops[1] = Ptr; + Ops[2] = Swp; + Ops[3] = Cmp; InitOperands(Ops, 4); OrigVT=VT; } - AtomicSDNode(unsigned Opc, SDVTList VTL, SDOperand Chain, SDOperand X, - SDOperand Y, MVT::ValueType VT) + AtomicSDNode(unsigned Opc, SDVTList VTL, SDOperand Chain, SDOperand Ptr, + SDOperand Val, MVT::ValueType VT) : SDNode(Opc, VTL) { Ops[0] = Chain; - Ops[1] = X; - Ops[2] = Y; + Ops[1] = Ptr; + Ops[2] = Val; InitOperands(Ops, 3); OrigVT=VT; } MVT::ValueType getVT() const { return OrigVT; } + bool isCompareAndSwap() const { return getOpcode() == ISD::ATOMIC_LCS; } }; class StringSDNode : public SDNode { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 803a38cbe13..a12ff10c330 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2428,37 +2428,38 @@ SDOperand SelectionDAG::getMemset(SDOperand Chain, SDOperand Dest, } SDOperand SelectionDAG::getAtomic(unsigned Opcode, SDOperand Chain, - SDOperand Ptr, SDOperand A2, - SDOperand A3, MVT::ValueType VT) { + SDOperand Ptr, SDOperand Cmp, + SDOperand Swp, MVT::ValueType VT) { assert(Opcode == ISD::ATOMIC_LCS && "Invalid Atomic Op"); - SDVTList VTs = getVTList(A2.getValueType(), MVT::Other); + assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types"); + SDVTList VTs = getVTList(Cmp.getValueType(), MVT::Other); FoldingSetNodeID ID; - SDOperand Ops[] = {Chain, Ptr, A2, A3}; + SDOperand Ops[] = {Chain, Ptr, Cmp, Swp}; AddNodeIDNode(ID, Opcode, VTs, Ops, 4); ID.AddInteger((unsigned int)VT); void* IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, A2, A3, VT); + SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, Cmp, Swp, VT); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); return SDOperand(N, 0); } SDOperand SelectionDAG::getAtomic(unsigned Opcode, SDOperand Chain, - SDOperand Ptr, SDOperand A2, + SDOperand Ptr, SDOperand Val, MVT::ValueType VT) { assert((Opcode == ISD::ATOMIC_LAS || Opcode == ISD::ATOMIC_SWAP) && "Invalid Atomic Op"); - SDVTList VTs = getVTList(A2.getValueType(), MVT::Other); + SDVTList VTs = getVTList(Val.getValueType(), MVT::Other); FoldingSetNodeID ID; - SDOperand Ops[] = {Chain, Ptr, A2}; + SDOperand Ops[] = {Chain, Ptr, Val}; AddNodeIDNode(ID, Opcode, VTs, Ops, 3); ID.AddInteger((unsigned int)VT); void* IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, A2, VT); + SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, Val, VT); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); return SDOperand(N, 0);