erichkeane wrote: > > If you really want to work around MSVC's bug, you could change tablegen to > > emit the string literals as constant globals / StringLiteral > > I spent a bit thinking about this, and this function is incredibly wasteful. > It ends up re-doing a ton of work that is ALREADY done. It was convenient at > the time to write it that way, but with a little intelligence at tablegen, we > can simplify this function a million-times. > > Some things we can do (and should do all): 1- We can calculate the scope, so > we don't actually compare those. We're checking against "clang" and "" > constantly, lets pre-calculate that into some sort of enum. There are only so > many valid values here (and, IIRC, this has already been checked to be > valid), so we can switch on those easily. PERHAPS another tablegen file to > make sure we get all the normalized ones, but pretty trivial. > > 2- we could reduce the number of comparisons against the name: At that point, > it ends up being: > > ``` > if (Name == "aarch64_sve_pcs") { > if (getSyntax() == AttributeCommonInfo::AS_GNU && calculatedScope == > Scope::None) > return 0; > if (getSyntax() == AttributeCommonInfo::AS_CXX11 && calculatedScope == > Scope::Clang) > return 1; > if (getSyntax() == AttributeCommonInfo::AS_C23 && calculatedScope == Clang) > return 2; > ``` > > 3- STOP being dummies and re-doing all the work that the `trie` in > getAttrKind already did! We already know that the spelling is one-of-a-couple > for each of the variants, so the actual 'does this string match this other > one' is useless, we just need to know which it is in a list. MOST (including > the one in the example above), all are the same, so those comparisons are > dumb/wasted. Lets see if we can remove those. > > For cases where there are multiple spellings, we can compare length! For > example: 1st I found where spelling matters, is `AT_ArgumentWithTypeTag:`, > which is either `argument_with_type_tag` or `pointer_with_type_tag`. At THAT > point, we could just do `Name.length() == 22` and `Name.length() == 21`. > > We already know it is ONE of those two, and just need to figure out which. > > IN SUMMARY: I am convinced somewhat we can just teach tablegen to be > 'smarter' about this file and save ourselves ~100% of those string compares > and replace them with numeric comparisons, or enum comparisons. > > The result is something that is: A- acceptable to the community/maintainers > B- sidesteps/never has this problem again for MSVC C- Improves performance.
BTW, @chinmaydd : Please let me know if this is something you're able to do. I might be able to free up some cycles later this week/next week to put effort into this if not. https://github.com/llvm/llvm-project/pull/114285 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits