brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 280946b Raw
125 lines · cpp
1//===- RegAllocScore.cpp - evaluate regalloc policy quality ---------------===//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/// Calculate a measure of the register allocation policy quality. This is used9/// to construct a reward for the training of the ML-driven allocation policy.10/// Currently, the score is the sum of the machine basic block frequency-weighed11/// number of loads, stores, copies, and remat instructions, each factored with12/// a relative weight.13//===----------------------------------------------------------------------===//14 15#include "RegAllocScore.h"16#include "llvm/CodeGen/MachineBasicBlock.h"17#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"18#include "llvm/CodeGen/MachineFunction.h"19#include "llvm/CodeGen/MachineInstr.h"20#include "llvm/CodeGen/TargetInstrInfo.h"21#include "llvm/CodeGen/TargetSubtargetInfo.h"22#include "llvm/MC/MCInstrDesc.h"23#include "llvm/Support/CommandLine.h"24 25using namespace llvm;26 27namespace llvm {28LLVM_ABI cl::opt<double> CopyWeight("regalloc-copy-weight", cl::init(0.2),29                                    cl::Hidden);30LLVM_ABI cl::opt<double> LoadWeight("regalloc-load-weight", cl::init(4.0),31                                    cl::Hidden);32LLVM_ABI cl::opt<double> StoreWeight("regalloc-store-weight", cl::init(1.0),33                                     cl::Hidden);34LLVM_ABI cl::opt<double> CheapRematWeight("regalloc-cheap-remat-weight",35                                          cl::init(0.2), cl::Hidden);36LLVM_ABI cl::opt<double> ExpensiveRematWeight("regalloc-expensive-remat-weight",37                                              cl::init(1.0), cl::Hidden);38} // end namespace llvm39 40#define DEBUG_TYPE "regalloc-score"41 42RegAllocScore &RegAllocScore::operator+=(const RegAllocScore &Other) {43  CopyCounts += Other.copyCounts();44  LoadCounts += Other.loadCounts();45  StoreCounts += Other.storeCounts();46  LoadStoreCounts += Other.loadStoreCounts();47  CheapRematCounts += Other.cheapRematCounts();48  ExpensiveRematCounts += Other.expensiveRematCounts();49  return *this;50}51 52bool RegAllocScore::operator==(const RegAllocScore &Other) const {53  return copyCounts() == Other.copyCounts() &&54         loadCounts() == Other.loadCounts() &&55         storeCounts() == Other.storeCounts() &&56         loadStoreCounts() == Other.loadStoreCounts() &&57         cheapRematCounts() == Other.cheapRematCounts() &&58         expensiveRematCounts() == Other.expensiveRematCounts();59}60 61bool RegAllocScore::operator!=(const RegAllocScore &Other) const {62  return !(*this == Other);63}64 65double RegAllocScore::getScore() const {66  double Ret = 0.0;67  Ret += CopyWeight * copyCounts();68  Ret += LoadWeight * loadCounts();69  Ret += StoreWeight * storeCounts();70  Ret += (LoadWeight + StoreWeight) * loadStoreCounts();71  Ret += CheapRematWeight * cheapRematCounts();72  Ret += ExpensiveRematWeight * expensiveRematCounts();73 74  return Ret;75}76 77RegAllocScore78llvm::calculateRegAllocScore(const MachineFunction &MF,79                             const MachineBlockFrequencyInfo &MBFI) {80  return calculateRegAllocScore(81      MF,82      [&](const MachineBasicBlock &MBB) {83        return MBFI.getBlockFreqRelativeToEntryBlock(&MBB);84      },85      [&](const MachineInstr &MI) {86        return MF.getSubtarget().getInstrInfo()->isReMaterializable(MI);87      });88}89 90RegAllocScore llvm::calculateRegAllocScore(91    const MachineFunction &MF,92    llvm::function_ref<double(const MachineBasicBlock &)> GetBBFreq,93    llvm::function_ref<bool(const MachineInstr &)>94        IsTriviallyRematerializable) {95  RegAllocScore Total;96 97  for (const MachineBasicBlock &MBB : MF) {98    double BlockFreqRelativeToEntrypoint = GetBBFreq(MBB);99    RegAllocScore MBBScore;100 101    for (const MachineInstr &MI : MBB) {102      if (MI.isDebugInstr() || MI.isKill() || MI.isInlineAsm()) {103        continue;104      }105      if (MI.isCopy()) {106        MBBScore.onCopy(BlockFreqRelativeToEntrypoint);107      } else if (IsTriviallyRematerializable(MI)) {108        if (MI.getDesc().isAsCheapAsAMove()) {109          MBBScore.onCheapRemat(BlockFreqRelativeToEntrypoint);110        } else {111          MBBScore.onExpensiveRemat(BlockFreqRelativeToEntrypoint);112        }113      } else if (MI.mayLoad() && MI.mayStore()) {114        MBBScore.onLoadStore(BlockFreqRelativeToEntrypoint);115      } else if (MI.mayLoad()) {116        MBBScore.onLoad(BlockFreqRelativeToEntrypoint);117      } else if (MI.mayStore()) {118        MBBScore.onStore(BlockFreqRelativeToEntrypoint);119      }120    }121    Total += MBBScore;122  }123  return Total;124}125