mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Reapply r91392, it was only unmasking the bug, and since TOT is still broken having it reverted does no good.
llvm-svn: 91560
This commit is contained in:
parent
c4abbc0ab6
commit
70f0e3d7d0
@ -110,6 +110,46 @@ class SelectionDAG {
|
||||
/// SelectionDAG.
|
||||
BumpPtrAllocator Allocator;
|
||||
|
||||
/// NodeOrdering - Assigns a "line number" value to each SDNode that
|
||||
/// corresponds to the "line number" of the original LLVM instruction. This
|
||||
/// used for turning off scheduling, because we'll forgo the normal scheduling
|
||||
/// algorithm and output the instructions according to this ordering.
|
||||
class NodeOrdering {
|
||||
/// LineNo - The line of the instruction the node corresponds to. A value of
|
||||
/// `0' means it's not assigned.
|
||||
unsigned LineNo;
|
||||
std::map<const SDNode*, unsigned> Order;
|
||||
|
||||
void operator=(const NodeOrdering&); // Do not implement.
|
||||
NodeOrdering(const NodeOrdering&); // Do not implement.
|
||||
public:
|
||||
NodeOrdering() : LineNo(0) {}
|
||||
|
||||
void add(const SDNode *Node) {
|
||||
assert(LineNo && "Invalid line number!");
|
||||
Order[Node] = LineNo;
|
||||
}
|
||||
void remove(const SDNode *Node) {
|
||||
std::map<const SDNode*, unsigned>::iterator Itr = Order.find(Node);
|
||||
if (Itr != Order.end())
|
||||
Order.erase(Itr);
|
||||
}
|
||||
void clear() {
|
||||
Order.clear();
|
||||
LineNo = 1;
|
||||
}
|
||||
unsigned getLineNo(const SDNode *Node) {
|
||||
unsigned LN = Order[Node];
|
||||
assert(LN && "Node isn't in ordering map!");
|
||||
return LN;
|
||||
}
|
||||
void newInst() {
|
||||
++LineNo;
|
||||
}
|
||||
|
||||
void dump() const;
|
||||
} *Ordering;
|
||||
|
||||
/// VerifyNode - Sanity check the given node. Aborts if it is invalid.
|
||||
void VerifyNode(SDNode *N);
|
||||
|
||||
@ -120,6 +160,9 @@ class SelectionDAG {
|
||||
DenseSet<SDNode *> &visited,
|
||||
int level, bool &printed);
|
||||
|
||||
void operator=(const SelectionDAG&); // Do not implement.
|
||||
SelectionDAG(const SelectionDAG&); // Do not implement.
|
||||
|
||||
public:
|
||||
SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
|
||||
~SelectionDAG();
|
||||
@ -199,6 +242,13 @@ public:
|
||||
return Root = N;
|
||||
}
|
||||
|
||||
/// NewInst - Tell the ordering object that we're processing a new
|
||||
/// instruction.
|
||||
void NewInst() {
|
||||
if (Ordering)
|
||||
Ordering->newInst();
|
||||
}
|
||||
|
||||
/// Combine - This iterates over the nodes in the SelectionDAG, folding
|
||||
/// certain types of nodes together, or eliminating superfluous nodes. The
|
||||
/// Level argument controls whether Combine is allowed to produce nodes and
|
||||
|
@ -20,10 +20,16 @@
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetSubtarget.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
cl::opt<bool>
|
||||
DisableInstScheduling("disable-inst-scheduling",
|
||||
cl::init(false),
|
||||
cl::desc("Disable instruction scheduling"));
|
||||
|
||||
ScheduleDAGSDNodes::ScheduleDAGSDNodes(MachineFunction &mf)
|
||||
: ScheduleDAG(mf) {
|
||||
}
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <cmath>
|
||||
using namespace llvm;
|
||||
|
||||
extern cl::opt<bool> DisableInstScheduling;
|
||||
|
||||
/// makeVTList - Return an instance of the SDVTList struct initialized with the
|
||||
/// specified members.
|
||||
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
|
||||
@ -552,6 +554,9 @@ void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
|
||||
}
|
||||
|
||||
DeallocateNode(N);
|
||||
|
||||
// Remove the ordering of this node.
|
||||
if (Ordering) Ordering->remove(N);
|
||||
}
|
||||
}
|
||||
|
||||
@ -577,6 +582,9 @@ void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
|
||||
N->DropOperands();
|
||||
|
||||
DeallocateNode(N);
|
||||
|
||||
// Remove the ordering of this node.
|
||||
if (Ordering) Ordering->remove(N);
|
||||
}
|
||||
|
||||
void SelectionDAG::DeallocateNode(SDNode *N) {
|
||||
@ -588,6 +596,9 @@ void SelectionDAG::DeallocateNode(SDNode *N) {
|
||||
N->NodeType = ISD::DELETED_NODE;
|
||||
|
||||
NodeAllocator.Deallocate(AllNodes.remove(N));
|
||||
|
||||
// Remove the ordering of this node.
|
||||
if (Ordering) Ordering->remove(N);
|
||||
}
|
||||
|
||||
/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
|
||||
@ -691,7 +702,9 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 1);
|
||||
AddNodeIDCustom(ID, N);
|
||||
return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
if (Ordering) Ordering->remove(Node);
|
||||
return Node;
|
||||
}
|
||||
|
||||
/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
|
||||
@ -708,7 +721,9 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 2);
|
||||
AddNodeIDCustom(ID, N);
|
||||
return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
if (Ordering) Ordering->remove(Node);
|
||||
return Node;
|
||||
}
|
||||
|
||||
|
||||
@ -725,7 +740,9 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, NumOps);
|
||||
AddNodeIDCustom(ID, N);
|
||||
return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
|
||||
if (Ordering) Ordering->remove(Node);
|
||||
return Node;
|
||||
}
|
||||
|
||||
/// VerifyNode - Sanity check the given node. Aborts if it is invalid.
|
||||
@ -778,8 +795,13 @@ unsigned SelectionDAG::getEVTAlignment(EVT VT) const {
|
||||
SelectionDAG::SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli)
|
||||
: TLI(tli), FLI(fli), DW(0),
|
||||
EntryNode(ISD::EntryToken, DebugLoc::getUnknownLoc(),
|
||||
getVTList(MVT::Other)), Root(getEntryNode()) {
|
||||
getVTList(MVT::Other)),
|
||||
Root(getEntryNode()), Ordering(0) {
|
||||
AllNodes.push_back(&EntryNode);
|
||||
if (DisableInstScheduling) {
|
||||
Ordering = new NodeOrdering();
|
||||
Ordering->add(&EntryNode);
|
||||
}
|
||||
}
|
||||
|
||||
void SelectionDAG::init(MachineFunction &mf, MachineModuleInfo *mmi,
|
||||
@ -792,6 +814,7 @@ void SelectionDAG::init(MachineFunction &mf, MachineModuleInfo *mmi,
|
||||
|
||||
SelectionDAG::~SelectionDAG() {
|
||||
allnodes_clear();
|
||||
delete Ordering;
|
||||
}
|
||||
|
||||
void SelectionDAG::allnodes_clear() {
|
||||
@ -817,6 +840,10 @@ void SelectionDAG::clear() {
|
||||
EntryNode.UseList = 0;
|
||||
AllNodes.push_back(&EntryNode);
|
||||
Root = getEntryNode();
|
||||
if (DisableInstScheduling) {
|
||||
Ordering = new NodeOrdering();
|
||||
Ordering->add(&EntryNode);
|
||||
}
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
|
||||
@ -877,14 +904,17 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, EVT VT, bool isT) {
|
||||
ID.AddPointer(&Val);
|
||||
void *IP = 0;
|
||||
SDNode *N = NULL;
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) {
|
||||
if (Ordering) Ordering->add(N);
|
||||
if (!VT.isVector())
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
if (!N) {
|
||||
N = NodeAllocator.Allocate<ConstantSDNode>();
|
||||
new (N) ConstantSDNode(isT, &Val, EltVT);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
}
|
||||
|
||||
SDValue Result(N, 0);
|
||||
@ -921,14 +951,17 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP& V, EVT VT, bool isTarget){
|
||||
ID.AddPointer(&V);
|
||||
void *IP = 0;
|
||||
SDNode *N = NULL;
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) {
|
||||
if (Ordering) Ordering->add(N);
|
||||
if (!VT.isVector())
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
if (!N) {
|
||||
N = NodeAllocator.Allocate<ConstantFPSDNode>();
|
||||
new (N) ConstantFPSDNode(isTarget, &V, EltVT);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
}
|
||||
|
||||
SDValue Result(N, 0);
|
||||
@ -983,12 +1016,15 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV,
|
||||
ID.AddInteger(Offset);
|
||||
ID.AddInteger(TargetFlags);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<GlobalAddressSDNode>();
|
||||
new (N) GlobalAddressSDNode(Opc, GV, VT, Offset, TargetFlags);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -998,12 +1034,15 @@ SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
|
||||
AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
|
||||
ID.AddInteger(FI);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<FrameIndexSDNode>();
|
||||
new (N) FrameIndexSDNode(FI, VT, isTarget);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1017,12 +1056,15 @@ SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
|
||||
ID.AddInteger(JTI);
|
||||
ID.AddInteger(TargetFlags);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<JumpTableSDNode>();
|
||||
new (N) JumpTableSDNode(JTI, VT, isTarget, TargetFlags);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1042,12 +1084,15 @@ SDValue SelectionDAG::getConstantPool(Constant *C, EVT VT,
|
||||
ID.AddPointer(C);
|
||||
ID.AddInteger(TargetFlags);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<ConstantPoolSDNode>();
|
||||
new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment, TargetFlags);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1068,12 +1113,15 @@ SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,
|
||||
C->AddSelectionDAGCSEId(ID);
|
||||
ID.AddInteger(TargetFlags);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<ConstantPoolSDNode>();
|
||||
new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment, TargetFlags);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1082,12 +1130,15 @@ SDValue SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {
|
||||
AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), 0, 0);
|
||||
ID.AddPointer(MBB);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<BasicBlockSDNode>();
|
||||
new (N) BasicBlockSDNode(MBB);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1103,6 +1154,7 @@ SDValue SelectionDAG::getValueType(EVT VT) {
|
||||
N = NodeAllocator.Allocate<VTSDNode>();
|
||||
new (N) VTSDNode(VT);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1112,6 +1164,7 @@ SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) {
|
||||
N = NodeAllocator.Allocate<ExternalSymbolSDNode>();
|
||||
new (N) ExternalSymbolSDNode(false, Sym, 0, VT);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1124,6 +1177,7 @@ SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,
|
||||
N = NodeAllocator.Allocate<ExternalSymbolSDNode>();
|
||||
new (N) ExternalSymbolSDNode(true, Sym, TargetFlags, VT);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1136,6 +1190,7 @@ SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) {
|
||||
new (N) CondCodeSDNode(Cond);
|
||||
CondCodeNodes[Cond] = N;
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
}
|
||||
return SDValue(CondCodeNodes[Cond], 0);
|
||||
}
|
||||
@ -1228,8 +1283,10 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1,
|
||||
ID.AddInteger(MaskVec[i]);
|
||||
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
|
||||
// Allocate the mask array for the node out of the BumpPtrAllocator, since
|
||||
// SDNode doesn't have access to it. This memory will be "leaked" when
|
||||
@ -1241,6 +1298,7 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1,
|
||||
new (N) ShuffleVectorSDNode(VT, dl, N1, N2, MaskAlloc);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1258,12 +1316,15 @@ SDValue SelectionDAG::getConvertRndSat(EVT VT, DebugLoc dl,
|
||||
SDValue Ops[] = { Val, DTy, STy, Rnd, Sat };
|
||||
AddNodeIDNode(ID, ISD::CONVERT_RNDSAT, getVTList(VT), &Ops[0], 5);
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
CvtRndSatSDNode *N = NodeAllocator.Allocate<CvtRndSatSDNode>();
|
||||
new (N) CvtRndSatSDNode(VT, dl, Ops, 5, Code);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1272,12 +1333,15 @@ SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {
|
||||
AddNodeIDNode(ID, ISD::Register, getVTList(VT), 0, 0);
|
||||
ID.AddInteger(RegNo);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<RegisterSDNode>();
|
||||
new (N) RegisterSDNode(RegNo, VT);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1289,12 +1353,15 @@ SDValue SelectionDAG::getLabel(unsigned Opcode, DebugLoc dl,
|
||||
AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), &Ops[0], 1);
|
||||
ID.AddInteger(LabelID);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<LabelSDNode>();
|
||||
new (N) LabelSDNode(Opcode, dl, Root, LabelID);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1308,12 +1375,15 @@ SDValue SelectionDAG::getBlockAddress(BlockAddress *BA, EVT VT,
|
||||
ID.AddPointer(BA);
|
||||
ID.AddInteger(TargetFlags);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<BlockAddressSDNode>();
|
||||
new (N) BlockAddressSDNode(Opc, VT, BA, TargetFlags);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -1326,13 +1396,16 @@ SDValue SelectionDAG::getSrcValue(const Value *V) {
|
||||
ID.AddPointer(V);
|
||||
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
|
||||
SDNode *N = NodeAllocator.Allocate<SrcValueSDNode>();
|
||||
new (N) SrcValueSDNode(V);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -2243,13 +2316,16 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT) {
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, getVTList(VT), 0, 0);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<SDNode>();
|
||||
new (N) SDNode(Opcode, DL, getVTList(VT));
|
||||
CSEMap.InsertNode(N, IP);
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -2473,8 +2549,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
SDValue Ops[1] = { Operand };
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 1);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
N = NodeAllocator.Allocate<UnarySDNode>();
|
||||
new (N) UnarySDNode(Opcode, DL, VTs, Operand);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
@ -2484,6 +2562,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
}
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -2891,8 +2970,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 2);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
N = NodeAllocator.Allocate<BinarySDNode>();
|
||||
new (N) BinarySDNode(Opcode, DL, VTs, N1, N2);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
@ -2902,6 +2983,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
}
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -2968,8 +3050,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 3);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
N = NodeAllocator.Allocate<TernarySDNode>();
|
||||
new (N) TernarySDNode(Opcode, DL, VTs, N1, N2, N3);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
@ -2977,7 +3061,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
N = NodeAllocator.Allocate<TernarySDNode>();
|
||||
new (N) TernarySDNode(Opcode, DL, VTs, N1, N2, N3);
|
||||
}
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -3573,12 +3659,14 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<AtomicSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode* N = NodeAllocator.Allocate<AtomicSDNode>();
|
||||
new (N) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain, Ptr, Cmp, Swp, MMO);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3636,12 +3724,14 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<AtomicSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode* N = NodeAllocator.Allocate<AtomicSDNode>();
|
||||
new (N) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain, Ptr, Val, MMO);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3714,6 +3804,7 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
|
||||
@ -3725,6 +3816,7 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
|
||||
new (N) MemIntrinsicSDNode(Opcode, dl, VTList, Ops, NumOps, MemVT, MMO);
|
||||
}
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3789,12 +3881,14 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<LoadSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<LoadSDNode>();
|
||||
new (N) LoadSDNode(Ops, dl, VTs, AM, ExtType, MemVT, MMO);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3865,12 +3959,14 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<StoreSDNode>();
|
||||
new (N) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED, false, VT, MMO);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3925,12 +4021,14 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<StoreSDNode>();
|
||||
new (N) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED, true, SVT, MMO);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -3947,14 +4045,17 @@ SelectionDAG::getIndexedStore(SDValue OrigStore, DebugLoc dl, SDValue Base,
|
||||
ID.AddInteger(ST->getMemoryVT().getRawBits());
|
||||
ID.AddInteger(ST->getRawSubclassData());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<StoreSDNode>();
|
||||
new (N) StoreSDNode(Ops, dl, VTs, AM,
|
||||
ST->isTruncatingStore(), ST->getMemoryVT(),
|
||||
ST->getMemOperand());
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
@ -4020,8 +4121,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, NumOps);
|
||||
void *IP = 0;
|
||||
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
|
||||
N = NodeAllocator.Allocate<SDNode>();
|
||||
new (N) SDNode(Opcode, DL, VTs, Ops, NumOps);
|
||||
@ -4032,6 +4135,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
}
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -4087,8 +4191,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return SDValue(E, 0);
|
||||
}
|
||||
if (NumOps == 1) {
|
||||
N = NodeAllocator.Allocate<UnarySDNode>();
|
||||
new (N) UnarySDNode(Opcode, DL, VTList, Ops[0]);
|
||||
@ -4119,6 +4225,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
|
||||
}
|
||||
}
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -4581,8 +4688,10 @@ SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,
|
||||
if (VTs.VTs[VTs.NumVTs-1] != MVT::Flag) {
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opc, VTs, Ops, NumOps);
|
||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(ON);
|
||||
return ON;
|
||||
}
|
||||
}
|
||||
|
||||
if (!RemoveNodeFromCSEMaps(N))
|
||||
@ -4646,6 +4755,7 @@ SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,
|
||||
|
||||
if (IP)
|
||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
||||
if (Ordering) Ordering->add(N);
|
||||
return N;
|
||||
}
|
||||
|
||||
@ -4784,8 +4894,10 @@ SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, ~Opcode, VTs, Ops, NumOps);
|
||||
IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return cast<MachineSDNode>(E);
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate a new MachineSDNode.
|
||||
@ -4807,6 +4919,7 @@ SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
|
||||
CSEMap.InsertNode(N, IP);
|
||||
|
||||
AllNodes.push_back(N);
|
||||
if (Ordering) Ordering->add(N);
|
||||
#ifndef NDEBUG
|
||||
VerifyNode(N);
|
||||
#endif
|
||||
@ -4843,8 +4956,10 @@ SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
if (Ordering) Ordering->add(E);
|
||||
return E;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -6011,6 +6126,9 @@ void SelectionDAG::dump() const {
|
||||
errs() << "\n\n";
|
||||
}
|
||||
|
||||
void SelectionDAG::NodeOrdering::dump() const {
|
||||
}
|
||||
|
||||
void SDNode::printr(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
print_types(OS, G);
|
||||
print_details(OS, G);
|
||||
@ -6151,4 +6269,3 @@ bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -583,6 +583,9 @@ void SelectionDAGBuilder::visit(Instruction &I) {
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visit(unsigned Opcode, User &I) {
|
||||
// Tell the DAG that we're processing a new instruction.
|
||||
DAG.NewInst();
|
||||
|
||||
// Note: this doesn't use InstVisitor, because it has to work with
|
||||
// ConstantExpr's in addition to instructions.
|
||||
switch (Opcode) {
|
||||
|
Loading…
Reference in New Issue
Block a user