<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">IIUC OpenCL faced the same issue, and their solution was pretty clever and generalizable; a similar approach could conceivably improve compile speeds still further, while also minimizing memory usage and making pragmas unnecessary.  <a href="https://lists.llvm.org/pipermail/cfe-dev/2021-February/067610.html" class="">https://lists.llvm.org/pipermail/cfe-dev/2021-February/067610.html</a><div class=""><br class=""></div><div class="">The basic idea if I recall (Anastasia cc’d might correct me), is to create the necessarily declarations whenever lookup fails.  I.e., if lookup of `vint32m1_t` fails, before giving up clang checks if that is the name of one of your intrinsics; if so it adds the necessarily declaration/overloaded declarations (the particulars handled via Tablegen) and returns that.  </div><div class=""><br class=""></div><div class="">The effect is to "instantiate" these declarations as needed, as if from a template.  </div><div class=""><br class=""></div><div class="">What also seems nice about this approach is that heavy-duty users can alternatively choose to just #include the large header, or use a pre-compiled header, and thereby automatically avoid any costs associated with this last-ditch-lookup solution.</div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jun 15, 2021, at 2:59 AM, Kito Cheng via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hi :<br class=""><br class=""><br class=""># TL;DR:<br class=""><br class="">It's the intrinsic and/or builtin functions related issue again, in<br class="">this RFC we are trying to use pragma to import intrinsics and declare<br class="">intrinsic wrappers function to reduce the compilation time.<br class=""><br class="">And here is the PoC for this RFC:<br class=""><a href="https://reviews.llvm.org/D103228" class="">https://reviews.llvm.org/D103228</a><br class=""><br class=""># Background:<br class=""><br class="">RISC-V vector extension has defined 25,386 intrinsic and 2,102<br class="">overloaded intrinsic functions in riscv_vector.h which increase a lot<br class="">of compilation time; the header file contains ~60k lines for those<br class="">overload functions and intrinsic wrapper functions.<br class=""><br class="">An empty file with include riscv_vector.h takes 0.395s on release<br class="">build and 8.067s second on debug build, and this also increases the<br class="">clang test time.<br class=""><br class=""># Proposal:<br class=""><br class="">Using Tablegen to generate the table of the intrinsic wrapper<br class="">functions and then using pragma to declare intrinsic wrapper<br class="">functions.<br class=""><br class="">Syntax:<br class="">```c<br class="">#pragma riscv intrinsic vector<br class="">```<br class=""><br class="">Then import all builtin functions and intrinsic wrappers into the<br class="">symbol table, this could save lots of time parsing the prototypes of<br class="">the intrinsic wrapper function.<br class=""><br class="">And this idea of trick is borrowing from AArch64/SVE's implementation on GCC:<br class="">https://github.com/gcc-mirror/gcc/blob/master/gcc/config/aarch64/arm_sve.h#L40<br class=""><br class=""><br class=""># Experimental Results:<br class="">## Size of riscv_vector.h:<br class="">      |      size |     LoC |<br class="">------------------------------<br class="">Before | 4,434,725 |  69,749 |<br class="">After  |     5,463 |     159 |<br class=""><br class="">## Compilation Speed for Simple File<br class=""><br class="">testcase:<br class="">```c<br class="">#include <riscv_vector.h><br class=""><br class="">vint32m1_t test_vadd_vv_vfloat32m1_t(vint32m1_t op1, vint32m1_t op2,<br class="">size_t vl) {<br class="">  return vadd(op1, op2, vl);<br class="">}<br class="">```<br class=""><br class="">Release build:<br class="">  Before: 0m0.417s<br class="">  After:  0m0.090s<br class=""><br class="">Debug build:<br class="">  Before: 0m8.016s<br class="">  After:  0m2.295s<br class=""><br class=""><br class="">## Regression Time<br class="">LLVM regression on our 48 core server:<br class="">Release build:<br class="">  Before : Testing Time: 203.81s<br class="">  After : Testing Time: 181.13s<br class=""><br class="">Debug build:<br class="">  Before : Testing Time: 675.18s<br class="">  After : Testing Time: 647.20s<br class=""><br class=""><br class=""><br class="">Any comments or feedback are appreciated!<br class="">_______________________________________________<br class="">cfe-dev mailing list<br class="">cfe-dev@lists.llvm.org<br class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev<br class=""></div></div></blockquote></div><br class=""></div></body></html>