Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/src/compiler/instruction-scheduler.h b/src/compiler/instruction-scheduler.h
index fafbe47..104c0b9 100644
--- a/src/compiler/instruction-scheduler.h
+++ b/src/compiler/instruction-scheduler.h
@@ -90,11 +90,66 @@
int start_cycle_;
};
- // Compare the two nodes and return true if node1 is a better candidate than
- // node2 (i.e. node1 should be scheduled before node2).
- bool CompareNodes(ScheduleGraphNode *node1, ScheduleGraphNode *node2) const;
+ // Keep track of all nodes ready to be scheduled (i.e. all their dependencies
+ // have been scheduled. Note that this class is inteded to be extended by
+ // concrete implementation of the scheduling queue which define the policy
+ // to pop node from the queue.
+ class SchedulingQueueBase {
+ public:
+ explicit SchedulingQueueBase(InstructionScheduler* scheduler)
+ : scheduler_(scheduler),
+ nodes_(scheduler->zone()) {
+ }
- // Perform scheduling for the current block.
+ void AddNode(ScheduleGraphNode* node) {
+ nodes_.push_back(node);
+ }
+
+ bool IsEmpty() const {
+ return nodes_.empty();
+ }
+
+ protected:
+ InstructionScheduler* scheduler_;
+ ZoneLinkedList<ScheduleGraphNode*> nodes_;
+ };
+
+ // A scheduling queue which prioritize nodes on the critical path (we look
+ // for the instruction with the highest latency on the path to reach the end
+ // of the graph).
+ class CriticalPathFirstQueue : public SchedulingQueueBase {
+ public:
+ explicit CriticalPathFirstQueue(InstructionScheduler* scheduler)
+ : SchedulingQueueBase(scheduler) { }
+
+ // Look for the best candidate to schedule, remove it from the queue and
+ // return it.
+ ScheduleGraphNode* PopBestCandidate(int cycle);
+
+ private:
+ // Compare the two nodes and return true if node1 is a better candidate than
+ // node2 (i.e. node1 should be scheduled before node2).
+ bool CompareNodes(ScheduleGraphNode *node1, ScheduleGraphNode *node2) const;
+ };
+
+ // A queue which pop a random node from the queue to perform stress tests on
+ // the scheduler.
+ class StressSchedulerQueue : public SchedulingQueueBase {
+ public:
+ explicit StressSchedulerQueue(InstructionScheduler* scheduler)
+ : SchedulingQueueBase(scheduler) { }
+
+ ScheduleGraphNode* PopBestCandidate(int cycle);
+
+ private:
+ Isolate *isolate() {
+ return scheduler_->isolate();
+ }
+ };
+
+ // Perform scheduling for the current block specifying the queue type to
+ // use to determine the next best candidate.
+ template <typename QueueType>
void ScheduleBlock();
// Return the scheduling properties of the given instruction.
@@ -134,6 +189,7 @@
Zone* zone() { return zone_; }
InstructionSequence* sequence() { return sequence_; }
+ Isolate* isolate() { return sequence()->isolate(); }
Zone* zone_;
InstructionSequence* sequence_;