mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:39:57 +00:00
[Attributes] Add a method to check if an Attribute has AttrKind None. Use instead of hasAttribute(Attribute::None)
There's a special case in hasAttribute for None when pImpl is null. If pImpl is not null we dispatch to pImpl->hasAttribute which will always return false for Attribute::None. So if we just want to check for None its sufficient to just check that pImpl is null. Which can even be done inline. This patch adds a helper for that case which I hope will speed up our getSubtargetImpl implementations. Differential Revision: https://reviews.llvm.org/D86744
This commit is contained in:
parent
82da713351
commit
09050e4cf7
@ -139,6 +139,9 @@ public:
|
||||
/// Return true if the attribute is a type attribute.
|
||||
bool isTypeAttribute() const;
|
||||
|
||||
/// Return true if the attribute is any kind of attribute.
|
||||
bool isValid() const { return pImpl; }
|
||||
|
||||
/// Return true if the attribute is present.
|
||||
bool hasAttribute(AttrKind Val) const;
|
||||
|
||||
|
@ -145,20 +145,18 @@ void XRayInstrumentation::prependRetWithPatchableExit(
|
||||
bool XRayInstrumentation::runOnMachineFunction(MachineFunction &MF) {
|
||||
auto &F = MF.getFunction();
|
||||
auto InstrAttr = F.getFnAttribute("function-instrument");
|
||||
bool AlwaysInstrument = !InstrAttr.hasAttribute(Attribute::None) &&
|
||||
InstrAttr.isStringAttribute() &&
|
||||
bool AlwaysInstrument = InstrAttr.isStringAttribute() &&
|
||||
InstrAttr.getValueAsString() == "xray-always";
|
||||
auto ThresholdAttr = F.getFnAttribute("xray-instruction-threshold");
|
||||
auto IgnoreLoopsAttr = F.getFnAttribute("xray-ignore-loops");
|
||||
unsigned int XRayThreshold = 0;
|
||||
if (!AlwaysInstrument) {
|
||||
if (ThresholdAttr.hasAttribute(Attribute::None) ||
|
||||
!ThresholdAttr.isStringAttribute())
|
||||
if (!ThresholdAttr.isStringAttribute())
|
||||
return false; // XRay threshold attribute not found.
|
||||
if (ThresholdAttr.getValueAsString().getAsInteger(10, XRayThreshold))
|
||||
return false; // Invalid value for threshold.
|
||||
|
||||
bool IgnoreLoops = !IgnoreLoopsAttr.hasAttribute(Attribute::None);
|
||||
bool IgnoreLoops = IgnoreLoopsAttr.isValid();
|
||||
|
||||
// Count the number of MachineInstr`s in MachineFunction
|
||||
int64_t MICount = 0;
|
||||
|
@ -121,7 +121,10 @@ protected:
|
||||
|
||||
public:
|
||||
EnumAttributeImpl(Attribute::AttrKind Kind)
|
||||
: AttributeImpl(EnumAttrEntry), Kind(Kind) {}
|
||||
: AttributeImpl(EnumAttrEntry), Kind(Kind) {
|
||||
assert(Kind != Attribute::AttrKind::None &&
|
||||
"Can't create a None attribute!");
|
||||
}
|
||||
|
||||
Attribute::AttrKind getEnumKind() const { return Kind; }
|
||||
};
|
||||
|
@ -1087,10 +1087,10 @@ AttributeList::get(LLVMContext &C,
|
||||
return LHS.first < RHS.first;
|
||||
}) &&
|
||||
"Misordered Attributes list!");
|
||||
assert(llvm::none_of(Attrs,
|
||||
[](const std::pair<unsigned, Attribute> &Pair) {
|
||||
return Pair.second.hasAttribute(Attribute::None);
|
||||
}) &&
|
||||
assert(llvm::all_of(Attrs,
|
||||
[](const std::pair<unsigned, Attribute> &Pair) {
|
||||
return Pair.second.isValid();
|
||||
}) &&
|
||||
"Pointless attribute!");
|
||||
|
||||
// Create a vector if (unsigned, AttributeSetNode*) pairs from the attributes
|
||||
|
@ -331,12 +331,10 @@ AArch64TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
auto &I = SubtargetMap[CPU + FS];
|
||||
if (!I) {
|
||||
|
@ -401,16 +401,14 @@ AMDGPUTargetMachine::~AMDGPUTargetMachine() = default;
|
||||
|
||||
StringRef AMDGPUTargetMachine::getGPUName(const Function &F) const {
|
||||
Attribute GPUAttr = F.getFnAttribute("target-cpu");
|
||||
return GPUAttr.hasAttribute(Attribute::None) ?
|
||||
getTargetCPU() : GPUAttr.getValueAsString();
|
||||
return GPUAttr.isValid() ? GPUAttr.getValueAsString() : getTargetCPU();
|
||||
}
|
||||
|
||||
StringRef AMDGPUTargetMachine::getFeatureString(const Function &F) const {
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
return FSAttr.hasAttribute(Attribute::None) ?
|
||||
getTargetFeatureString() :
|
||||
FSAttr.getValueAsString();
|
||||
return FSAttr.isValid() ? FSAttr.getValueAsString()
|
||||
: getTargetFeatureString();
|
||||
}
|
||||
|
||||
/// Predicate for Internalize pass.
|
||||
|
@ -261,12 +261,10 @@ ARMBaseTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
|
@ -235,12 +235,10 @@ HexagonTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute FSAttr =
|
||||
FnAttrs.getAttribute(AttributeList::FunctionIndex, "target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
// Append the preexisting target features last, so that +mattr overrides
|
||||
// the "unsafe-fp-math" function attribute.
|
||||
// Creating a separate target feature is not strictly necessary, it only
|
||||
|
@ -163,21 +163,15 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
bool hasMips16Attr =
|
||||
!F.getFnAttribute("mips16").hasAttribute(Attribute::None);
|
||||
bool hasNoMips16Attr =
|
||||
!F.getFnAttribute("nomips16").hasAttribute(Attribute::None);
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
bool hasMips16Attr = F.getFnAttribute("mips16").isValid();
|
||||
bool hasNoMips16Attr = F.getFnAttribute("nomips16").isValid();
|
||||
|
||||
bool HasMicroMipsAttr =
|
||||
!F.getFnAttribute("micromips").hasAttribute(Attribute::None);
|
||||
bool HasNoMicroMipsAttr =
|
||||
!F.getFnAttribute("nomicromips").hasAttribute(Attribute::None);
|
||||
bool HasMicroMipsAttr = F.getFnAttribute("micromips").isValid();
|
||||
bool HasNoMicroMipsAttr = F.getFnAttribute("nomicromips").isValid();
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
|
@ -316,12 +316,10 @@ PPCTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
|
@ -77,12 +77,10 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
std::string Key = CPU + FS;
|
||||
auto &I = SubtargetMap[Key];
|
||||
if (!I) {
|
||||
|
@ -111,12 +111,10 @@ SparcTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
|
@ -171,12 +171,10 @@ SystemZTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
|
@ -160,12 +160,10 @@ WebAssemblyTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute CPUAttr = F.getFnAttribute("target-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString().str()
|
||||
: TargetCPU;
|
||||
std::string FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString().str()
|
||||
: TargetFS;
|
||||
std::string CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
|
||||
std::string FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
|
||||
|
||||
// This needs to be done before we create a new subtarget since any
|
||||
// creation will depend on the TM and the code generation flags on the
|
||||
|
@ -236,15 +236,12 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
Attribute TuneAttr = F.getFnAttribute("tune-cpu");
|
||||
Attribute FSAttr = F.getFnAttribute("target-features");
|
||||
|
||||
StringRef CPU = !CPUAttr.hasAttribute(Attribute::None)
|
||||
? CPUAttr.getValueAsString()
|
||||
: (StringRef)TargetCPU;
|
||||
StringRef TuneCPU = !TuneAttr.hasAttribute(Attribute::None)
|
||||
? TuneAttr.getValueAsString()
|
||||
: (StringRef)CPU;
|
||||
StringRef FS = !FSAttr.hasAttribute(Attribute::None)
|
||||
? FSAttr.getValueAsString()
|
||||
: (StringRef)TargetFS;
|
||||
StringRef CPU =
|
||||
CPUAttr.isValid() ? CPUAttr.getValueAsString() : (StringRef)TargetCPU;
|
||||
StringRef TuneCPU =
|
||||
TuneAttr.isValid() ? TuneAttr.getValueAsString() : (StringRef)CPU;
|
||||
StringRef FS =
|
||||
FSAttr.isValid() ? FSAttr.getValueAsString() : (StringRef)TargetFS;
|
||||
|
||||
SmallString<512> Key;
|
||||
// The additions here are ordered so that the definitely short strings are
|
||||
@ -255,7 +252,7 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// Extract prefer-vector-width attribute.
|
||||
unsigned PreferVectorWidthOverride = 0;
|
||||
Attribute PreferVecWidthAttr = F.getFnAttribute("prefer-vector-width");
|
||||
if (!PreferVecWidthAttr.hasAttribute(Attribute::None)) {
|
||||
if (PreferVecWidthAttr.isValid()) {
|
||||
StringRef Val = PreferVecWidthAttr.getValueAsString();
|
||||
unsigned Width;
|
||||
if (!Val.getAsInteger(0, Width)) {
|
||||
@ -268,7 +265,7 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// Extract min-legal-vector-width attribute.
|
||||
unsigned RequiredVectorWidth = UINT32_MAX;
|
||||
Attribute MinLegalVecWidthAttr = F.getFnAttribute("min-legal-vector-width");
|
||||
if (!MinLegalVecWidthAttr.hasAttribute(Attribute::None)) {
|
||||
if (MinLegalVecWidthAttr.isValid()) {
|
||||
StringRef Val = MinLegalVecWidthAttr.getValueAsString();
|
||||
unsigned Width;
|
||||
if (!Val.getAsInteger(0, Width)) {
|
||||
|
@ -1326,7 +1326,7 @@ void LowerTypeTestsModule::replaceWeakDeclarationWithJumpTablePtr(
|
||||
|
||||
static bool isThumbFunction(Function *F, Triple::ArchType ModuleArch) {
|
||||
Attribute TFAttr = F->getFnAttribute("target-features");
|
||||
if (!TFAttr.hasAttribute(Attribute::None)) {
|
||||
if (TFAttr.isValid()) {
|
||||
SmallVector<StringRef, 6> Features;
|
||||
TFAttr.getValueAsString().split(Features, ',');
|
||||
for (StringRef Feature : Features) {
|
||||
|
@ -1258,7 +1258,7 @@ void DevirtModule::applyICallBranchFunnel(VTableSlotInfo &SlotInfo,
|
||||
|
||||
// Jump tables are only profitable if the retpoline mitigation is enabled.
|
||||
Attribute FSAttr = CB.getCaller()->getFnAttribute("target-features");
|
||||
if (FSAttr.hasAttribute(Attribute::None) ||
|
||||
if (!FSAttr.isValid() ||
|
||||
!FSAttr.getValueAsString().contains("+retpoline"))
|
||||
continue;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user