[Bug target/84011] New: Optimize switch table with -fPIE
thgarnie at google dot com
gcc-bugzilla@gcc.gnu.org
Tue Jan 23 23:07:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84011
Bug ID: 84011
Summary: Optimize switch table with -fPIE
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: thgarnie at google dot com
Target Milestone: ---
Created attachment 43225
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43225&action=edit
Switch test case
With -O2 and -fPIE switch tables are never optimized as well as they could. I
assume that's to reduce the number of relocations in code sections for COW page
support. It makes sense for -fPIC but not -fPIE. The Linux kernel x86_64 PIE
prototype ends with big switch tables when it could be optimized to few lines.
With -fno-PIE -O2:
0000000000000000 <phy_modes>:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_X86_64_32 .rodata.str1.1
5: 83 ff 16 cmp $0x16,%edi
8: 77 0a ja 14 <phy_modes+0x14>
a: 89 ff mov %edi,%edi
c: 48 8b 04 fd 00 00 00 mov 0x0(,%rdi,8),%rax
13: 00
10: R_X86_64_32S .rodata
14: c3 retq
With -fPIE -O2:
0000000000000000 <phy_modes>:
0: 83 ff 16 cmp $0x16,%edi
3: 0f 87 87 01 00 00 ja 190 <phy_modes+0x190>
9: 48 8d 15 00 00 00 00 lea 0x0(%rip),%rdx # 10
<phy_modes+0x10>
c: R_X86_64_PC32 .rodata-0x4
10: 89 ff mov %edi,%edi
12: 48 63 04 ba movslq (%rdx,%rdi,4),%rax
16: 48 01 d0 add %rdx,%rax
19: ff e0 jmpq *%rax
1b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
20: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 27
<phy_modes+0x27>
23: R_X86_64_PC32 .LC1-0x4
27: c3 retq
28: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
2f: 00
30: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 37
<phy_modes+0x37>
33: R_X86_64_PC32 .LC22-0x4
37: c3 retq
38: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
3f: 00
40: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 47
<phy_modes+0x47>
43: R_X86_64_PC32 .LC21-0x4
47: c3 retq
48: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4f: 00
50: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 57
<phy_modes+0x57>
53: R_X86_64_PC32 .LC20-0x4
57: c3 retq
58: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
5f: 00
60: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 67
<phy_modes+0x67>
63: R_X86_64_PC32 .LC19-0x4
67: c3 retq
68: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
6f: 00
70: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 77
<phy_modes+0x77>
73: R_X86_64_PC32 .LC18-0x4
77: c3 retq
78: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
7f: 00
80: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 87
<phy_modes+0x87>
83: R_X86_64_PC32 .LC17-0x4
87: c3 retq
88: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
8f: 00
90: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 97
<phy_modes+0x97>
93: R_X86_64_PC32 .LC16-0x4
97: c3 retq
98: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
9f: 00
a0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # a7
<phy_modes+0xa7>
a3: R_X86_64_PC32 .LC15-0x4
a7: c3 retq
a8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
af: 00
b0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b7
<phy_modes+0xb7>
b3: R_X86_64_PC32 .LC14-0x4
b7: c3 retq
b8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
bf: 00
c0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # c7
<phy_modes+0xc7>
c3: R_X86_64_PC32 .LC13-0x4
c7: c3 retq
c8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
cf: 00
d0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # d7
<phy_modes+0xd7>
d3: R_X86_64_PC32 .LC12-0x4
d7: c3 retq
d8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
df: 00
e0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # e7
<phy_modes+0xe7>
e3: R_X86_64_PC32 .LC11-0x4
e7: c3 retq
e8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
ef: 00
f0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # f7
<phy_modes+0xf7>
f3: R_X86_64_PC32 .LC10-0x4
f7: c3 retq
f8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
ff: 00
100: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 107
<phy_modes+0x107>
103: R_X86_64_PC32 .LC9-0x4
107: c3 retq
108: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
10f: 00
110: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 117
<phy_modes+0x117>
113: R_X86_64_PC32 .LC8-0x4
117: c3 retq
118: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
11f: 00
120: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 127
<phy_modes+0x127>
123: R_X86_64_PC32 .LC7-0x4
127: c3 retq
128: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
12f: 00
130: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 137
<phy_modes+0x137>
133: R_X86_64_PC32 .LC6-0x4
137: c3 retq
138: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
13f: 00
140: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 147
<phy_modes+0x147>
143: R_X86_64_PC32 .LC5-0x4
147: c3 retq
148: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
14f: 00
150: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 157
<phy_modes+0x157>
153: R_X86_64_PC32 .LC4-0x4
157: c3 retq
158: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
15f: 00
160: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 167
<phy_modes+0x167>
163: R_X86_64_PC32 .LC3-0x4
167: c3 retq
168: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
16f: 00
170: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 177
<phy_modes+0x177>
173: R_X86_64_PC32 .LC2-0x4
177: c3 retq
178: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
17f: 00
180: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 187
<phy_modes+0x187>
183: R_X86_64_PC32 .LC23-0x4
187: c3 retq
188: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
18f: 00
190: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 197
<phy_modes+0x197>
193: R_X86_64_PC32 .LC0-0x4
197: c3 retq
Similar options for clang:
0000000000000000 <phy_modes>:
0: 83 ff 16 cmp $0x16,%edi
3: 77 0f ja 14 <phy_modes+0x14>
5: 48 63 c7 movslq %edi,%rax
8: 48 8d 0d 00 00 00 00 lea 0x0(%rip),%rcx # f
<phy_modes+0xf>
b: R_X86_64_PC32 .data.rel.ro-0x4
f: 48 8b 04 c1 mov (%rcx,%rax,8),%rax
13: c3 retq
14: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 1b
<phy_modes+0x1b>
17: R_X86_64_PC32 .L.str.23-0x4
1b: c3 retq
More information about the Gcc-bugs
mailing list