2
2
//
3
3
// The LLVM Compiler Infrastructure
4
4
//
5
- // This file was developed by Chris Lattner and is distributed under the
5
+ // This file was developed by James M. Laskey and is distributed under the
6
6
// University of Illinois Open Source License. See LICENSE.TXT for details.
7
7
//
8
8
// ===----------------------------------------------------------------------===//
@@ -192,15 +192,17 @@ class ResourceTally {
192
192
193
193
// Forward
194
194
class NodeInfo ;
195
- typedef std::vector<NodeInfo *> NIVector;
196
- typedef std::vector<NodeInfo *>::iterator NIIterator;
195
+ typedef NodeInfo *NodeInfoPtr;
196
+ typedef std::vector<NodeInfoPtr> NIVector;
197
+ typedef std::vector<NodeInfoPtr>::iterator NIIterator;
197
198
198
199
// ===----------------------------------------------------------------------===//
199
200
// /
200
201
// / Node group - This struct is used to manage flagged node groups.
201
202
// /
202
- class NodeGroup : public NIVector {
203
+ class NodeGroup {
203
204
private:
205
+ NIVector Members; // Group member nodes
204
206
int Pending; // Number of visits pending before
205
207
// adding to order
206
208
@@ -209,10 +211,24 @@ class NodeGroup : public NIVector {
209
211
NodeGroup () : Pending(0 ) {}
210
212
211
213
// Accessors
212
- inline NodeInfo *getLeader () { return empty () ? NULL : front (); }
214
+ inline NodeInfo *getLeader () {
215
+ return Members.empty () ? NULL : Members.front ();
216
+ }
213
217
inline int getPending () const { return Pending; }
214
218
inline void setPending (int P) { Pending = P; }
215
219
inline int addPending (int I) { return Pending += I; }
220
+
221
+ // Pass thru
222
+ inline bool group_empty () { return Members.empty (); }
223
+ inline NIIterator group_begin () { return Members.begin (); }
224
+ inline NIIterator group_end () { return Members.end (); }
225
+ inline void group_push_back (const NodeInfoPtr &NI) { Members.push_back (NI); }
226
+ inline NIIterator group_insert (NIIterator Pos, const NodeInfoPtr &NI) {
227
+ return Members.insert (Pos, NI);
228
+ }
229
+ inline void group_insert (NIIterator Pos, NIIterator First, NIIterator Last) {
230
+ Members.insert (Pos, First, Last);
231
+ }
216
232
217
233
static void Add (NodeInfo *D, NodeInfo *U);
218
234
static unsigned CountInternalUses (NodeInfo *D, NodeInfo *U);
@@ -257,7 +273,7 @@ class NodeInfo {
257
273
258
274
// Accessors
259
275
inline bool isInGroup () const {
260
- assert (!Group || !Group->empty () && " Group with no members" );
276
+ assert (!Group || !Group->group_empty () && " Group with no members" );
261
277
return Group != NULL ;
262
278
}
263
279
inline bool isGroupLeader () const {
@@ -298,8 +314,8 @@ class NodeGroupIterator {
298
314
if (N->isInGroup ()) {
299
315
// get Group
300
316
NodeGroup *Group = NI->Group ;
301
- NGI = Group->begin ();
302
- NGE = Group->end ();
317
+ NGI = Group->group_begin ();
318
+ NGE = Group->group_end ();
303
319
// Prevent this node from being used (will be in members list
304
320
NI = NULL ;
305
321
}
@@ -491,7 +507,8 @@ void NodeGroup::Add(NodeInfo *D, NodeInfo *U) {
491
507
}
492
508
}
493
509
// Merge the two lists
494
- DGroup->insert (DGroup->end (), UGroup->begin (), UGroup->end ());
510
+ DGroup->group_insert (DGroup->group_end (),
511
+ UGroup->group_begin (), UGroup->group_end ());
495
512
} else if (DGroup) {
496
513
// Make user member of definers group
497
514
U->Group = DGroup;
@@ -503,7 +520,7 @@ void NodeGroup::Add(NodeInfo *D, NodeInfo *U) {
503
520
// Remove internal edges
504
521
DGroup->addPending (-CountInternalUses (DNI, U));
505
522
}
506
- DGroup->push_back (U);
523
+ DGroup->group_push_back (U);
507
524
} else if (UGroup) {
508
525
// Make definer member of users group
509
526
D->Group = UGroup;
@@ -515,24 +532,25 @@ void NodeGroup::Add(NodeInfo *D, NodeInfo *U) {
515
532
// Remove internal edges
516
533
UGroup->addPending (-CountInternalUses (D, UNI));
517
534
}
518
- UGroup->insert (UGroup->begin (), D);
535
+ UGroup->group_insert (UGroup->group_begin (), D);
519
536
} else {
520
537
D->Group = U->Group = DGroup = new NodeGroup ();
521
538
DGroup->addPending (D->Node ->use_size () + U->Node ->use_size () -
522
539
CountInternalUses (D, U));
523
- DGroup->push_back (D);
524
- DGroup->push_back (U);
540
+ DGroup->group_push_back (D);
541
+ DGroup->group_push_back (U);
525
542
}
526
543
}
527
544
528
545
// / CountInternalUses - Returns the number of edges between the two nodes.
529
546
// /
530
547
unsigned NodeGroup::CountInternalUses (NodeInfo *D, NodeInfo *U) {
531
548
unsigned N = 0 ;
532
- for (SDNode:: use_iterator UI = D ->Node ->use_begin (),
533
- E = D ->Node ->use_end (); UI != E; UI++) {
534
- if (*UI == U ->Node ) N++;
549
+ for (unsigned M = U ->Node ->getNumOperands (); 0 < M--;) {
550
+ SDOperand Op = U ->Node ->getOperand (M);
551
+ if (Op. Val == D ->Node ) N++;
535
552
}
553
+
536
554
return N;
537
555
}
538
556
// ===----------------------------------------------------------------------===//
@@ -743,7 +761,7 @@ void SimpleSched::GatherSchedulingInfo() {
743
761
unsigned ResourceSet = 0 ;
744
762
bool IsCall = false ;
745
763
746
- for (NIIterator NGI = Group->begin (), NGE = Group->end ();
764
+ for (NIIterator NGI = Group->group_begin (), NGE = Group->group_end ();
747
765
NGI != NGE; NGI++) {
748
766
NodeInfo* NGNI = *NGI;
749
767
Latency += NGNI->Latency ;
@@ -798,7 +816,8 @@ bool SimpleSched::isStrongDependency(NodeInfo *A, NodeInfo *B) {
798
816
}
799
817
800
818
// / isWeakDependency Return true if node A produces a result that will
801
- // / conflict with operands of B.
819
+ // / conflict with operands of B. It is assumed that we have called
820
+ // / isStrongDependency prior.
802
821
bool SimpleSched::isWeakDependency (NodeInfo *A, NodeInfo *B) {
803
822
// TODO check for conflicting real registers and aliases
804
823
#if 0 // FIXME - Since we are in SSA form and not checking register aliasing
@@ -1225,7 +1244,7 @@ void SimpleSched::printChanges(unsigned Index) {
1225
1244
std::cerr << " \n " ;
1226
1245
if (NI->isGroupLeader ()) {
1227
1246
NodeGroup *Group = NI->Group ;
1228
- for (NIIterator NII = Group->begin (), E = Group->end ();
1247
+ for (NIIterator NII = Group->group_begin (), E = Group->group_end ();
1229
1248
NII != E; NII++) {
1230
1249
std::cerr << " " ;
1231
1250
printSI (std::cerr, *NII);
@@ -1269,7 +1288,7 @@ void SimpleSched::print(std::ostream &O) const {
1269
1288
O << " \n " ;
1270
1289
if (NI->isGroupLeader ()) {
1271
1290
NodeGroup *Group = NI->Group ;
1272
- for (NIIterator NII = Group->begin (), E = Group->end ();
1291
+ for (NIIterator NII = Group->group_begin (), E = Group->group_end ();
1273
1292
NII != E; NII++) {
1274
1293
O << " " ;
1275
1294
printSI (O, *NII);
0 commit comments