Author: Craig Topper Date: 2020-08-26T14:52:03-07:00 New Revision: 71f3169e1baeff262583b35ef88f8fb6df7be85e
URL: https://github.com/llvm/llvm-project/commit/71f3169e1baeff262583b35ef88f8fb6df7be85e DIFF: https://github.com/llvm/llvm-project/commit/71f3169e1baeff262583b35ef88f8fb6df7be85e.diff LOG: [X86] Default to -mtune=generic unless -march is passed to the driver. Add TuneCPU to the AST serialization This patch defaults to -mtune=generic unless -march is present. If -march is present we'll use the empty string unless its overridden by mtune. The back should use the target cpu if the tune-cpu isn't present. It also adds AST serialization support to fix some tests that emit AST and parse it back. These tests diff the IR against the output from not going through AST. So if we don't serialize the tune CPU we fail the diff. Differential Revision: https://reviews.llvm.org/D86488 Added: Modified: clang/lib/Basic/Targets/X86.h clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/lib/Frontend/FrontendActions.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/Driver/x86-mtune.c clang/test/Modules/module_file_info.m Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 853c4e621222..25dc9458c25a 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -306,6 +306,9 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo { } bool isValidTuneCPUName(StringRef Name) const override { + if (Name == "generic") + return true; + // Allow 32-bit only CPUs regardless of 64-bit mode unlike isValidCPUName. // NOTE: gcc rejects 32-bit mtune CPUs in 64-bit mode. But being lenient // since mtune was ignored by clang for so long. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d8fa77b050f8..c7f8f0fea5a9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2074,20 +2074,27 @@ void Clang::AddX86TargetArgs(const ArgList &Args, } // Handle -mtune. - // FIXME: We should default to "generic" unless -march is set to match gcc. + + // Default to "generic" unless -march is present. + std::string TuneCPU; + if (!Args.hasArg(clang::driver::options::OPT_march_EQ)) + TuneCPU = "generic"; + + // Override based on -mtune. if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) { StringRef Name = A->getValue(); - if (Name == "native") + if (Name == "native") { Name = llvm::sys::getHostCPUName(); + if (!Name.empty()) + TuneCPU = std::string(Name); + } else + TuneCPU = std::string(Name); + } - // Ignore generic either from getHostCPUName or from command line. - // FIXME: We need to support this eventually but isValidCPUName and the - // backend aren't ready for it yet. - if (Name != "generic") { - CmdArgs.push_back("-tune-cpu"); - CmdArgs.push_back(Args.MakeArgString(Name)); - } + if (!TuneCPU.empty()) { + CmdArgs.push_back("-tune-cpu"); + CmdArgs.push_back(Args.MakeArgString(TuneCPU)); } } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 0313ff4c363b..89dce7515dd1 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3877,7 +3877,7 @@ std::string CompilerInvocation::getModuleHash() const { // Extend the signature with the target options. code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU, - TargetOpts->ABI); + TargetOpts->TuneCPU, TargetOpts->ABI); for (const auto &FeatureAsWritten : TargetOpts->FeaturesAsWritten) code = hash_combine(code, FeatureAsWritten); diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 711e7336c820..77a88f696abc 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -561,6 +561,7 @@ namespace { Out.indent(2) << "Target options:\n"; Out.indent(4) << " Triple: " << TargetOpts.Triple << "\n"; Out.indent(4) << " CPU: " << TargetOpts.CPU << "\n"; + Out.indent(4) << " TuneCPU: " << TargetOpts.TuneCPU << "\n"; Out.indent(4) << " ABI: " << TargetOpts.ABI << "\n"; if (!TargetOpts.FeaturesAsWritten.empty()) { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 464bbc662230..55d68a7c6919 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -390,8 +390,10 @@ static bool checkTargetOptions(const TargetOptions &TargetOpts, // We can tolerate diff erent CPUs in many cases, notably when one CPU // supports a strict superset of another. When allowing compatible // diff erences skip this check. - if (!AllowCompatibleDifferences) + if (!AllowCompatibleDifferences) { CHECK_TARGET_OPT(CPU, "target CPU"); + CHECK_TARGET_OPT(TuneCPU, "tune CPU"); + } #undef CHECK_TARGET_OPT @@ -5779,6 +5781,7 @@ bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, TargetOptions TargetOpts; TargetOpts.Triple = ReadString(Record, Idx); TargetOpts.CPU = ReadString(Record, Idx); + TargetOpts.TuneCPU = ReadString(Record, Idx); TargetOpts.ABI = ReadString(Record, Idx); for (unsigned N = Record[Idx++]; N; --N) { TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 21dd8534a6f7..9a72108cb02c 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1272,6 +1272,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, const TargetOptions &TargetOpts = Target.getTargetOpts(); AddString(TargetOpts.Triple, Record); AddString(TargetOpts.CPU, Record); + AddString(TargetOpts.TuneCPU, Record); AddString(TargetOpts.ABI, Record); Record.push_back(TargetOpts.FeaturesAsWritten.size()); for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size(); I != N; ++I) { diff --git a/clang/test/Driver/x86-mtune.c b/clang/test/Driver/x86-mtune.c index 731c580afc48..a313412b6ab2 100644 --- a/clang/test/Driver/x86-mtune.c +++ b/clang/test/Driver/x86-mtune.c @@ -1,5 +1,14 @@ // Ensure we support the -mtune flag. -// + +// Default mtune should be generic. +// RUN: %clang -target x86_64-unknown-unknown -c -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=notune +// notune: "-tune-cpu" "generic" + +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -mtune=generic 2>&1 \ +// RUN: | FileCheck %s -check-prefix=generic +// generic: "-tune-cpu" "generic" + // RUN: %clang -target x86_64-unknown-unknown -c -### %s -mtune=nocona 2>&1 \ // RUN: | FileCheck %s -check-prefix=nocona // nocona: "-tune-cpu" "nocona" @@ -18,3 +27,16 @@ // RUN: | FileCheck %s -check-prefix=athlon // athlon: "-tune-cpu" "athlon" +// Check interaction between march and mtune. + +// -march should remove default mtune generic. +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=core2 2>&1 \ +// RUN: | FileCheck %s -check-prefix=marchcore2 +// marchcore2: "-target-cpu" "core2" +// marchcore2-NOT: "-tune-cpu" + +// -march should remove default mtune generic. +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=core2 -mtune=nehalem 2>&1 \ +// RUN: | FileCheck %s -check-prefix=marchmtune +// marchmtune: "-target-cpu" "core2" +// mmarchmtune: "-tune-cpu" "nehalem" diff --git a/clang/test/Modules/module_file_info.m b/clang/test/Modules/module_file_info.m index 677eff8e8ef5..da4ea1ca0d95 100644 --- a/clang/test/Modules/module_file_info.m +++ b/clang/test/Modules/module_file_info.m @@ -28,6 +28,7 @@ // CHECK: Target options: // CHECK: Triple: // CHECK: CPU: +// CHECK: TuneCPU: // CHECK: ABI: // CHECK: Header search options: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits