brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 53e82ac Raw
71 lines · cpp
1//===- HexagonMachineScheduler.cpp - MI Scheduler for Hexagon -------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// MachineScheduler schedules machine instructions after phi elimination. It10// preserves LiveIntervals so it can be invoked before register allocation.11//12//===----------------------------------------------------------------------===//13 14#include "HexagonMachineScheduler.h"15#include "HexagonInstrInfo.h"16#include "HexagonSubtarget.h"17#include "llvm/CodeGen/MachineScheduler.h"18#include "llvm/CodeGen/ScheduleDAG.h"19#include "llvm/CodeGen/VLIWMachineScheduler.h"20 21using namespace llvm;22 23#define DEBUG_TYPE "machine-scheduler"24 25/// Return true if there is a dependence between SUd and SUu.26bool HexagonVLIWResourceModel::hasDependence(const SUnit *SUd,27                                             const SUnit *SUu) {28  const auto *QII = static_cast<const HexagonInstrInfo *>(TII);29 30  // Enable .cur formation.31  if (QII->mayBeCurLoad(*SUd->getInstr()))32    return false;33 34  if (QII->canExecuteInBundle(*SUd->getInstr(), *SUu->getInstr()))35    return false;36 37  return VLIWResourceModel::hasDependence(SUd, SUu);38}39 40VLIWResourceModel *HexagonConvergingVLIWScheduler::createVLIWResourceModel(41    const TargetSubtargetInfo &STI, const TargetSchedModel *SchedModel) const {42  return new HexagonVLIWResourceModel(STI, SchedModel);43}44 45int HexagonConvergingVLIWScheduler::SchedulingCost(ReadyQueue &Q, SUnit *SU,46                                                   SchedCandidate &Candidate,47                                                   RegPressureDelta &Delta,48                                                   bool verbose) {49  int ResCount =50      ConvergingVLIWScheduler::SchedulingCost(Q, SU, Candidate, Delta, verbose);51 52  if (!SU || SU->isScheduled)53    return ResCount;54 55  auto &QST = DAG->MF.getSubtarget<HexagonSubtarget>();56  auto &QII = *QST.getInstrInfo();57  if (SU->isInstr() && QII.mayBeCurLoad(*SU->getInstr())) {58    if (Q.getID() == TopQID &&59        Top.ResourceModel->isResourceAvailable(SU, true)) {60      ResCount += PriorityTwo;61      LLVM_DEBUG(if (verbose) dbgs() << "C|");62    } else if (Q.getID() == BotQID &&63               Bot.ResourceModel->isResourceAvailable(SU, false)) {64      ResCount += PriorityTwo;65      LLVM_DEBUG(if (verbose) dbgs() << "C|");66    }67  }68 69  return ResCount;70}71