Author: Craig Topper Date: 2020-08-06T13:18:15-07:00 New Revision: 4df38a5589f6fa23e161a76bdaa3180ad053791e
URL: https://github.com/llvm/llvm-project/commit/4df38a5589f6fa23e161a76bdaa3180ad053791e DIFF: https://github.com/llvm/llvm-project/commit/4df38a5589f6fa23e161a76bdaa3180ad053791e.diff LOG: [X86] Optimize out a few extra strlen calls in getX86TargetCPU. NFCI We had a conversion from const char * to StringRef and const char * to std::string conversion. These both do their own strlen call if the compiler doens't figure out how to share them. By adding the temporary StringRef we can convert it to std::string instead. The other case is to use a StringSwitch<StringRef> instead of StringSwitch<const char *> since the output values of the switch are string literals. This allows the length to be computed at compile time. Otherwise we have to convert from const char * to std::string after the StringSwitch. Added: Modified: clang/lib/Driver/ToolChains/Arch/X86.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp b/clang/lib/Driver/ToolChains/Arch/X86.cpp index 5d9a7234b027..c49aaadc42ae 100644 --- a/clang/lib/Driver/ToolChains/Arch/X86.cpp +++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp @@ -23,41 +23,42 @@ using namespace llvm::opt; std::string x86::getX86TargetCPU(const ArgList &Args, const llvm::Triple &Triple) { if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) { - if (StringRef(A->getValue()) != "native") - return A->getValue(); + StringRef CPU = A->getValue(); + if (CPU != "native") + return std::string(CPU); // FIXME: Reject attempts to use -march=native unless the target matches // the host. // // FIXME: We should also incorporate the detected target features for use // with -native. - std::string CPU = std::string(llvm::sys::getHostCPUName()); + CPU = llvm::sys::getHostCPUName(); if (!CPU.empty() && CPU != "generic") - return CPU; + return std::string(CPU); } if (const Arg *A = Args.getLastArgNoClaim(options::OPT__SLASH_arch)) { // Mapping built by looking at lib/Basic's X86TargetInfo::initFeatureMap(). StringRef Arch = A->getValue(); - const char *CPU = nullptr; + StringRef CPU; if (Triple.getArch() == llvm::Triple::x86) { // 32-bit-only /arch: flags. - CPU = llvm::StringSwitch<const char *>(Arch) + CPU = llvm::StringSwitch<StringRef>(Arch) .Case("IA32", "i386") .Case("SSE", "pentium3") .Case("SSE2", "pentium4") - .Default(nullptr); + .Default(""); } - if (CPU == nullptr) { // 32-bit and 64-bit /arch: flags. - CPU = llvm::StringSwitch<const char *>(Arch) + if (CPU.empty()) { // 32-bit and 64-bit /arch: flags. + CPU = llvm::StringSwitch<StringRef>(Arch) .Case("AVX", "sandybridge") .Case("AVX2", "haswell") .Case("AVX512F", "knl") .Case("AVX512", "skylake-avx512") - .Default(nullptr); + .Default(""); } - if (CPU) { + if (!CPU.empty()) { A->claim(); - return CPU; + return std::string(CPU); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits