[Bug target/82404] New: Unnecessary instructions in switch table
antoshkka at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Oct 2 13:44:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82404
Bug ID: 82404
Summary: Unnecessary instructions in switch table
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: antoshkka at gmail dot com
Target Milestone: ---
Following code
enum class eShape { eSquare, eCircle, eShpere, eTetraeder };
double test_switch_native(eShape shape, double r) {
switch(shape) {
case eShape::eSquare: return 17;
case eShape::eCircle: return 16;
case eShape::eShpere: return 21;
case eShape::eTetraeder: return 0;
}
}
with flags -O2 and -O3 produces assembly:
test_switch_native(eShape, double):
cmp edi, 3 <== do not need this
ja .L2 <== do not need this
mov edi, edi <== do not need this
movsd xmm0, QWORD PTR CSWTCH.0[0+rdi*8]
ret
.L2:
rep ret <== do not need this
CSWTCH.0:
.long 0
.long 1076953088
.long 0
.long 1076887552
.long 0
.long 1077215232
.long 0
.long 0
Clang produces much sorter assembly:
test_switch_native(eShape, double): # @test_switch_native(eShape,
double)
movsxd rax, edi
movsd xmm0, qword ptr [8*rax +
.Lswitch.table._Z18test_switch_native6eShaped] # xmm0 = mem[0],zero
ret
.Lswitch.table._Z18test_switch_native6eShaped:
.quad 4625478292286210048 # double 17
.quad 4625196817309499392 # double 16
.quad 4626604192193052672 # double 21
.quad 0 # double 0
More information about the Gcc-bugs
mailing list