[Bug target/46208] New: TARGET_PROMOTE_PROTOTYPES for SPARC V8

jorge.perez at invia dot fr gcc-bugzilla@gcc.gnu.org
Thu Oct 28 08:11:00 GMT 2010


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46208

           Summary: TARGET_PROMOTE_PROTOTYPES for SPARC V8
           Product: gcc
           Version: 4.5.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: jorge.perez@invia.fr


Based on Ian Taylor's recommendation (http://goo.gl/yAoL)


******************* Problem summary (http://goo.gl/Mcrm)

When a caller function calls a callee function with short or char
arguments, the arguments are casted twice: inside the caller function
and inside the callee function, see the example. It is a waste of
performance in code density and speed!

Example: sparc-elf-gcc -o test.elf test.c -Os

short somme(char a, short b){
  int i;
  for (i=0; i<b; i++){
    a+=a;
  }
  return a+b;
}
short somme2(char a, short b){
  int i;
  for (i=0; i<b; i++){
    a+=b;
  }
  return a+2*b;
}
int main(){
  volatile short b=1;
  volatile char a=1, c=1;
  b=somme(a,b);
  b=somme(c,b);
  b=somme(a,c);
  b=somme2(a,b);
  b=somme2(c,b);
  b=somme2(a,c);
  return 0;
}

0001024c <somme>:
   1024c:    85 2a 60 10     sll  %o1, 0x10, %g2
   10250:    82 10 20 00     clr  %g1
   10254:    10 80 00 03     b  10260 <somme+0x14>
   10258:    85 38 a0 10     sra  %g2, 0x10, %g2
   1025c:    82 00 60 01     inc  %g1
   10260:    80 a0 40 02     cmp  %g1, %g2
   10264:    26 bf ff fe     bl,a   1025c <somme+0x10>
   10268:    91 2a 20 01     sll  %o0, 1, %o0
   1026c:    91 2a 20 18     sll  %o0, 0x18, %o0
   10270:    91 3a 20 18     sra  %o0, 0x18, %o0
   10274:    81 c3 e0 08     retl
   10278:    90 02 40 08     add  %o1, %o0, %o0

000102b4 <main>:
   102b4:    9d e3 bf 98     save  %sp, -104, %sp
   102b8:    82 10 20 01     mov  1, %g1
   102bc:    c2 37 bf fc     sth  %g1, [ %fp + -4 ]
   102c0:    c2 2f bf ff     stb  %g1, [ %fp + -1 ]
   102c4:    c2 2f bf fe     stb  %g1, [ %fp + -2 ]
   102c8:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   102cc:    d2 17 bf fc     lduh  [ %fp + -4 ], %o1
   102d0:    91 2a 20 18     sll  %o0, 0x18, %o0
   102d4:    93 2a 60 10     sll  %o1, 0x10, %o1
   102d8:    91 3a 20 18     sra  %o0, 0x18, %o0
   102dc:    7f ff ff dc     call  1024c <somme>
   102e0:    93 3a 60 10     sra  %o1, 0x10, %o1
      ...


**************** Fix proposal (http://goo.gl/0mJ1)

we modified the function *TARGET_PROMOTE_PROTOTYPES
*(http://goo.gl/2pQQ) and set it to the default value which is FALSE.

static bool
sparc_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED)
{
  return TARGET_ARCH32 ? true : false;
}

was replaced by

static bool
sparc_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED)
{
  return false;
}

Then we re-compiled GCC 4.5.1 for SPARC V8 and the results for the
previously mentioned test.c are

short somme(char a, short b){
  int i;
  for (i=0; i<b; i++){
    a+=a;
  }
  return a+b;
}

short somme2(char a, short b){
  int i;
  for (i=0; i<b; i++){
    a+=b;
  }
  return a+2*b;
}

int main(){
  volatile short b=1;
  volatile char a=1, c=1;
  b=somme(a,b);
  b=somme(c,b);
  b=somme(a,c);
  b=somme2(a,b);
  b=somme2(c,b);
  b=somme2(a,c);
  b=somme2(a,c*2);
  b=somme2(a,c*3);
  b=somme2(a,c*4);      
  return 0;
}

0001024c <somme>:
   1024c:    85 2a 60 10     sll  %o1, 0x10, %g2
   10250:    82 10 20 00     clr  %g1
   10254:    10 80 00 03     b  10260 <somme+0x14>
   10258:    85 38 a0 10     sra  %g2, 0x10, %g2
   1025c:    82 00 60 01     inc  %g1
   10260:    80 a0 40 02     cmp  %g1, %g2
   10264:    26 bf ff fe     bl,a   1025c <somme+0x10>
   10268:    91 2a 20 01     sll  %o0, 1, %o0
   1026c:    91 2a 20 18     sll  %o0, 0x18, %o0
   10270:    91 3a 20 18     sra  %o0, 0x18, %o0
   10274:    81 c3 e0 08     retl
   10278:    90 02 00 09     add  %o0, %o1, %o0

0001027c <somme2>:
   1027c:    87 2a 60 10     sll  %o1, 0x10, %g3
   10280:    82 10 20 00     clr  %g1
   10284:    87 38 e0 10     sra  %g3, 0x10, %g3
   10288:    10 80 00 03     b  10294 <somme2+0x18>
   1028c:    84 10 00 09     mov  %o1, %g2
   10290:    82 00 60 01     inc  %g1
   10294:    80 a0 40 03     cmp  %g1, %g3
   10298:    26 bf ff fe     bl,a   10290 <somme2+0x14>
   1029c:    90 02 00 02     add  %o0, %g2, %o0
   102a0:    93 2a 60 01     sll  %o1, 1, %o1
   102a4:    91 2a 20 18     sll  %o0, 0x18, %o0
   102a8:    91 3a 20 18     sra  %o0, 0x18, %o0
   102ac:    81 c3 e0 08     retl
   102b0:    90 02 40 08     add  %o1, %o0, %o0

000102b4 <main>:
   102b4:    9d e3 bf 98     save  %sp, -104, %sp
   102b8:    82 10 20 01     mov  1, %g1
   102bc:    c2 37 bf fc     sth  %g1, [ %fp + -4 ]
   102c0:    c2 2f bf ff     stb  %g1, [ %fp + -1 ]
   102c4:    c2 2f bf fe     stb  %g1, [ %fp + -2 ]
   102c8:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   102cc:    d2 17 bf fc     lduh  [ %fp + -4 ], %o1
   102d0:    7f ff ff df     call  1024c <somme>
   102d4:    01 00 00 00     nop
   102d8:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   102dc:    d0 0f bf fe     ldub  [ %fp + -2 ], %o0
   102e0:    d2 17 bf fc     lduh  [ %fp + -4 ], %o1
   102e4:    7f ff ff da     call  1024c <somme>
   102e8:    01 00 00 00     nop
   102ec:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   102f0:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   102f4:    d2 0f bf fe     ldub  [ %fp + -2 ], %o1
   102f8:    93 2a 60 18     sll  %o1, 0x18, %o1
   102fc:    7f ff ff d4     call  1024c <somme>
   10300:    93 3a 60 18     sra  %o1, 0x18, %o1
   10304:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   10308:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   1030c:    d2 17 bf fc     lduh  [ %fp + -4 ], %o1
   10310:    7f ff ff db     call  1027c <somme2>
   10314:    01 00 00 00     nop
   10318:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   1031c:    d0 0f bf fe     ldub  [ %fp + -2 ], %o0
   10320:    d2 17 bf fc     lduh  [ %fp + -4 ], %o1
   10324:    7f ff ff d6     call  1027c <somme2>
   10328:    01 00 00 00     nop
   1032c:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   10330:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   10334:    d2 0f bf fe     ldub  [ %fp + -2 ], %o1
   10338:    93 2a 60 18     sll  %o1, 0x18, %o1
   1033c:    7f ff ff d0     call  1027c <somme2>
   10340:    93 3a 60 18     sra  %o1, 0x18, %o1
   10344:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   10348:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   1034c:    d2 0f bf fe     ldub  [ %fp + -2 ], %o1
   10350:    93 2a 60 18     sll  %o1, 0x18, %o1
   10354:    7f ff ff ca     call  1027c <somme2>
   10358:    93 3a 60 17     sra  %o1, 0x17, %o1
   1035c:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   10360:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   10364:    c2 0f bf fe     ldub  [ %fp + -2 ], %g1
   10368:    83 28 60 18     sll  %g1, 0x18, %g1
   1036c:    83 38 60 18     sra  %g1, 0x18, %g1
   10370:    93 28 60 01     sll  %g1, 1, %o1
   10374:    7f ff ff c2     call  1027c <somme2>
   10378:    92 02 40 01     add  %o1, %g1, %o1
   1037c:    b0 10 20 00     clr  %i0
   10380:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   10384:    d0 0f bf ff     ldub  [ %fp + -1 ], %o0
   10388:    d2 0f bf fe     ldub  [ %fp + -2 ], %o1
   1038c:    93 2a 60 18     sll  %o1, 0x18, %o1
   10390:    7f ff ff bb     call  1027c <somme2>
   10394:    93 3a 60 16     sra  %o1, 0x16, %o1
   10398:    d0 37 bf fc     sth  %o0, [ %fp + -4 ]
   1039c:    81 c7 e0 08     ret
   103a0:    81 e8 00 00     restore


this reduced the size of the main by 96 bytes which is huge taking into
account that this is a dummy example. 

Thanks for your help,


Best regards,


Jorge Perez



More information about the Gcc-bugs mailing list