<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>When I’m compiling a code with –fvisibility=hidden –fPIC for ARM, I find that LLVM generates less optimized code than GCC.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>For example:<o:p></o:p></p><p class=MsoNormal> test.cpp:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void init(void *);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>int g0[100];<o:p></o:p></p><p class=MsoNormal>int g1[100];<o:p></o:p></p><p class=MsoNormal>int g2[100];<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void foo() {<o:p></o:p></p><p class=MsoNormal>  init(&g0);<o:p></o:p></p><p class=MsoNormal>  init(&g1);<o:p></o:p></p><p class=MsoNormal>  init(&g2);<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Clang will emit 1 GOT entry for each GV and 2 instructions to get the address: <o:p></o:p></p><p class=MsoNormal>        ldr     r0, .LCPI0_2<o:p></o:p></p><p class=MsoNormal>        add     r0, r0, r4<o:p></o:p></p><p class=MsoNormal>         bl      _Z4initPv(PLT)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>GCC  does this only for the first GV. The rest GV address are computed directly:<o:p></o:p></p><p class=MsoNormal>        ldr     r4, .L2<o:p></o:p></p><p class=MsoNormal>.LPIC0:<o:p></o:p></p><p class=MsoNormal>        add     r4, pc, r4   <span style='font-family:Wingdings'>è</span> get &g0 via GOT_PC Relative<o:p></o:p></p><p class=MsoNormal>        mov     r0, r4<o:p></o:p></p><p class=MsoNormal>        bl      _Z4initPv(PLT)<o:p></o:p></p><p class=MsoNormal>        add     r0, r4, #400    <span style='font-family:Wingdings'>è</span> get &g1<o:p></o:p></p><p class=MsoNormal>        bl      _Z4initPv(PLT)<o:p></o:p></p><p class=MsoNormal>        add     r0, r4, #800  <span style='font-family:Wingdings'>è</span> get &g2<o:p></o:p></p><p class=MsoNormal>        ldmfd   sp!, {r4, lr}<o:p></o:p></p><p class=MsoNormal>        b       _Z4initPv(PLT)<o:p></o:p></p><p class=MsoNormal>.L3:<o:p></o:p></p><p class=MsoNormal>        .align  2<o:p></o:p></p><p class=MsoNormal>.L2:<o:p></o:p></p><p class=MsoNormal>        .word   .LANCHOR0-(.LPIC0+8)  <span style='font-family:Wingdings'>è</span> 1 GOT offset entry<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>It seems it’s a missing optimizing opportunity for LLVM both in code size and performance, any ideas? If so, I can open a bug and try to fix it.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks,<o:p></o:p></p><p class=MsoNormal>Weiming<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>