Author: tstellar Date: Fri Apr 11 15:31:22 2014 New Revision: 206066 URL: http://llvm.org/viewvc/llvm-project?rev=206066&view=rev Log: Merging r204742:
------------------------------------------------------------------------ r204742 | benny.kra | 2014-03-25 14:02:07 -0400 (Tue, 25 Mar 2014) | 10 lines Fix an logic error in the clang driver preventing crtfastmath.o from linking when -Ofast is used without -ffast-math In gcc using -Ofast forces linking of crtfastmath.o. In the current clang crtfastmath.o is only linked when -ffast-math/-funsafe-math-optimizations passed. It can lead to performance issues, when using only -Ofast without explicit -ffast-math (I faced with it). My patch fixes inconsistency with gcc behaviour and also introduces few tests on it. Patch by Zinovy Nis! Differential Revision: http://llvm-reviews.chandlerc.com/D3114 ------------------------------------------------------------------------ Modified: cfe/branches/release_34/include/clang/Driver/Driver.h cfe/branches/release_34/include/clang/Driver/ToolChain.h cfe/branches/release_34/lib/Driver/Driver.cpp cfe/branches/release_34/lib/Driver/ToolChain.cpp cfe/branches/release_34/lib/Driver/Tools.cpp cfe/branches/release_34/test/Driver/linux-ld.c Modified: cfe/branches/release_34/include/clang/Driver/Driver.h URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/include/clang/Driver/Driver.h?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/include/clang/Driver/Driver.h (original) +++ cfe/branches/release_34/include/clang/Driver/Driver.h Fri Apr 11 15:31:22 2014 @@ -415,6 +415,10 @@ public: bool &HadExtra); }; +/// \return True if the last defined optimization level is -Ofast. +/// And False otherwise. +bool isOptimizationLevelFast(const llvm::opt::ArgList &Args); + } // end namespace driver } // end namespace clang Modified: cfe/branches/release_34/include/clang/Driver/ToolChain.h URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/include/clang/Driver/ToolChain.h?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/include/clang/Driver/ToolChain.h (original) +++ cfe/branches/release_34/include/clang/Driver/ToolChain.h Fri Apr 11 15:31:22 2014 @@ -303,7 +303,7 @@ public: /// AddFastMathRuntimeIfAvailable - If a runtime library exists that sets /// global flags for unsafe floating point math, add it and return true. /// - /// This checks for presence of the -ffast-math or -funsafe-math flags. + /// This checks for presence of the -Ofast, -ffast-math or -funsafe-math flags. virtual bool AddFastMathRuntimeIfAvailable(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; Modified: cfe/branches/release_34/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/lib/Driver/Driver.cpp?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/lib/Driver/Driver.cpp (original) +++ cfe/branches/release_34/lib/Driver/Driver.cpp Fri Apr 11 15:31:22 2014 @@ -2059,3 +2059,7 @@ std::pair<unsigned, unsigned> Driver::ge return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask); } + +bool clang::driver::isOptimizationLevelFast(const llvm::opt::ArgList &Args) { + return Args.hasFlag(options::OPT_Ofast, options::OPT_O_Group, false); +} Modified: cfe/branches/release_34/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/lib/Driver/ToolChain.cpp?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/lib/Driver/ToolChain.cpp (original) +++ cfe/branches/release_34/lib/Driver/ToolChain.cpp Fri Apr 11 15:31:22 2014 @@ -430,16 +430,19 @@ void ToolChain::AddCCKextLibArgs(const A bool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args, ArgStringList &CmdArgs) const { - // Check if -ffast-math or -funsafe-math is enabled. - Arg *A = Args.getLastArg(options::OPT_ffast_math, - options::OPT_fno_fast_math, - options::OPT_funsafe_math_optimizations, - options::OPT_fno_unsafe_math_optimizations); - - if (!A || A->getOption().getID() == options::OPT_fno_fast_math || - A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations) - return false; + // Do not check for -fno-fast-math or -fno-unsafe-math when -Ofast passed + // (to keep the linker options consistent with gcc and clang itself). + if (!isOptimizationLevelFast(Args)) { + // Check if -ffast-math or -funsafe-math. + Arg *A = + Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math, + options::OPT_funsafe_math_optimizations, + options::OPT_fno_unsafe_math_optimizations); + if (!A || A->getOption().getID() == options::OPT_fno_fast_math || + A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations) + return false; + } // If crtfastmath.o exists add it to the arguments. std::string Path = GetFilePath("crtfastmath.o"); if (Path == "crtfastmath.o") // Not found. Modified: cfe/branches/release_34/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/lib/Driver/Tools.cpp?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/lib/Driver/Tools.cpp (original) +++ cfe/branches/release_34/lib/Driver/Tools.cpp Fri Apr 11 15:31:22 2014 @@ -1995,13 +1995,6 @@ static void SplitDebugInfo(const ToolCha C.addCommand(new Command(JA, T, Exec, StripArgs)); } -static bool isOptimizationLevelFast(const ArgList &Args) { - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) - if (A->getOption().matches(options::OPT_Ofast)) - return true; - return false; -} - /// \brief Vectorize at all optimization levels greater than 1 except for -Oz. static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) { if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { Modified: cfe/branches/release_34/test/Driver/linux-ld.c URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_34/test/Driver/linux-ld.c?rev=206066&r1=206065&r2=206066&view=diff ============================================================================== --- cfe/branches/release_34/test/Driver/linux-ld.c (original) +++ cfe/branches/release_34/test/Driver/linux-ld.c Fri Apr 11 15:31:22 2014 @@ -681,7 +681,7 @@ // CHECK-FSL-PPC64: "{{.*}}{{/|\\\\}}crtbegin.o" // CHECK-FSL-PPC64: "-L[[SYSROOT]]/usr/lib64/powerpc64-fsl-linux/4.6.2/../.." // -// Check that crtfastmath.o is linked with -ffast-math. +// Check that crtfastmath.o is linked with -ffast-math and with -Ofast. // RUN: %clang --target=x86_64-unknown-linux -### %s \ // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH %s @@ -691,9 +691,30 @@ // RUN: %clang --target=x86_64-unknown-linux -### %s -funsafe-math-optimizations\ // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -Ofast\ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -Ofast -O3\ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -O3 -Ofast\ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s // RUN: %clang --target=x86_64-unknown-linux -### %s -ffast-math -fno-fast-math \ // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -Ofast -fno-fast-math \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -Ofast -fno-unsafe-math-optimizations \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -fno-fast-math -Ofast \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s +// RUN: %clang --target=x86_64-unknown-linux -### %s -fno-unsafe-math-optimizations -Ofast \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH %s // We don't have crtfastmath.o in the i386 tree, use it to check that file // detection works. // RUN: %clang --target=i386-unknown-linux -### %s -ffast-math \ _______________________________________________ llvm-branch-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-branch-commits
