113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//==- SystemZMachineScheduler.h - SystemZ Scheduler Interface ----*- C++ -*-==//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// -------------------------- Post RA scheduling ---------------------------- //
 | 
						|
// SystemZPostRASchedStrategy is a scheduling strategy which is plugged into
 | 
						|
// the MachineScheduler. It has a sorted Available set of SUs and a pickNode()
 | 
						|
// implementation that looks to optimize decoder grouping and balance the
 | 
						|
// usage of processor resources.
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "SystemZHazardRecognizer.h"
 | 
						|
#include "llvm/CodeGen/MachineScheduler.h"
 | 
						|
#include "llvm/CodeGen/ScheduleDAG.h"
 | 
						|
#include <set>
 | 
						|
 | 
						|
#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
 | 
						|
#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
  
 | 
						|
/// A MachineSchedStrategy implementation for SystemZ post RA scheduling.
 | 
						|
class SystemZPostRASchedStrategy : public MachineSchedStrategy {
 | 
						|
  ScheduleDAGMI *DAG;
 | 
						|
  
 | 
						|
  /// A candidate during instruction evaluation.
 | 
						|
  struct Candidate {
 | 
						|
    SUnit *SU = nullptr;
 | 
						|
 | 
						|
    /// The decoding cost.
 | 
						|
    int GroupingCost = 0;
 | 
						|
 | 
						|
    /// The processor resources cost.
 | 
						|
    int ResourcesCost = 0;
 | 
						|
 | 
						|
    Candidate() = default;
 | 
						|
    Candidate(SUnit *SU_, SystemZHazardRecognizer &HazardRec);
 | 
						|
 | 
						|
    // Compare two candidates.
 | 
						|
    bool operator<(const Candidate &other);
 | 
						|
 | 
						|
    // Check if this node is free of cost ("as good as any").
 | 
						|
    bool noCost() const {
 | 
						|
      return (GroupingCost <= 0 && !ResourcesCost);
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  // A sorter for the Available set that makes sure that SUs are considered
 | 
						|
  // in the best order.
 | 
						|
  struct SUSorter {
 | 
						|
    bool operator() (SUnit *lhs, SUnit *rhs) const {
 | 
						|
      if (lhs->isScheduleHigh && !rhs->isScheduleHigh)
 | 
						|
        return true;
 | 
						|
      if (!lhs->isScheduleHigh && rhs->isScheduleHigh)
 | 
						|
        return false;
 | 
						|
 | 
						|
      if (lhs->getHeight() > rhs->getHeight())
 | 
						|
        return true;
 | 
						|
      else if (lhs->getHeight() < rhs->getHeight())
 | 
						|
        return false;
 | 
						|
 | 
						|
      return (lhs->NodeNum < rhs->NodeNum);
 | 
						|
    }
 | 
						|
  };
 | 
						|
  // A set of SUs with a sorter and dump method.
 | 
						|
  struct SUSet : std::set<SUnit*, SUSorter> {
 | 
						|
    #ifndef NDEBUG
 | 
						|
    void dump(SystemZHazardRecognizer &HazardRec) const;
 | 
						|
    #endif
 | 
						|
  };
 | 
						|
 | 
						|
  /// The set of available SUs to schedule next.
 | 
						|
  SUSet Available;
 | 
						|
 | 
						|
  // HazardRecognizer that tracks the scheduler state for the current
 | 
						|
  // region.
 | 
						|
  SystemZHazardRecognizer HazardRec;
 | 
						|
  
 | 
						|
public:
 | 
						|
  SystemZPostRASchedStrategy(const MachineSchedContext *C);
 | 
						|
 | 
						|
  /// PostRA scheduling does not track pressure.
 | 
						|
  bool shouldTrackPressure() const override { return false; }
 | 
						|
 | 
						|
  /// Initialize the strategy after building the DAG for a new region.
 | 
						|
  void initialize(ScheduleDAGMI *dag) override;
 | 
						|
 | 
						|
  /// Pick the next node to schedule, or return NULL.
 | 
						|
  SUnit *pickNode(bool &IsTopNode) override;
 | 
						|
 | 
						|
  /// ScheduleDAGMI has scheduled an instruction - tell HazardRec
 | 
						|
  /// about it.
 | 
						|
  void schedNode(SUnit *SU, bool IsTopNode) override;
 | 
						|
 | 
						|
  /// SU has had all predecessor dependencies resolved. Put it into
 | 
						|
  /// Available.
 | 
						|
  void releaseTopNode(SUnit *SU) override;
 | 
						|
 | 
						|
  /// Currently only scheduling top-down, so this method is empty.
 | 
						|
  void releaseBottomNode(SUnit *SU) override {};
 | 
						|
};
 | 
						|
 | 
						|
} // end namespace llvm
 | 
						|
 | 
						|
#endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
 |