kamlesh kumar via llvm-dev
2019-Feb-05 12:41 UTC
[llvm-dev] clang emits calls to consexpr function.
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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190205/ea40cfba/attachment.html>
Hans Wennborg via llvm-dev
2019-Feb-05 13:08 UTC
[llvm-dev] clang emits calls to consexpr function.
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
Michiel Derhaeg via llvm-dev
2019-Feb-05 13:35 UTC
[llvm-dev] clang emits calls to consexpr function.
And if you define "x" as constexpr instead of const, you will force the compiler to compute product at compile-time without opimizations enabled. On 05/02 14:08, Hans Wennborg via llvm-dev wrote:> 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 > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev