diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 15 | ||||
-rw-r--r-- | clang/docs/UsersManual.rst | 16 | ||||
-rw-r--r-- | clang/include/clang/Driver/Options.td | 10 | ||||
-rw-r--r-- | clang/include/clang/Frontend/CodeGenOptions.def | 8 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGen/no-junk-ftrunc.c | 12 | ||||
-rw-r--r-- | clang/test/Driver/fast-math.c | 16 |
9 files changed, 49 insertions, 43 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b6672bdbfdd..ba7898ba33b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -89,14 +89,13 @@ Non-comprehensive list of changes in this release New Compiler Flags ------------------ -- :option:`-ffp-cast-overflow-workaround` and - :option:`-fno-fp-cast-overflow-workaround` - enable (disable) a workaround for code that casts floating-point values to - integers and back to floating-point. If the floating-point value is not - representable in the intermediate integer type, the code is incorrect - according to the language standard. This flag will attempt to generate code - as if the result of an overflowing conversion matches the overflowing behavior - of a target's native float-to-int conversion instructions. +- :option:`-fstrict-float-cast-overflow` and + :option:`-fno-strict-float-cast-overflow` - + When a floating-point value is not representable in a destination integer + type, the code has undefined behavior according to the language standard. + By default, Clang will not guarantee any particular result in that case. + With the 'no-strict' option, Clang attempts to match the overflowing behavior + of the target's native float-to-int conversion instructions. - ... diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index 7425d2ad974..729adfdd397 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -1255,15 +1255,13 @@ are listed below. flushed-to-zero number is preserved in the sign of 0, denormals are flushed to positive zero, respectively. -.. option:: -f[no-]fp-cast-overflow-workaround - - Enable a workaround for code that casts floating-point values to - integers and back to floating-point. If the floating-point value - is not representable in the intermediate integer type, the code is - incorrect according to the language standard. This flag will attempt - to generate code as if the result of an overflowing conversion matches - the overflowing behavior of a target's native float-to-int conversion - instructions. +.. option:: -f[no-]strict-float-cast-overflow + + When a floating-point value is not representable in a destination integer + type, the code has undefined behavior according to the language standard. + By default, Clang will not guarantee any particular result in that case. + With the 'no-strict' option, Clang attempts to match the overflowing behavior + of the target's native float-to-int conversion instructions. .. option:: -fwhole-program-vtables diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index f18a3b17463..3a5d58a8ee7 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1029,10 +1029,12 @@ def ffp_contract : Joined<["-"], "ffp-contract=">, Group<f_Group>, Flags<[CC1Option]>, HelpText<"Form fused FP ops (e.g. FMAs): fast (everywhere)" " | on (according to FP_CONTRACT pragma, default) | off (never fuse)">, Values<"fast,on,off">; -def ffp_cast_overflow_workaround : Flag<["-"], - "ffp-cast-overflow-workaround">, Group<f_Group>, Flags<[CC1Option]>; -def fno_fp_cast_overflow_workaround : Flag<["-"], - "fno-fp-cast-overflow-workaround">, Group<f_Group>, Flags<[CC1Option]>; +def fstrict_float_cast_overflow : Flag<["-"], + "fstrict-float-cast-overflow">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Assume that overflowing float-to-int casts are undefined (default)">; +def fno_strict_float_cast_overflow : Flag<["-"], + "fno-strict-float-cast-overflow">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Relax language rules and try to match the behavior of the target's native float-to-int conversion instructions">; def ffor_scope : Flag<["-"], "ffor-scope">, Group<f_Group>; def fno_for_scope : Flag<["-"], "fno-for-scope">, Group<f_Group>; diff --git a/clang/include/clang/Frontend/CodeGenOptions.def b/clang/include/clang/Frontend/CodeGenOptions.def index 1747aa7287f..52e10b3f761 100644 --- a/clang/include/clang/Frontend/CodeGenOptions.def +++ b/clang/include/clang/Frontend/CodeGenOptions.def @@ -137,10 +137,10 @@ CODEGENOPT(NoNaNsFPMath , 1, 0) ///< Assume FP arguments, results not NaN. CODEGENOPT(FlushDenorm , 1, 0) ///< Allow FP denorm numbers to be flushed to zero CODEGENOPT(CorrectlyRoundedDivSqrt, 1, 0) ///< -cl-fp32-correctly-rounded-divide-sqrt -/// Disable a float-to-int-to-float cast optimization. This attempts to generate -/// code as if the result of an overflowing conversion matches the overflowing -/// behavior of a target's native float-to-int conversion instructions. -CODEGENOPT(FPCastOverflowWorkaround, 1, 0) +/// When false, this attempts to generate code as if the result of an +/// overflowing conversion matches the overflowing behavior of a target's native +/// float-to-int conversion instructions. +CODEGENOPT(StrictFloatCastOverflow, 1, 1) CODEGENOPT(UniformWGSize , 1, 0) ///< -cl-uniform-work-group-size CODEGENOPT(NoZeroInitializedInBSS , 1, 0) ///< -fno-zero-initialized-in-bss. diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index da2ff14b598..89f86ca99ee 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1727,8 +1727,10 @@ void CodeGenModule::ConstructDefaultFnAttrList(StringRef Name, bool HasOptnone, FuncAttrs.addAttribute("no-trapping-math", llvm::toStringRef(CodeGenOpts.NoTrappingMath)); - if (CodeGenOpts.FPCastOverflowWorkaround) - FuncAttrs.addAttribute("fp-cast-overflow-workaround", "true"); + // Strict (compliant) code is the default, so only add this attribute to + // indicate that we are trying to workaround a problem case. + if (!CodeGenOpts.StrictFloatCastOverflow) + FuncAttrs.addAttribute("strict-float-cast-overflow", "false"); // TODO: Are these all needed? // unsafe/inf/nan/nsz are handled by instruction-level FastMathFlags. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 3dc657e8851..331b4beaa6b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2243,9 +2243,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } // Disable a codegen optimization for floating-point casts. - if (Args.hasFlag(options::OPT_ffp_cast_overflow_workaround, - options::OPT_fno_fp_cast_overflow_workaround, false)) - CmdArgs.push_back("-ffp-cast-overflow-workaround"); + if (Args.hasFlag(options::OPT_fno_strict_float_cast_overflow, + options::OPT_fstrict_float_cast_overflow, false)) + CmdArgs.push_back("-fno-strict-float-cast-overflow"); } static void RenderAnalyzerOptions(const ArgList &Args, ArgStringList &CmdArgs, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 9ef4ad77558..44f29ba3b10 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -699,7 +699,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ); Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math); Opts.NoTrappingMath = Args.hasArg(OPT_fno_trapping_math); - Opts.FPCastOverflowWorkaround = Args.hasArg(OPT_ffp_cast_overflow_workaround); + Opts.StrictFloatCastOverflow = + !Args.hasArg(OPT_fno_strict_float_cast_overflow); Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss); Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags); diff --git a/clang/test/CodeGen/no-junk-ftrunc.c b/clang/test/CodeGen/no-junk-ftrunc.c index ff3f640e837..a645d968866 100644 --- a/clang/test/CodeGen/no-junk-ftrunc.c +++ b/clang/test/CodeGen/no-junk-ftrunc.c @@ -1,12 +1,16 @@ -// RUN: %clang_cc1 -S -ffp-cast-overflow-workaround %s -emit-llvm -o - | FileCheck %s -// CHECK-LABEL: main -// CHECK: attributes #0 = {{.*}}"fp-cast-overflow-workaround"="true"{{.*}} +// RUN: %clang_cc1 -S -fno-strict-float-cast-overflow %s -emit-llvm -o - | FileCheck %s --check-prefix=NOSTRICT +// NOSTRICT-LABEL: main +// NOSTRICT: attributes #0 = {{.*}}"strict-float-cast-overflow"="false"{{.*}} // The workaround attribute is not applied by default. +// RUN: %clang_cc1 -S %s -fstrict-float-cast-overflow -emit-llvm -o - | FileCheck %s --check-prefix=STRICT +// STRICT-LABEL: main +// STRICT-NOT: strict-float-cast-overflow + // RUN: %clang_cc1 -S %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT // DEFAULT-LABEL: main -// DEFAULT-NOT: fp-cast-overflow-workaround +// DEFAULT-NOT: strict-float-cast-overflow int main() { return 0; diff --git a/clang/test/Driver/fast-math.c b/clang/test/Driver/fast-math.c index e1e07f37742..57e5d2c7157 100644 --- a/clang/test/Driver/fast-math.c +++ b/clang/test/Driver/fast-math.c @@ -289,25 +289,25 @@ // CHECK-NO-TRAPPING-MATH: "-fno-trapping-math" // This isn't fast-math, but the option is handled in the same place as other FP params. -// Last option wins, and the flag is *not* passed by default. +// Last option wins, and strict behavior is assumed by default. -// RUN: %clang -### -ffp-cast-overflow-workaround -c %s 2>&1 \ +// RUN: %clang -### -fno-strict-float-cast-overflow -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-FPOV-WORKAROUND %s // CHECK-FPOV-WORKAROUND: "-cc1" -// CHECK-FPOV-WORKAROUND: "-ffp-cast-overflow-workaround" +// CHECK-FPOV-WORKAROUND: "-fno-strict-float-cast-overflow" // RUN: %clang -### -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-FPOV-WORKAROUND-DEFAULT %s // CHECK-FPOV-WORKAROUND-DEFAULT: "-cc1" -// CHECK-FPOV-WORKAROUND-DEFAULT-NOT: "-ffp-cast-overflow-workaround" +// CHECK-FPOV-WORKAROUND-DEFAULT-NOT: "strict-float-cast-overflow" -// RUN: %clang -### -fno-fp-cast-overflow-workaround -c %s 2>&1 \ +// RUN: %clang -### -fstrict-float-cast-overflow -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NO-FPOV-WORKAROUND %s // CHECK-NO-FPOV-WORKAROUND: "-cc1" -// CHECK-NO-FPOV-WORKAROUND-NOT: "-ffp-cast-overflow-workaround" +// CHECK-NO-FPOV-WORKAROUND-NOT: "strict-float-cast-overflow" -// RUN: %clang -### -ffp-cast-overflow-workaround -fno-fp-cast-overflow-workaround -c %s 2>&1 \ +// RUN: %clang -### -fno-strict-float-cast-overflow -fstrict-float-cast-overflow -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NO-FPOV-WORKAROUND-OVERRIDE %s // CHECK-NO-FPOV-WORKAROUND-OVERRIDE: "-cc1" -// CHECK-NO-FPOV-WORKAROUND-OVERRIDE-NOT: "-ffp-cast-overflow-workaround" +// CHECK-NO-FPOV-WORKAROUND-OVERRIDE-NOT: "strict-float-cast-overflow" |