[PATCH] D76096: [clang] allow const structs/unions/arrays to be constant expressions for C
Eli Friedman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 2 10:54:39 PDT 2023
efriedma accepted this revision.
efriedma added a comment.
This revision is now accepted and ready to land.
In D76096#4540442 <https://reviews.llvm.org/D76096#4540442>, @nickdesaulniers wrote:
> Consider the following code:
>
> long x [] = {1, 2, 3, 4, 5 + 4};
>
> Even with some of my recent changes, because the fast path parallel implementation doesn't currently handle BinaryOperator Exprs, we'll visit all of the ImplicitCastExpr and IntegerLiteral, then eventually figure out that we can't constant evaluate the final element (for the wrong reasons; i.e. VisitBinaryOperator not implemented). That's a slow down because then we'll fall back to EvaluateAsLValue/EvaluateAsRValue which will then succeed.
>
> So we pretty much need a fair amount of parallel implementation for the fast path to succeed. I'm happy to implement all that, if that's the direction you're advising?
>
> Or did you mean something else when you said "for structs and arrays?"
The given example doesn't fallback in the "bad" way: we don't create an APValue representing `x[]`. If you look at the code for lowering InitListExpr, you'll note that it doesn't actually just recursively Visit() like we do in other places. We do create an lvalue for "5+4", but that isn't expensive in the same way.
> Is there another way I can prove the absence of regression to you?
At this point, I'm basically convinced the regressions are only going to be in obscure cases we aren't going to find by benchmarking. I'm sure someone will find them eventually, but we can deal with them as they come up, I think.
So LGTM
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76096/new/
https://reviews.llvm.org/D76096
More information about the cfe-commits
mailing list