LLVM  8.0.1
MCSubtargetInfo.cpp
Go to the documentation of this file.
1 //===- MCSubtargetInfo.cpp - Subtarget Information ------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
11 #include "llvm/ADT/ArrayRef.h"
12 #include "llvm/ADT/StringRef.h"
14 #include "llvm/MC/MCSchedule.h"
17 #include <algorithm>
18 #include <cassert>
19 #include <cstring>
20 
21 using namespace llvm;
22 
25  ArrayRef<SubtargetFeatureKV> ProcFeatures) {
27  return Features.getFeatureBits(CPU, ProcDesc, ProcFeatures);
28 }
29 
31  FeatureBits = getFeatures(CPU, FS, ProcDesc, ProcFeatures);
32  if (!CPU.empty())
33  CPUSchedModel = &getSchedModelForCPU(CPU);
34  else
35  CPUSchedModel = &MCSchedModel::GetDefaultSchedModel();
36 }
37 
39  FeatureBits = getFeatures(CPU, FS, ProcDesc, ProcFeatures);
40 }
41 
43  const Triple &TT, StringRef C, StringRef FS,
45  const SubtargetInfoKV *ProcSched, const MCWriteProcResEntry *WPR,
46  const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
47  const InstrStage *IS, const unsigned *OC, const unsigned *FP)
48  : TargetTriple(TT), CPU(C), ProcFeatures(PF), ProcDesc(PD),
49  ProcSchedModels(ProcSched), WriteProcResTable(WPR), WriteLatencyTable(WL),
50  ReadAdvanceTable(RA), Stages(IS), OperandCycles(OC), ForwardingPaths(FP) {
51  InitMCProcessorInfo(CPU, FS);
52 }
53 
55  FeatureBits.flip(FB);
56  return FeatureBits;
57 }
58 
60  FeatureBits ^= FB;
61  return FeatureBits;
62 }
63 
65  SubtargetFeatures::ToggleFeature(FeatureBits, FS, ProcFeatures);
66  return FeatureBits;
67 }
68 
70  SubtargetFeatures::ApplyFeatureFlag(FeatureBits, FS, ProcFeatures);
71  return FeatureBits;
72 }
73 
75  SubtargetFeatures T(FS);
76  FeatureBitset Set, All;
77  for (std::string F : T.getFeatures()) {
78  SubtargetFeatures::ApplyFeatureFlag(Set, F, ProcFeatures);
79  if (F[0] == '-')
80  F[0] = '+';
81  SubtargetFeatures::ApplyFeatureFlag(All, F, ProcFeatures);
82  }
83  return (FeatureBits & All) == Set;
84 }
85 
87  assert(ProcSchedModels && "Processor machine model not available!");
88 
89  ArrayRef<SubtargetInfoKV> SchedModels(ProcSchedModels, ProcDesc.size());
90 
91  assert(std::is_sorted(SchedModels.begin(), SchedModels.end(),
92  [](const SubtargetInfoKV &LHS, const SubtargetInfoKV &RHS) {
93  return strcmp(LHS.Key, RHS.Key) < 0;
94  }) &&
95  "Processor machine model table is not sorted");
96 
97  // Find entry
98  auto Found =
99  std::lower_bound(SchedModels.begin(), SchedModels.end(), CPU);
100  if (Found == SchedModels.end() || StringRef(Found->Key) != CPU) {
101  if (CPU != "help") // Don't error if the user asked for help.
102  errs() << "'" << CPU
103  << "' is not a recognized processor for this target"
104  << " (ignoring processor)\n";
106  }
107  assert(Found->Value && "Missing processor SchedModel value");
108  return *(const MCSchedModel *)Found->Value;
109 }
110 
113  const MCSchedModel &SchedModel = getSchedModelForCPU(CPU);
114  return InstrItineraryData(SchedModel, Stages, OperandCycles, ForwardingPaths);
115 }
116 
118  InstrItins = InstrItineraryData(getSchedModel(), Stages, OperandCycles,
119  ForwardingPaths);
120 }
uint64_t CallInst * C
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
const FeatureBitset Features
F(f)
const char * Key
K-V key string.
Used to provide key value pairs for CPU and arbitrary pointers.
SI optimize exec mask operations pre RA
bool checkFeatures(StringRef FS) const
Check whether the subtarget features are enabled/disabled as per the provided string, ignoring all other features.
const MCSchedModel & getSchedModelForCPU(StringRef CPU) const
Get the machine model of a CPU.
#define T
InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const
Get scheduling itinerary of a CPU.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:133
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:33
Itinerary data supplied by a subtarget to be used by a target.
auto lower_bound(R &&Range, ForwardIt I) -> decltype(adl_begin(Range))
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:1282
void InitMCProcessorInfo(StringRef CPU, StringRef FS)
Initialize the scheduling model and feature bits.
void initInstrItins(InstrItineraryData &InstrItins) const
Initialize an InstrItineraryData instance.
static const MCSchedModel & GetDefaultSchedModel()
Returns the default initialized model.
Definition: MCSchedule.h:374
FeatureBitset ToggleFeature(uint64_t FB)
Toggle a feature and return the re-computed feature bits.
const std::vector< std::string > & getFeatures() const
Returns the vector of individual subtarget features.
Container class for subtarget features.
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
Definition: MCSchedule.h:64
FeatureBitset ApplyFeatureFlag(StringRef FS)
Apply a feature flag and return the re-computed feature bits, including all feature bits implied by t...
static void ToggleFeature(FeatureBitset &Bits, StringRef String, ArrayRef< SubtargetFeatureKV > FeatureTable)
Toggles a feature and update the feature bits.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
Specify the latency in cpu cycles for a particular scheduling class and def index.
Definition: MCSchedule.h:78
Manages the enabling and disabling of subtarget specific features.
Specify the number of cycles allowed after instruction issue before a particular use operand reads it...
Definition: MCSchedule.h:95
These values represent a non-pipelined step in the execution of an instruction.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static void ApplyFeatureFlag(FeatureBitset &Bits, StringRef Feature, ArrayRef< SubtargetFeatureKV > FeatureTable)
Applies the feature flag and update the feature bits.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
static FeatureBitset getFeatures(StringRef CPU, StringRef FS, ArrayRef< SubtargetFeatureKV > ProcDesc, ArrayRef< SubtargetFeatureKV > ProcFeatures)
FeatureBitset getFeatureBits(StringRef CPU, ArrayRef< SubtargetFeatureKV > CPUTable, ArrayRef< SubtargetFeatureKV > FeatureTable)
Returns feature bits of a CPU.
Machine model for scheduling, bundling, and heuristics.
Definition: MCSchedule.h:244
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget&#39;s CPU.
void setDefaultFeatures(StringRef CPU, StringRef FS)
Set the features to the default for the given CPU with an appended feature string.