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 llvm-svn: 204742
This commit is contained in:
parent
3dbe10503a
commit
ab88f62614
6 changed files with 43 additions and 18 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -311,7 +311,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;
|
||||
|
|
|
|||
|
|
@ -2049,3 +2049,7 @@ std::pair<unsigned, unsigned> Driver::getIncludeExcludeOptionFlagMasks() const {
|
|||
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -341,16 +341,19 @@ void ToolChain::AddCCKextLibArgs(const ArgList &Args,
|
|||
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -2034,13 +2034,6 @@ static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
|
|||
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)) {
|
||||
|
|
|
|||
|
|
@ -825,7 +825,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
|
||||
|
|
@ -835,9 +835,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 \
|
||||
|
|
|
|||
Loading…
Reference in a new issue