Skip to content

Commit

Permalink
Set some fast math attributes in setFunctionAttributes
Browse files Browse the repository at this point in the history
This will provide a more consistent view to codegen for these
attributes. The current system is somewhat awkward, and the fields in
TargetOptions are reset based on the command line flag if the
attribute isn't set. By forcing these attributes with the flag, there
can never be an inconsistency in the behavior if code directly
inspects the attribute on the function without considering the command
line flags.
  • Loading branch information
arsenm committed Jan 16, 2020
1 parent b54a50f commit c378e52
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
16 changes: 16 additions & 0 deletions llvm/include/llvm/CodeGen/CommandFlags.inc
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,17 @@ LLVM_ATTRIBUTE_UNUSED static std::vector<std::string> getFeatureList() {
return Features.getFeatures();
}

static void renderBoolStringAttr(AttrBuilder &B, StringRef Name, bool Val) {
B.addAttribute(Name, Val ? "true" : "false");
}

#define HANDLE_BOOL_ATTR(CL, AttrName) \
do { \
if (CL.getNumOccurrences() > 0 && !F.hasFnAttribute(AttrName)) \
renderBoolStringAttr(NewAttrs, AttrName, CL); \
} while (0)


/// Set function attributes of function \p F based on CPU, Features, and command
/// line flags.
LLVM_ATTRIBUTE_UNUSED static void
Expand Down Expand Up @@ -415,6 +426,11 @@ setFunctionAttributes(StringRef CPU, StringRef Features, Function &F) {
if (StackRealign)
NewAttrs.addAttribute("stackrealign");

HANDLE_BOOL_ATTR(EnableUnsafeFPMath, "unsafe-fp-math");
HANDLE_BOOL_ATTR(EnableNoInfsFPMath, "no-infs-fp-math");
HANDLE_BOOL_ATTR(EnableNoNaNsFPMath, "no-nans-fp-math");
HANDLE_BOOL_ATTR(EnableNoSignedZerosFPMath, "no-signed-zeros-fp-math");

if (TrapFuncName.getNumOccurrences() > 0)
for (auto &B : F)
for (auto &I : B)
Expand Down
12 changes: 6 additions & 6 deletions llvm/lib/Target/TargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,17 @@ bool TargetMachine::isPositionIndependent() const {
}

/// Reset the target options based on the function's attributes.
/// setFunctionAttributes should have made the raw attribute value consistent
/// with the command line flag if used.
//
// FIXME: This function needs to go away for a number of reasons:
// a) global state on the TargetMachine is terrible in general,
// b) these target options should be passed only on the function
// and not on the TargetMachine (via TargetOptions) at all.
void TargetMachine::resetTargetOptions(const Function &F) const {
#define RESET_OPTION(X, Y) \
do { \
if (F.hasFnAttribute(Y)) \
Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
else \
Options.X = DefaultOptions.X; \
#define RESET_OPTION(X, Y) \
do { \
Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
} while (0)

RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");
Expand Down

0 comments on commit c378e52

Please sign in to comment.