Paul C. Anagnostopoulos via llvm-dev
2020-Oct-31 13:14 UTC
[llvm-dev] StringSwitch efficiency
Okay, now I'm just being lazy. What is the simplest way to compile a module and produce a code listing? I'm on Windows with Visual Studio.
Compiler Explorer can provide LLVM's trunk libraries (choose it from "Libraries" in the compiler tab) eg: https://godbolt.org/z/5jEj3E On Sat, Oct 31, 2020 at 6:19 AM Paul C. Anagnostopoulos via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Okay, now I'm just being lazy. What is the simplest way to compile a > module and produce a code listing? I'm on Windows with Visual Studio. > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201031/88180650/attachment.html>
Paul C. Anagnostopoulos via llvm-dev
2020-Oct-31 20:38 UTC
[llvm-dev] StringSwitch efficiency
Holy cow! I did not know about Compiler Explorer. Thanks! At 10/31/2020 02:55 PM, David Blaikie wrote:>Compiler Explorer can provide LLVM's trunk libraries (choose it from "Libraries" in the compiler tab) eg: <https://godbolt.org/z/5jEj3E>https://godbolt.org/z/5jEj3E
If the argument is unknown, it seems that SROA can essentially optimize a long chain of bcmp(string comparison) calls to dispatches on the argument length. Then SimplfyCFGOpt::SimplifyBranchOnICmpChain can generate a switch instruction which will eventually lower to a jump table. ExpandMemCmp.cpp can generate efficient comparisons for these strings. There are cases where multiple memory loads are produced while a memory load can be reused, but overall the produced code looks pretty good. int foo(llvm::StringRef s) { return llvm::StringSwitch<int>(s) .Case("int", 5) .Case("bit", 3) .Case("bits", 7) .Case("string", 8) .Case("list", 4) .Case("code", 2) .Case("dag", 1) .Case("class", 4) .Case("def", 3) .Case("foreach", 9) .Case("defm", 1) .Case("defset", 0) .Case("multiclass", 1) .Case("field", 4) .Case("let", 3) .Case("in", 9) .Case("defvar", 1) .Case("if", 0) .Case("then", 3) .Case("else", 7) .Default(5); } On Sat, Oct 31, 2020 at 11:56 AM David Blaikie via llvm-dev <llvm-dev at lists.llvm.org> wrote:> > Compiler Explorer can provide LLVM's trunk libraries (choose it from "Libraries" in the compiler tab) eg: https://godbolt.org/z/5jEj3E > > On Sat, Oct 31, 2020 at 6:19 AM Paul C. Anagnostopoulos via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> Okay, now I'm just being lazy. What is the simplest way to compile a module and produce a code listing? I'm on Windows with Visual Studio. >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-- 宋方睿