Author: spatel Date: Thu Apr 9 10:03:23 2015 New Revision: 234493 URL: http://llvm.org/viewvc/llvm-project?rev=234493&view=rev Log: Process the -freciprocal-math optimization flag (PR20912)
The driver currently accepts but ignores the -freciprocal-math flag. This patch passes the flag through and enables 'arcp' fast-math-flag generation in IR. Note that this change does not actually enable the optimization for any target. The reassociation optimization that this flag specifies was implemented by http://reviews.llvm.org/D6334 : http://llvm.org/viewvc/llvm-project?view=revision&revision=222510 Because the optimization is done in the backend rather than IR, the backend must be modified to understand instruction-level fast-math-flags or a new function-level attribute must be created. Also note that -freciprocal-math is independent of any target-specific usage of reciprocal estimate hardware instructions. That requires its own flag ('-mrecip'). https://llvm.org/bugs/show_bug.cgi?id=20912 Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Frontend/CodeGenOptions.def cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/CodeGen/finite-math.c cfe/trunk/test/Driver/fast-math.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Thu Apr 9 10:03:23 2015 @@ -561,7 +561,9 @@ def fno_unsafe_math_optimizations : Flag Group<f_Group>; def fassociative_math : Flag<["-"], "fassociative-math">, Group<f_Group>; def fno_associative_math : Flag<["-"], "fno-associative-math">, Group<f_Group>; -def freciprocal_math : Flag<["-"], "freciprocal-math">, Group<f_Group>; +def freciprocal_math : + Flag<["-"], "freciprocal-math">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Allow division operations to be reassociated">; def fno_reciprocal_math : Flag<["-"], "fno-reciprocal-math">, Group<f_Group>; def ffinite_math_only : Flag<["-"], "ffinite-math-only">, Group<f_Group>, Flags<[CC1Option]>; def fno_finite_math_only : Flag<["-"], "fno-finite-math-only">, Group<f_Group>; Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original) +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Thu Apr 9 10:03:23 2015 @@ -81,7 +81,8 @@ CODEGENOPT(NoGlobalMerge , 1, 0) /// CODEGENOPT(NoImplicitFloat , 1, 0) ///< Set when -mno-implicit-float is enabled. CODEGENOPT(NoInfsFPMath , 1, 0) ///< Assume FP arguments, results not +-Inf. CODEGENOPT(NoSignedZeros , 1, 0) ///< Allow ignoring the signedness of FP zero -CODEGENOPT(NoInline , 1, 0) ///< Set when -fno-inline is enabled. +CODEGENOPT(ReciprocalMath , 1, 0) ///< Allow FP divisions to be reassociated. +CODEGENOPT(NoInline , 1, 0) ///< Set when -fno-inline is enabled. ///< Disables use of the inline keyword. CODEGENOPT(NoNaNsFPMath , 1, 0) ///< Assume FP arguments, results not NaN. CODEGENOPT(NoZeroInitializedInBSS , 1, 0) ///< -fno-zero-initialized-in-bss. Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Thu Apr 9 10:03:23 2015 @@ -70,6 +70,9 @@ CodeGenFunction::CodeGenFunction(CodeGen if (CGM.getCodeGenOpts().NoSignedZeros) { FMF.setNoSignedZeros(); } + if (CGM.getCodeGenOpts().ReciprocalMath) { + FMF.setAllowReciprocal(); + } Builder.SetFastMathFlags(FMF); } Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Thu Apr 9 10:03:23 2015 @@ -3062,6 +3062,9 @@ void Clang::ConstructJob(Compilation &C, if (!SignedZeros) CmdArgs.push_back("-fno-signed-zeros"); + if (ReciprocalMath) + CmdArgs.push_back("-freciprocal-math"); + // Validate and pass through -fp-contract option. if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, options::OPT_fno_fast_math, Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Apr 9 10:03:23 2015 @@ -451,6 +451,7 @@ static bool ParseCodeGenArgs(CodeGenOpti Args.hasArg(OPT_cl_finite_math_only) || Args.hasArg(OPT_cl_fast_relaxed_math)); Opts.NoSignedZeros = Args.hasArg(OPT_fno_signed_zeros); + Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math); Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss); Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option); Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags); Modified: cfe/trunk/test/CodeGen/finite-math.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/finite-math.c?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/finite-math.c (original) +++ cfe/trunk/test/CodeGen/finite-math.c Thu Apr 9 10:03:23 2015 @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -ffinite-math-only -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FINITE // RUN: %clang_cc1 -fno-signed-zeros -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=NSZ +// RUN: %clang_cc1 -freciprocal-math -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=RECIP float f0, f1, f2; @@ -8,6 +9,7 @@ void foo(void) { // FINITE: fadd nnan ninf // NSZ: fadd nsz + // RECIP: fadd arcp f0 = f1 + f2; // CHECK: ret Modified: cfe/trunk/test/Driver/fast-math.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fast-math.c?rev=234493&r1=234492&r2=234493&view=diff ============================================================================== --- cfe/trunk/test/Driver/fast-math.c (original) +++ cfe/trunk/test/Driver/fast-math.c Thu Apr 9 10:03:23 2015 @@ -40,6 +40,21 @@ // CHECK-NO-SIGNED-ZEROS-NO-FAST-MATH: "-cc1" // CHECK-NO-SIGNED-ZEROS-NO-FAST-MATH-NOT: "-fno-signed-zeros" // +// RUN: %clang -### -freciprocal-math -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-RECIPROCAL-MATH %s +// CHECK-RECIPROCAL-MATH: "-cc1" +// CHECK-RECIPROCAL-MATH: "-freciprocal-math" +// +// RUN: %clang -### -fno-fast-math -freciprocal-math -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-RECIPROCAL-MATH %s +// CHECK-NO-FAST-MATH-RECIPROCAL-MATH: "-cc1" +// CHECK-NO-FAST-MATH-RECIPROCAL-MATH: "-freciprocal-math" +// +// RUN: %clang -### -freciprocal-math -fno-fast-math -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-RECIPROCAL-MATH-NO-FAST-MATH %s +// CHECK-RECIPROCAL-MATH-NO-FAST-MATH: "-cc1" +// CHECK-RECIPROCAL-MATH-NO-FAST-MATH-NOT: "-freciprocal-math" +// // RUN: %clang -### -fno-honor-nans -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NO-NANS %s // CHECK-NO-NANS: "-cc1" _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
