1
//===---- ScheduleDAGSDNodes.h - SDNode Scheduling --------------*- C++ -*-===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This file implements the ScheduleDAGSDNodes class, which implements
11
// scheduling for an SDNode-based dependency graph.
13
//===----------------------------------------------------------------------===//
15
#ifndef SCHEDULEDAGSDNODES_H
16
#define SCHEDULEDAGSDNODES_H
18
#include "llvm/CodeGen/ScheduleDAG.h"
19
#include "llvm/CodeGen/SelectionDAG.h"
22
/// ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
24
/// Edges between SUnits are initially based on edges in the SelectionDAG,
25
/// and additional edges can be added by the schedulers as heuristics.
26
/// SDNodes such as Constants, Registers, and a few others that are not
27
/// interesting to schedulers are not allocated SUnits.
29
/// SDNodes with MVT::Flag operands are grouped along with the flagged
30
/// nodes into a single SUnit so that they are scheduled together.
32
/// SDNode-based scheduling graphs do not use SDep::Anti or SDep::Output
33
/// edges. Physical register dependence information is not carried in
34
/// the DAG and must be handled explicitly by schedulers.
36
class ScheduleDAGSDNodes : public ScheduleDAG {
38
SelectionDAG *DAG; // DAG of the current basic block
40
explicit ScheduleDAGSDNodes(MachineFunction &mf);
42
virtual ~ScheduleDAGSDNodes() {}
44
/// Run - perform scheduling.
46
void Run(SelectionDAG *dag, MachineBasicBlock *bb,
47
MachineBasicBlock::iterator insertPos);
49
/// isPassiveNode - Return true if the node is a non-scheduled leaf.
51
static bool isPassiveNode(SDNode *Node) {
52
if (isa<ConstantSDNode>(Node)) return true;
53
if (isa<ConstantFPSDNode>(Node)) return true;
54
if (isa<RegisterSDNode>(Node)) return true;
55
if (isa<GlobalAddressSDNode>(Node)) return true;
56
if (isa<BasicBlockSDNode>(Node)) return true;
57
if (isa<FrameIndexSDNode>(Node)) return true;
58
if (isa<ConstantPoolSDNode>(Node)) return true;
59
if (isa<JumpTableSDNode>(Node)) return true;
60
if (isa<ExternalSymbolSDNode>(Node)) return true;
61
if (isa<BlockAddressSDNode>(Node)) return true;
62
if (Node->getOpcode() == ISD::EntryToken) return true;
66
/// NewSUnit - Creates a new SUnit and return a ptr to it.
68
SUnit *NewSUnit(SDNode *N) {
70
const SUnit *Addr = 0;
74
SUnits.push_back(SUnit(N, (unsigned)SUnits.size()));
75
assert((Addr == 0 || Addr == &SUnits[0]) &&
76
"SUnits std::vector reallocated on the fly!");
77
SUnits.back().OrigNode = &SUnits.back();
78
return &SUnits.back();
81
/// Clone - Creates a clone of the specified SUnit. It does not copy the
82
/// predecessors / successors info nor the temporary scheduling states.
84
SUnit *Clone(SUnit *N);
86
/// BuildSchedGraph - Build the SUnit graph from the selection dag that we
87
/// are input. This SUnit graph is similar to the SelectionDAG, but
88
/// excludes nodes that aren't interesting to scheduling, and represents
89
/// flagged together nodes with a single SUnit.
90
virtual void BuildSchedGraph(AliasAnalysis *AA);
92
/// ComputeLatency - Compute node latency.
94
virtual void ComputeLatency(SUnit *SU);
96
virtual MachineBasicBlock *
97
EmitSchedule(DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM);
99
/// Schedule - Order nodes according to selected style, filling
100
/// in the Sequence member.
102
virtual void Schedule() = 0;
104
virtual void dumpNode(const SUnit *SU) const;
106
virtual std::string getGraphNodeLabel(const SUnit *SU) const;
108
virtual void getCustomGraphFeatures(GraphWriter<ScheduleDAG*> &GW) const;
111
/// ClusterNeighboringLoads - Cluster loads from "near" addresses into
113
void ClusterNeighboringLoads();
115
/// BuildSchedUnits, AddSchedEdges - Helper functions for BuildSchedGraph.
116
void BuildSchedUnits();
117
void AddSchedEdges();