From: Chandler Carruth Date: Thu, 10 Sep 2015 07:51:43 +0000 (+0000) Subject: [ADT] Micro-optimize the Triple constructor by doing a single split and X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=aa69dede3582f0de67bb1aa08088fe549d32bff0;hp=f41971f6e7f9e5ba0c590c7e35e2c1af0cd38c69 [ADT] Micro-optimize the Triple constructor by doing a single split and re-using the resulting components rather than repeatedly splitting and re-splitting to compute each component as part of the initializer list. This is more work on PR23676. Sadly, it doesn't help much. It removes the constructor from my profile, but doesn't make a sufficient dent in the total time. But it should play together nicely with subsequent changes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247250 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index dfe719d1f11..32fabd4dae1 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -572,14 +572,27 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { /// This stores the string representation and parses the various pieces into /// enum members. Triple::Triple(const Twine &Str) - : Data(Str.str()), - Arch(parseArch(getArchName())), - SubArch(parseSubArch(getArchName())), - Vendor(parseVendor(getVendorName())), - OS(parseOS(getOSName())), - Environment(parseEnvironment(getEnvironmentName())), - ObjectFormat(parseFormat(getEnvironmentName())) { - if (ObjectFormat == Triple::UnknownObjectFormat) + : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch), + Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment), + ObjectFormat(UnknownObjectFormat) { + // Do minimal parsing by hand here. + SmallVector Components; + StringRef(Data).split(Components, '-', /*MaxSplit*/ 3); + if (Components.size() > 0) { + Arch = parseArch(Components[0]); + SubArch = parseSubArch(Components[0]); + if (Components.size() > 1) { + Vendor = parseVendor(Components[1]); + if (Components.size() > 2) { + OS = parseOS(Components[2]); + if (Components.size() > 3) { + Environment = parseEnvironment(Components[3]); + ObjectFormat = parseFormat(Components[3]); + } + } + } + } + if (ObjectFormat == UnknownObjectFormat) ObjectFormat = getDefaultFormat(*this); }