mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Normalize interaction with boolean attributes
Such attributes can either be unset, or set to "true" or "false" (as string). throughout the codebase, this led to inelegant checks ranging from if (Fn->getFnAttribute("no-jump-tables").getValueAsString() == "true") to if (Fn->hasAttribute("no-jump-tables") && Fn->getFnAttribute("no-jump-tables").getValueAsString() == "true") Introduce a getValueAsBool that normalize the check, with the following behavior: no attributes or attribute set to "false" => return false attribute set to "true" => return true Differential Revision: https://reviews.llvm.org/D99299
This commit is contained in:
parent
da04af3736
commit
b2fe6dcbc2
@ -1144,7 +1144,7 @@ public:
|
||||
|
||||
/// Return true if lowering to a jump table is allowed.
|
||||
virtual bool areJTsAllowed(const Function *Fn) const {
|
||||
if (Fn->getFnAttribute("no-jump-tables").getValueAsString() == "true")
|
||||
if (Fn->getFnAttribute("no-jump-tables").getValueAsBool())
|
||||
return false;
|
||||
|
||||
return isOperationLegalOrCustom(ISD::BR_JT, MVT::Other) ||
|
||||
|
@ -168,6 +168,10 @@ public:
|
||||
/// attribute be an integer attribute.
|
||||
uint64_t getValueAsInt() const;
|
||||
|
||||
/// Return the attribute's value as a boolean. This requires that the
|
||||
/// attribute be a string attribute.
|
||||
bool getValueAsBool() const;
|
||||
|
||||
/// Return the attribute's kind as a string. This requires the
|
||||
/// attribute to be a string attribute.
|
||||
StringRef getKindAsString() const;
|
||||
|
@ -653,9 +653,9 @@ bool RecurrenceDescriptor::isReductionPHI(PHINode *Phi, Loop *TheLoop,
|
||||
Function &F = *Header->getParent();
|
||||
FastMathFlags FMF;
|
||||
FMF.setNoNaNs(
|
||||
F.getFnAttribute("no-nans-fp-math").getValueAsString() == "true");
|
||||
F.getFnAttribute("no-nans-fp-math").getValueAsBool());
|
||||
FMF.setNoSignedZeros(
|
||||
F.getFnAttribute("no-signed-zeros-fp-math").getValueAsString() == "true");
|
||||
F.getFnAttribute("no-signed-zeros-fp-math").getValueAsBool());
|
||||
|
||||
if (AddReductionVar(Phi, RecurKind::Add, TheLoop, FMF, RedDes, DB, AC, DT)) {
|
||||
LLVM_DEBUG(dbgs() << "Found an ADD reduction PHI." << *Phi << "\n");
|
||||
|
@ -1145,7 +1145,7 @@ bool FastISel::lowerCall(const CallInst *CI) {
|
||||
IsTailCall = false;
|
||||
if (IsTailCall && MF->getFunction()
|
||||
.getFnAttribute("disable-tail-calls")
|
||||
.getValueAsString() == "true")
|
||||
.getValueAsBool())
|
||||
IsTailCall = false;
|
||||
|
||||
CallLoweringInfo CLI;
|
||||
|
@ -53,7 +53,7 @@ bool TargetLowering::isInTailCallPosition(SelectionDAG &DAG, SDNode *Node,
|
||||
const Function &F = DAG.getMachineFunction().getFunction();
|
||||
|
||||
// First, check if tail calls have been disabled in this function.
|
||||
if (F.getFnAttribute("disable-tail-calls").getValueAsString() == "true")
|
||||
if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
|
||||
return false;
|
||||
|
||||
// Conservatively require the attributes of the call to match those of
|
||||
|
@ -64,6 +64,7 @@ public:
|
||||
|
||||
Attribute::AttrKind getKindAsEnum() const;
|
||||
uint64_t getValueAsInt() const;
|
||||
bool getValueAsBool() const;
|
||||
|
||||
StringRef getKindAsString() const;
|
||||
StringRef getValueAsString() const;
|
||||
|
@ -287,6 +287,13 @@ uint64_t Attribute::getValueAsInt() const {
|
||||
return pImpl->getValueAsInt();
|
||||
}
|
||||
|
||||
bool Attribute::getValueAsBool() const {
|
||||
if (!pImpl) return false;
|
||||
assert(isStringAttribute() &&
|
||||
"Expected the attribute to be a string attribute!");
|
||||
return pImpl->getValueAsBool();
|
||||
}
|
||||
|
||||
StringRef Attribute::getKindAsString() const {
|
||||
if (!pImpl) return {};
|
||||
assert(isStringAttribute() &&
|
||||
@ -650,6 +657,11 @@ uint64_t AttributeImpl::getValueAsInt() const {
|
||||
return static_cast<const IntAttributeImpl *>(this)->getValue();
|
||||
}
|
||||
|
||||
bool AttributeImpl::getValueAsBool() const {
|
||||
assert(getValueAsString().empty() || getValueAsString() == "false" || getValueAsString() == "true");
|
||||
return getValueAsString() == "true";
|
||||
}
|
||||
|
||||
StringRef AttributeImpl::getKindAsString() const {
|
||||
assert(isStringAttribute());
|
||||
return static_cast<const StringAttributeImpl *>(this)->getStringKind();
|
||||
|
@ -1717,8 +1717,21 @@ static bool isFuncOrArgAttr(Attribute::AttrKind Kind) {
|
||||
void Verifier::verifyAttributeTypes(AttributeSet Attrs, bool IsFunction,
|
||||
const Value *V) {
|
||||
for (Attribute A : Attrs) {
|
||||
if (A.isStringAttribute())
|
||||
|
||||
if (A.isStringAttribute()) {
|
||||
#define GET_ATTR_NAMES
|
||||
#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
|
||||
#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME) \
|
||||
if (A.getKindAsString() == #DISPLAY_NAME) { \
|
||||
auto V = A.getValueAsString(); \
|
||||
if (!(V.empty() || V == "true" || V == "false")) \
|
||||
CheckFailed("invalid value for '" #DISPLAY_NAME "' attribute: " + V + \
|
||||
""); \
|
||||
}
|
||||
|
||||
#include "llvm/IR/Attributes.inc"
|
||||
continue;
|
||||
}
|
||||
|
||||
if (A.isIntAttribute() !=
|
||||
Attribute::doesAttrKindHaveArgument(A.getKindAsEnum())) {
|
||||
|
@ -809,7 +809,7 @@ bool AMDGPUCodeGenPrepare::visitFDiv(BinaryOperator &FDiv) {
|
||||
|
||||
static bool hasUnsafeFPMath(const Function &F) {
|
||||
Attribute Attr = F.getFnAttribute("unsafe-fp-math");
|
||||
return Attr.getValueAsString() == "true";
|
||||
return Attr.getValueAsBool();
|
||||
}
|
||||
|
||||
static std::pair<Value*, Value*> getMul64(IRBuilder<> &Builder,
|
||||
|
@ -476,7 +476,7 @@ bool AMDGPULibCalls::isUnsafeMath(const CallInst *CI) const {
|
||||
return true;
|
||||
const Function *F = CI->getParent()->getParent();
|
||||
Attribute Attr = F->getFnAttribute("unsafe-fp-math");
|
||||
return Attr.getValueAsString() == "true";
|
||||
return Attr.getValueAsBool();
|
||||
}
|
||||
|
||||
bool AMDGPULibCalls::useNativeFunc(const StringRef F) const {
|
||||
|
@ -67,7 +67,7 @@ static bool processUse(CallInst *CI) {
|
||||
const bool HasReqdWorkGroupSize = MD && MD->getNumOperands() == 3;
|
||||
|
||||
const bool HasUniformWorkGroupSize =
|
||||
F->getFnAttribute("uniform-work-group-size").getValueAsString() == "true";
|
||||
F->getFnAttribute("uniform-work-group-size").getValueAsBool();
|
||||
|
||||
if (!HasReqdWorkGroupSize && !HasUniformWorkGroupSize)
|
||||
return false;
|
||||
|
@ -28,12 +28,10 @@ AMDGPUMachineFunction::AMDGPUMachineFunction(const MachineFunction &MF)
|
||||
const Function &F = MF.getFunction();
|
||||
|
||||
Attribute MemBoundAttr = F.getFnAttribute("amdgpu-memory-bound");
|
||||
MemoryBound = MemBoundAttr.isStringAttribute() &&
|
||||
MemBoundAttr.getValueAsString() == "true";
|
||||
MemoryBound = MemBoundAttr.getValueAsBool();
|
||||
|
||||
Attribute WaveLimitAttr = F.getFnAttribute("amdgpu-wave-limiter");
|
||||
WaveLimiter = WaveLimitAttr.isStringAttribute() &&
|
||||
WaveLimitAttr.getValueAsString() == "true";
|
||||
WaveLimiter = WaveLimitAttr.getValueAsBool();
|
||||
|
||||
CallingConv::ID CC = F.getCallingConv();
|
||||
if (CC == CallingConv::AMDGPU_KERNEL || CC == CallingConv::SPIR_KERNEL)
|
||||
|
@ -274,8 +274,7 @@ ARMBaseTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// function before we can generate a subtarget. We also need to use
|
||||
// it as a key for the subtarget since that can be the only difference
|
||||
// between two functions.
|
||||
bool SoftFloat =
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
// If the soft float attribute is set on the function turn on the soft float
|
||||
// subtarget feature.
|
||||
if (SoftFloat)
|
||||
|
@ -251,8 +251,7 @@ HexagonTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// Creating a separate target feature is not strictly necessary, it only
|
||||
// exists to make "unsafe-fp-math" force creating a new subtarget.
|
||||
|
||||
if (FnAttrs.hasFnAttribute("unsafe-fp-math") &&
|
||||
F.getFnAttribute("unsafe-fp-math").getValueAsString() == "true")
|
||||
if (F.getFnAttribute("unsafe-fp-math").getValueAsBool())
|
||||
FS = FS.empty() ? "+unsafe-fp" : "+unsafe-fp," + FS;
|
||||
|
||||
auto &I = SubtargetMap[CPU + FS];
|
||||
|
@ -487,7 +487,7 @@ SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
report_fatal_error("M68k interrupts may not be called directly");
|
||||
|
||||
auto Attr = MF.getFunction().getFnAttribute("disable-tail-calls");
|
||||
if (Attr.getValueAsString() == "true")
|
||||
if (Attr.getValueAsBool())
|
||||
IsTailCall = false;
|
||||
|
||||
// FIXME Add tailcalls support
|
||||
|
@ -176,9 +176,7 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// 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
|
||||
// function, so we can enable it as a subtarget feature.
|
||||
bool softFloat =
|
||||
F.hasFnAttribute("use-soft-float") &&
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool softFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
|
||||
if (hasMips16Attr)
|
||||
FS += FS.empty() ? "+mips16" : ",+mips16";
|
||||
|
@ -4304,14 +4304,7 @@ bool NVPTXTargetLowering::allowUnsafeFPMath(MachineFunction &MF) const {
|
||||
|
||||
// Allow unsafe math if unsafe-fp-math attribute explicitly says so.
|
||||
const Function &F = MF.getFunction();
|
||||
if (F.hasFnAttribute("unsafe-fp-math")) {
|
||||
Attribute Attr = F.getFnAttribute("unsafe-fp-math");
|
||||
StringRef Val = Attr.getValueAsString();
|
||||
if (Val == "true")
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return F.getFnAttribute("unsafe-fp-math").getValueAsBool();
|
||||
}
|
||||
|
||||
/// PerformADDCombineWithOperands - Try DAG combinations for an ADD with
|
||||
|
@ -343,8 +343,7 @@ PPCTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// function before we can generate a subtarget. We also need to use
|
||||
// it as a key for the subtarget since that can be the only difference
|
||||
// between two functions.
|
||||
bool SoftFloat =
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
// If the soft float attribute is set on the function turn on the soft float
|
||||
// subtarget feature.
|
||||
if (SoftFloat)
|
||||
|
@ -117,9 +117,7 @@ SparcTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// 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
|
||||
// function, so we can enable it as a subtarget feature.
|
||||
bool softFloat =
|
||||
F.hasFnAttribute("use-soft-float") &&
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool softFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
|
||||
if (softFloat)
|
||||
FS += FS.empty() ? "+soft-float" : ",+soft-float";
|
||||
|
@ -179,9 +179,7 @@ SystemZTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// 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
|
||||
// function, so we can enable it as a subtarget feature.
|
||||
bool softFloat =
|
||||
F.hasFnAttribute("use-soft-float") &&
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool softFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
|
||||
if (softFloat)
|
||||
FS += FS.empty() ? "+soft-float" : ",+soft-float";
|
||||
|
@ -56,7 +56,7 @@ bool TargetMachine::isPositionIndependent() const {
|
||||
void TargetMachine::resetTargetOptions(const Function &F) const {
|
||||
#define RESET_OPTION(X, Y) \
|
||||
do { \
|
||||
Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
|
||||
Options.X = F.getFnAttribute(Y).getValueAsBool(); \
|
||||
} while (0)
|
||||
|
||||
RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");
|
||||
|
@ -294,8 +294,7 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
// function before we can generate a subtarget. We also need to use
|
||||
// it as a key for the subtarget since that can be the only difference
|
||||
// between two functions.
|
||||
bool SoftFloat =
|
||||
F.getFnAttribute("use-soft-float").getValueAsString() == "true";
|
||||
bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
|
||||
// If the soft float attribute is set on the function turn on the soft float
|
||||
// subtarget feature.
|
||||
if (SoftFloat)
|
||||
|
@ -5028,7 +5028,7 @@ struct VarArgSystemZHelper : public VarArgHelper {
|
||||
void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
|
||||
bool IsSoftFloatABI = CB.getCalledFunction()
|
||||
->getFnAttribute("use-soft-float")
|
||||
.getValueAsString() == "true";
|
||||
.getValueAsBool();
|
||||
unsigned GpOffset = SystemZGpOffset;
|
||||
unsigned FpOffset = SystemZFpOffset;
|
||||
unsigned VrIndex = 0;
|
||||
|
@ -799,7 +799,7 @@ bool TailRecursionEliminator::eliminate(Function &F,
|
||||
AliasAnalysis *AA,
|
||||
OptimizationRemarkEmitter *ORE,
|
||||
DomTreeUpdater &DTU) {
|
||||
if (F.getFnAttribute("disable-tail-calls").getValueAsString() == "true")
|
||||
if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
|
||||
return false;
|
||||
|
||||
bool MadeChange = false;
|
||||
|
@ -5793,7 +5793,7 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder,
|
||||
// Only build lookup table when we have a target that supports it or the
|
||||
// attribute is not set.
|
||||
if (!TTI.shouldBuildLookupTables() ||
|
||||
(Fn->getFnAttribute("no-jump-tables").getValueAsString() == "true"))
|
||||
(Fn->getFnAttribute("no-jump-tables").getValueAsBool()))
|
||||
return false;
|
||||
|
||||
// FIXME: If the switch is too sparse for a lookup table, perhaps we could
|
||||
|
9
test/Verifier/invalid-strbool-attr.ll
Normal file
9
test/Verifier/invalid-strbool-attr.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: invalid value for 'no-jump-tables' attribute: yes
|
||||
|
||||
define void @func() #0 {
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { "no-jump-tables"="yes" }
|
Loading…
x
Reference in New Issue
Block a user