19f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen//===- lib/CodeGen/MachineTraceMetrics.h - Super-scalar metrics -*- C++ -*-===// 29f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 39f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 49f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 59f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 69f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 79f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 89f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 99f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 109f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// This file defines the interface for the MachineTraceMetrics analysis pass 119f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// that estimates CPU resource usage and critical data dependency paths through 129f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// preferred traces. This is useful for super-scalar CPUs where execution speed 139f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// can be limited both by data dependencies and by limited execution resources. 149f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 159f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// Out-of-order CPUs will often be executing instructions from multiple basic 169f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// blocks at the same time. This makes it difficult to estimate the resource 179f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// usage accurately in a single basic block. Resources can be estimated better 189f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// by looking at a trace through the current basic block. 199f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 209f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// For every block, the MachineTraceMetrics pass will pick a preferred trace 219f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// that passes through the block. The trace is chosen based on loop structure, 229f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// branch probabilities, and resource usage. The intention is to pick likely 239f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// traces that would be the most affected by code transformations. 249f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 259f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// It is expensive to compute a full arbitrary trace for every block, so to 269f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// save some computations, traces are chosen to be convergent. This means that 279f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// if the traces through basic blocks A and B ever cross when moving away from 289f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// A and B, they never diverge again. This applies in both directions - If the 299f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// traces meet above A and B, they won't diverge when going further back. 309f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 319f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// Traces tend to align with loops. The trace through a block in an inner loop 329f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// will begin at the loop entry block and end at a back edge. If there are 339f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// nested loops, the trace may begin and end at those instead. 349f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 359f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// For each trace, we compute the critical path length, which is the number of 369f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// cycles required to execute the trace when execution is limited by data 379f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// dependencies only. We also compute the resource height, which is the number 389f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// of cycles required to execute all instructions in the trace when ignoring 399f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// data dependencies. 409f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 419f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// Every instruction in the current block has a slack - the number of cycles 429f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// execution of the instruction can be delayed without extending the critical 439f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// path. 449f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen// 459f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 469f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_CODEGEN_MACHINETRACEMETRICS_H 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_CODEGEN_MACHINETRACEMETRICS_H 499f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 50c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 515f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen#include "llvm/ADT/DenseMap.h" 529f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h" 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/CodeGen/MachineInstr.h" 54f43fe1d163b34e1de5d045773728c571b59d1cddJakob Stoklund Olesen#include "llvm/CodeGen/TargetSchedule.h" 559f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 569f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesennamespace llvm { 579f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 585f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass InstrItineraryData; 599f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenclass MachineBasicBlock; 605f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass MachineInstr; 619f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenclass MachineLoop; 625f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass MachineLoopInfo; 635f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass MachineRegisterInfo; 645f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass TargetInstrInfo; 655f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesenclass TargetRegisterInfo; 669f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenclass raw_ostream; 679f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 689f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenclass MachineTraceMetrics : public MachineFunctionPass { 69a1b2bf79796d8c44b1321a69a7236b85c33ef7caJakob Stoklund Olesen const MachineFunction *MF; 709f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const TargetInstrInfo *TII; 719f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 729f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const MachineRegisterInfo *MRI; 739f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const MachineLoopInfo *Loops; 74f43fe1d163b34e1de5d045773728c571b59d1cddJakob Stoklund Olesen TargetSchedModel SchedModel; 759f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 769f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenpublic: 779f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen class Ensemble; 789f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen class Trace; 799f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen static char ID; 809f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen MachineTraceMetrics(); 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage&) const override; 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnMachineFunction(MachineFunction&) override; 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void releaseMemory() override; 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void verifyAnalysis() const override; 859f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 869f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen friend class Ensemble; 879f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen friend class Trace; 889f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 899f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Per-basic block information that doesn't depend on the trace through the 909f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// block. 919f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen struct FixedBlockInfo { 929f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// The number of non-trivial instructions in the block. 939f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Doesn't count PHI and COPY instructions that are likely to be removed. 949f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen unsigned InstrCount; 959f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 969f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// True when the block contains calls. 979f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen bool HasCalls; 989f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 999f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen FixedBlockInfo() : InstrCount(~0u), HasCalls(false) {} 1009f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1019f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Returns true when resource information for this block has been computed. 1029f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen bool hasResources() const { return InstrCount != ~0u; } 1039f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1049f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Invalidate resource information. 1059f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void invalidate() { InstrCount = ~0u; } 1069f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen }; 1079f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1089f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Get the fixed resource information about MBB. Compute it on demand. 1099f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const FixedBlockInfo *getResources(const MachineBasicBlock*); 1109f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1118396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen /// Get the scaled number of cycles used per processor resource in MBB. 1128396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen /// This is an array with SchedModel.getNumProcResourceKinds() entries. 1138396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen /// The getResources() function above must have been called first. 1148396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen /// 1158396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen /// These numbers have already been scaled by SchedModel.getResourceFactor(). 1168396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen ArrayRef<unsigned> getProcResourceCycles(unsigned MBBNum) const; 1178396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen 118c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// A virtual register or regunit required by a basic block or its trace 119c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// successors. 120c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen struct LiveInReg { 121c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// The virtual register required, or a register unit. 122c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen unsigned Reg; 123c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen 124c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// For virtual registers: Minimum height of the defining instruction. 125c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// For regunits: Height of the highest user in the trace. 126c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen unsigned Height; 127c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen 128c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen LiveInReg(unsigned Reg, unsigned Height = 0) : Reg(Reg), Height(Height) {} 129c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen }; 130c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen 1319f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Per-basic block information that relates to a specific trace through the 1329f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// block. Convergent traces means that only one of these is required per 1339f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// block in a trace ensemble. 1349f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen struct TraceBlockInfo { 1359f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Trace predecessor, or NULL for the first block in the trace. 13608f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen /// Valid when hasValidDepth(). 1379f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const MachineBasicBlock *Pred; 1389f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1399f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Trace successor, or NULL for the last block in the trace. 14008f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen /// Valid when hasValidHeight(). 1419f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const MachineBasicBlock *Succ; 1429f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1430271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen /// The block number of the head of the trace. (When hasValidDepth()). 1440271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen unsigned Head; 1450271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen 1460271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen /// The block number of the tail of the trace. (When hasValidHeight()). 1470271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen unsigned Tail; 1480271a5fa29f73150fad891ca4c43a0a89a64b3bfJakob Stoklund Olesen 1499f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Accumulated number of instructions in the trace above this block. 1509f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Does not include instructions in this block. 1519f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen unsigned InstrDepth; 1529f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1539f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Accumulated number of instructions in the trace below this block. 1549f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Includes instructions in this block. 1559f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen unsigned InstrHeight; 1569f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1575f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen TraceBlockInfo() : 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Pred(nullptr), Succ(nullptr), 1595f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen InstrDepth(~0u), InstrHeight(~0u), 1605f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen HasValidInstrDepths(false), HasValidInstrHeights(false) {} 1619f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1629f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Returns true if the depth resources have been computed from the trace 1639f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// above this block. 1649f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen bool hasValidDepth() const { return InstrDepth != ~0u; } 1659f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1669f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Returns true if the height resources have been computed from the trace 1679f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// below this block. 1689f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen bool hasValidHeight() const { return InstrHeight != ~0u; } 1699f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1709f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Invalidate depth resources when some block above this one has changed. 1715f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen void invalidateDepth() { InstrDepth = ~0u; HasValidInstrDepths = false; } 1729f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 1739f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Invalidate height resources when a block below this one has changed. 1745f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen void invalidateHeight() { InstrHeight = ~0u; HasValidInstrHeights = false; } 1755f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen 1766ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen /// Assuming that this is a dominator of TBI, determine if it contains 1776ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen /// useful instruction depths. A dominating block can be above the current 1786ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen /// trace head, and any dependencies from such a far away dominator are not 1796ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen /// expected to affect the critical path. 1806ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen /// 1816be75ae196e0138048f685d4df7128d24245be5eJakob Stoklund Olesen /// Also returns true when TBI == this. 1826ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen bool isUsefulDominator(const TraceBlockInfo &TBI) const { 1836ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // The trace for TBI may not even be calculated yet. 1846ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen if (!hasValidDepth() || !TBI.hasValidDepth()) 1856ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen return false; 1866ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // Instruction depths are only comparable if the traces share a head. 1876ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen if (Head != TBI.Head) 1886ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen return false; 1896ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // It is almost always the case that TBI belongs to the same trace as 1906ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // this block, but rare convoluted cases involving irreducible control 1916ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // flow, a dominator may share a trace head without actually being on the 1926ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // same trace as TBI. This is not a big problem as long as it doesn't 1936ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen // increase the instruction depth. 1946ffcd5efe15156e2a71bd1a33f5f8e27de894ea3Jakob Stoklund Olesen return HasValidInstrDepths && InstrDepth <= TBI.InstrDepth; 1956be75ae196e0138048f685d4df7128d24245be5eJakob Stoklund Olesen } 1966be75ae196e0138048f685d4df7128d24245be5eJakob Stoklund Olesen 1975f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen // Data-dependency-related information. Per-instruction depth and height 1985f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen // are computed from data dependencies in the current trace, using 1995f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen // itinerary data. 2005f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen 2015f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen /// Instruction depths have been computed. This implies hasValidDepth(). 2025f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen bool HasValidInstrDepths; 2035f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen 2045f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen /// Instruction heights have been computed. This implies hasValidHeight(). 2055f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen bool HasValidInstrHeights; 20608f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen 20779a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen /// Critical path length. This is the number of cycles in the longest data 20879a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen /// dependency chain through the trace. This is only valid when both 20979a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen /// HasValidInstrDepths and HasValidInstrHeights are set. 21079a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen unsigned CriticalPath; 21179a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen 212c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// Live-in registers. These registers are defined above the current block 213c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// and used by this block or a block below it. 214c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// This does not include PHI uses in the current block, but it does 215c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen /// include PHI uses in deeper blocks. 216c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen SmallVector<LiveInReg, 4> LiveIns; 217c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen 21808f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen void print(raw_ostream&) const; 2199f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen }; 2209f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 22184ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// InstrCycles represents the cycle height and depth of an instruction in a 22284ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// trace. 22384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen struct InstrCycles { 22484ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// Earliest issue cycle as determined by data dependencies and instruction 22584ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// latencies from the beginning of the trace. Data dependencies from 22684ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// before the trace are not included. 22784ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen unsigned Depth; 22884ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen 22984ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// Minimum number of cycles from this instruction is issued to the of the 23084ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// trace, as determined by data dependencies and instruction latencies. 23184ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen unsigned Height; 23284ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen }; 23384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen 2349f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// A trace represents a plausible sequence of executed basic blocks that 2359f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// passes through the current basic block one. The Trace class serves as a 2369f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// handle to internal cached data structures. 2379f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen class Trace { 2389f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen Ensemble &TE; 2399f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen TraceBlockInfo &TBI; 2409f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 24184ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen unsigned getBlockNum() const { return &TBI - &TE.BlockInfo[0]; } 24284ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen 2439f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen public: 2449f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen explicit Trace(Ensemble &te, TraceBlockInfo &tbi) : TE(te), TBI(tbi) {} 2459f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void print(raw_ostream&) const; 2469f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 2479f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Compute the total number of instructions in the trace. 2489f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen unsigned getInstrCount() const { 2499f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen return TBI.InstrDepth + TBI.InstrHeight; 2509f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen } 2519f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 2527a8f311ece7108e44ded601237091c23ef7782ebJakob Stoklund Olesen /// Return the resource depth of the top/bottom of the trace center block. 25384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// This is the number of cycles required to execute all instructions from 25484ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// the trace head to the trace center block. The resource depth only 25584ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// considers execution resources, it ignores data dependencies. 25684ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// When Bottom is set, instructions in the trace center block are included. 25784ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen unsigned getResourceDepth(bool Bottom) const; 25884ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen 2595413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// Return the resource length of the trace. This is the number of cycles 2605413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// required to execute the instructions in the trace if they were all 2615413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// independent, exposing the maximum instruction-level parallelism. 2625413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// 2635413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// Any blocks in Extrablocks are included as if they were part of the 2643aa5394e5bbf267824e9d789ec8b1c27b85a8671Andrew Trick /// trace. Likewise, extra resources required by the specified scheduling 2653aa5394e5bbf267824e9d789ec8b1c27b85a8671Andrew Trick /// classes are included. For the caller to account for extra machine 2663aa5394e5bbf267824e9d789ec8b1c27b85a8671Andrew Trick /// instructions, it must first resolve each instruction's scheduling class. 2675c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko unsigned getResourceLength( 26837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ArrayRef<const MachineBasicBlock *> Extrablocks = None, 26937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ArrayRef<const MCSchedClassDesc *> ExtraInstrs = None, 27037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ArrayRef<const MCSchedClassDesc *> RemoveInstrs = None) const; 2715413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen 27284ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// Return the length of the (data dependency) critical path through the 27384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// trace. 27484ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen unsigned getCriticalPath() const { return TBI.CriticalPath; } 27584ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen 27684ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// Return the depth and height of MI. The depth is only valid for 27784ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// instructions in or above the trace center block. The height is only 27884ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// valid for instructions in or below the trace center block. 279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar InstrCycles getInstrCycles(const MachineInstr &MI) const { 280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return TE.Cycles.lookup(&MI); 28184ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen } 2825f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen 28384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// Return the slack of MI. This is the number of cycles MI can be delayed 28484ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// before the critical path becomes longer. 28584ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen /// MI must be an instruction in the trace center block. 286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned getInstrSlack(const MachineInstr &MI) const; 2875413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen 2885413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// Return the Depth of a PHI instruction in a trace center block successor. 2895413b68b1f59041a821287790dbc1ee2e272cf4eJakob Stoklund Olesen /// The PHI does not have to be part of the trace. 290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned getPHIDepth(const MachineInstr &PHI) const; 29137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// A dependence is useful if the basic block of the defining instruction 29337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// is part of the trace of the user instruction. It is assumed that DefMI 29437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// dominates UseMI (see also isUsefulDominator). 295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isDepInTrace(const MachineInstr &DefMI, 296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MachineInstr &UseMI) const; 2975f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen }; 2985f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen 2999f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// A trace ensemble is a collection of traces selected using the same 3009f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// strategy, for example 'minimum resource height'. There is one trace for 3019f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// every block in the function. 3029f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen class Ensemble { 3039f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen SmallVector<TraceBlockInfo, 4> BlockInfo; 3045f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen DenseMap<const MachineInstr*, InstrCycles> Cycles; 3058396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen SmallVector<unsigned, 0> ProcResourceDepths; 3068396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen SmallVector<unsigned, 0> ProcResourceHeights; 3079f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen friend class Trace; 3089f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3099f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void computeTrace(const MachineBasicBlock*); 3109f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void computeDepthResources(const MachineBasicBlock*); 3119f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void computeHeightResources(const MachineBasicBlock*); 31279a20ce6f0d6c1041a5031aca41b50a1e58b1d4bJakob Stoklund Olesen unsigned computeCrossBlockCriticalPath(const TraceBlockInfo&); 3135f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen void computeInstrDepths(const MachineBasicBlock*); 3145f8e8bd656bb174b3e22c0e56ce3d1eb958ac2e2Jakob Stoklund Olesen void computeInstrHeights(const MachineBasicBlock*); 315ebba49395c189364c9ef77fb4c432856330ceca1Jakob Stoklund Olesen void addLiveIns(const MachineInstr *DefMI, unsigned DefOp, 316c7f44b8b8fca87cdd28ffe420c3b87141d88c099Jakob Stoklund Olesen ArrayRef<const MachineBasicBlock*> Trace); 3179f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3189f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen protected: 31964e2973bf78970aedecbb5fda44e19f93f56dd9bJakob Stoklund Olesen MachineTraceMetrics &MTM; 3209f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen virtual const MachineBasicBlock *pickTracePred(const MachineBasicBlock*) =0; 3219f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen virtual const MachineBasicBlock *pickTraceSucc(const MachineBasicBlock*) =0; 3229f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen explicit Ensemble(MachineTraceMetrics*); 323a1b2bf79796d8c44b1321a69a7236b85c33ef7caJakob Stoklund Olesen const MachineLoop *getLoopFor(const MachineBasicBlock*) const; 3249f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const TraceBlockInfo *getDepthResources(const MachineBasicBlock*) const; 3259f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const TraceBlockInfo *getHeightResources(const MachineBasicBlock*) const; 3268396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen ArrayRef<unsigned> getProcResourceDepths(unsigned MBBNum) const; 3278396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen ArrayRef<unsigned> getProcResourceHeights(unsigned MBBNum) const; 3289f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3299f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen public: 3309f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen virtual ~Ensemble(); 33108f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen virtual const char *getName() const =0; 33208f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen void print(raw_ostream&) const; 3339f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void invalidate(const MachineBasicBlock *MBB); 334a1b2bf79796d8c44b1321a69a7236b85c33ef7caJakob Stoklund Olesen void verify() const; 3359f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3369f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Get the trace that passes through MBB. 3379f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// The trace is computed on demand. 3389f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen Trace getTrace(const MachineBasicBlock *MBB); 3399f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen }; 3409f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3419f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Strategies for selecting traces. 3429f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen enum Strategy { 3439f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Select the trace through a block that has the fewest instructions. 3449f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen TS_MinInstrCount, 3459f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3469f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen TS_NumStrategies 3479f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen }; 3489f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3499f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Get the trace ensemble representing the given trace selection strategy. 3509f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// The returned Ensemble object is owned by the MachineTraceMetrics analysis, 3519f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// and valid for the lifetime of the analysis pass. 3529f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen Ensemble *getEnsemble(Strategy); 3539f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3549f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// Invalidate cached information about MBB. This must be called *before* MBB 3559f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen /// is erased, or the CFG is otherwise changed. 35620f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// 35720f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// This invalidates per-block information about resource usage for MBB only, 35820f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// and it invalidates per-trace information for any trace that passes 35920f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// through MBB. 36020f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// 36120f13c50d88560d75129f4a691fe6b477d04dc70Jakob Stoklund Olesen /// Call Ensemble::getTrace() again to update any trace handles. 3629f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen void invalidate(const MachineBasicBlock *MBB); 3639f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3649f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenprivate: 3659f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen // One entry per basic block, indexed by block number. 3669f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen SmallVector<FixedBlockInfo, 4> BlockInfo; 3679f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3688396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // Cycles consumed on each processor resource per block. 3698396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // The number of processor resource kinds is constant for a given subtarget, 3708396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // but it is not known at compile time. The number of cycles consumed by 3718396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // block B on processor resource R is at ProcResourceCycles[B*Kinds + R] 3728396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // where Kinds = SchedModel.getNumProcResourceKinds(). 3738396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen SmallVector<unsigned, 0> ProcResourceCycles; 3748396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen 3759f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen // One ensemble per strategy. 3769f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen Ensemble* Ensembles[TS_NumStrategies]; 3778396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen 3788396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // Convert scaled resource usage to a cycle count that can be compared with 3798396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen // latencies. 3808396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen unsigned getCycles(unsigned Scaled) { 3818396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen unsigned Factor = SchedModel.getLatencyFactor(); 3828396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen return (Scaled + Factor - 1) / Factor; 3838396e130427999c57422e52af3913eb8182847e5Jakob Stoklund Olesen } 3849f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen}; 3859f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3869f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Oleseninline raw_ostream &operator<<(raw_ostream &OS, 3879f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen const MachineTraceMetrics::Trace &Tr) { 3889f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen Tr.print(OS); 3899f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen return OS; 3909f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen} 3919f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 39208f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Oleseninline raw_ostream &operator<<(raw_ostream &OS, 39308f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen const MachineTraceMetrics::Ensemble &En) { 39408f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen En.print(OS); 39508f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen return OS; 39608f6ef6a7807250d84446661b7a6ec4afa762099Jakob Stoklund Olesen} 3979f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen} // end namespace llvm 3989f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen 3999f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen#endif 400