https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93210
Bug ID: 93210
Summary: Sub-optimal code optimization on struct/combound
constexpr (gcc vs. clang)
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: markus.eisenmann at outlook dot com
Target Milestone: ---
Created attachment 47617
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47617&action=edit
Sample-Code to show different optimization of gcc vs. clang
Hi,
The attached source-code shows that the current elease of GCC does not use the
given constexpr for a direct value-compare and needs a definition for a
indirect (mem-) operation. But, if the same compare uses a temporary copy, the
emitted code is optimal.
Additionaly, the comparision of assembler-output between gcc 9.2 to clang 9.0
will show, that clang will generate in booth cases a direct value-compare.
IMHO, a "more" sub-optimal code will be generated with the flag -fPIC; I.e. two
additional read-cycles.
Assembler-Code output 1 (x86-64 gcc 8.2, -O2):
[sub-optimal code of Bar::CheckId1]
Bar::CheckId1(Foo const&) const:
mov rax, QWORD PTR [rsi]
cmp QWORD PTR Bar::Should[rip], rax
sete al
ret
Bar::CheckId2(Foo const&) const:
movabs rax, 180388626445
cmp rax, QWORD PTR [rsi]
sete al
ret
Bar::Should:
.long 13
.long 42
--------
Assembler-Code output 2 (x86-64 clang 9.0, -O2):
[same code for Bar::CheckId1 and CheckId2]
Bar::CheckId1(Foo const&) const:
movabs rax, 180388626445
cmp qword ptr [rsi], rax
sete al
ret
Bar::CheckId2(Foo const&) const:
movabs rax, 180388626445
cmp qword ptr [rsi], rax
sete al
ret
Bar::Should:
.long 13 # 0xd
.long 42 # 0x2a
--------
Best regards from Salzburg,
Markus