[llvm-dev] clang emits calls to consexpr function.

Hans Wennborg via llvm-dev llvm-dev at lists.llvm.org
Tue Feb 5 05:08:07 PST 2019


On Tue, Feb 5, 2019 at 1:41 PM kamlesh kumar via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
>
> Hi Devs,
> consider below testcase
>
> $cat test.cpp
>
> constexpr int product()
> {
>
>     return 10*20;
> }
> int main()
> {
> const   int x = product();
>     return 0;
> }
>
>
> $./clang test.cpp -std=c++11 -S
> $./clang -v
> clang version 9.0.0
> Target: x86_64-unknown-linux-gnu
>
> $cat test.s
>
> main:
>         .cfi_startproc
> # %bb.0:
>         pushq   %rbp
>         .cfi_def_cfa_offset 16
>         .cfi_offset %rbp, -16
>         movq    %rsp, %rbp
>         .cfi_def_cfa_register %rbp
>         subq    $16, %rsp
>         movl    $0, -4(%rbp)
>         callq   _Z7productv    //here you can see the calls to product function
>         xorl    %ecx, %ecx
>         movl    %eax, -8(%rbp)
>         movl    %ecx, %eax
>         addq    $16, %rsp
>         popq    %rbp
>         .cfi_def_cfa %rsp, 8
>         retq
>
>
> while g++ do not emits calls to constexpr function
> $g++ test.cpp -std=c++11
> $cat test.s
> main:
> .LFB1:
>         .cfi_startproc
>         pushq   %rbp
>         .cfi_def_cfa_offset 16
>         .cfi_offset 6, -16
>         movq    %rsp, %rbp
>         .cfi_def_cfa_register 6
>         movl    $200, -4(%rbp)
>         movl    $0, %eax
>         popq    %rbp
>         .cfi_def_cfa 7, 8
>         ret
>         .cfi_endproc
>
> is this bug in clang compiler?

It's not a bug. constexpr just means the value can be used as a
constant, it doesn't mean the compiler *has to* compute it as a
constant. If you turn on some optimization, the call will get inlined
and constant folded: https://gcc.godbolt.org/z/M806yO


More information about the llvm-dev mailing list