Index: llvm/include/llvm/CodeGen/CommandFlags.inc =================================================================== --- llvm/include/llvm/CodeGen/CommandFlags.inc +++ llvm/include/llvm/CodeGen/CommandFlags.inc @@ -372,6 +372,17 @@ 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 @@ -410,6 +421,11 @@ 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) Index: llvm/lib/Target/TargetMachine.cpp =================================================================== --- llvm/lib/Target/TargetMachine.cpp +++ llvm/lib/Target/TargetMachine.cpp @@ -46,17 +46,17 @@ } /// 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");