[llvm-branch-commits] [cfe-branch] r206066 - Merging r204742:
Tom Stellard
thomas.stellard at amd.com
Fri Apr 11 13:31:23 PDT 2014
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 \
More information about the llvm-branch-commits
mailing list