[cfe-dev] [clang-tidy] Determining constexpr evaluation time
David Rector via cfe-dev
cfe-dev at lists.llvm.org
Tue Sep 1 08:33:11 PDT 2020
I’m stumped — I am kind of surprised that `f(3)` is not always evaluated away before CodeGen, but even disregarding that, I am not sure how to determine which CallExprs are ultimately emitted as calls given the possibility of additional optimizations.
Does anyone else have insight?
Dave
> On Sep 1, 2020, at 12:48 AM, Connor Davis <connojd at pm.me> wrote:
>
> Hi Dave,
>
> That makes sense, however I'm looking for a way to determine if an actual
> call instruction will be emitted. Using your example in godbolt (using x86-64
> trunk with -std=c++17) there are four call instructions in main. But using
> ```constexpr int l = f(3);``` results in only three calls in main. And passing
> -O2 removes all of them. Is there some way to statically determine that the
> call instruction will be omitted?
>
> For context, I have a patch for misc-no-recursion that does not warn when an
> SCC is found in the call graph where each node is marked consteval, and I thought
> that the "every node is constexpr but evaluated at compile time" is another case
> where recursion would be OK. Although now that I type it out it's really "every
> node is inlined".
>
> Thanks,
> Connor
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Monday, August 31, 2020 5:17 PM, David Rector <davrecthreads at gmail.com> wrote:
>
>> There is `Expr::isCXX11ConstantExpr(const ASTContext &C, …)`, which returns e.g.:
>>
>> ```
>> constexpr int f(int i) {
>> return i + 42;
>> }
>> int g(int i) {
>> return
>> f(i); // isCXX11ConstantExpr = false
>> }
>> int main() {
>> int j =
>> g(3); // isCXX11ConstantExpr = false
>> int k =
>> f(g(3)); // isCXX11ConstantExpr = false (both CallExprs)
>> int l =
>> f(3); // isCXX11ConstantExpr = true
>> }```
>>
>> It is defined in terms of `EvaluateAsRValue` FWIW. Note that all the `EvaluateAs*` methods refer to evaluating at compile time, regardless of the `InConstantContext` argument, and (I think) all will return false whenever the expression cannot fully "fold" (i.e. if there will necessarily be run-time dependencies remaining in the expression, or there was an error during evaluation).
>>
>> Hope that helps,
>>
>> Dave
>>
>>> On Aug 30, 2020, at 7:15 PM, Connor Davis via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>>>
>>> Hello all,
>>>
>>> Is it possible to determine if a CallExpr will be evaluated
>>> at compile time from clang-tidy? I notice some references to
>>> InConstantContext in the EvaluateAs* functions in ExprConstant.cpp,
>>> but I'm not sure if that is applicable/usable from clang-tidy.
>>>
>>> Thanks,
>>> Connor Davis
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
More information about the cfe-dev
mailing list