Should I file a bug report? If it is not a C semantics thing, GCC certainly 
produces unnecessarily big code. 

        .file   "tst.c"
        .text
        .p2align 4,,15
.globl tst1
        .type   tst1, @function
tst1:
.LFB0:
        .cfi_startproc
        movswl  %si,%esi
        movswl  %di,%edi
        xorl    %eax, %eax
        subl    $254, %esi
        cmpl    %edi, %esi
        setg    %al
        ret
        .cfi_endproc
.LFE0:
        .size   tst1, .-tst1
        .p2align 4,,15
.globl tst2
        .type   tst2, @function
tst2:
.LFB1:
        .cfi_startproc
        subw    $255, %si
        xorl    %eax, %eax
        cmpw    %di, %si
        setge   %al
        ret
        .cfi_endproc
.LFE1:
        .size   tst2, .-tst2
        .ident  "GCC: (GNU) 4.4.0 20090218 (experimental) [trunk revision 
143368]"
        .section        .note.GNU-stack,"",@progbits

> -----Original Message-----
> From: Richard Guenther [mailto:richard.guent...@gmail.com] 
> Sent: 03 March 2009 15:16
> To: Bingfeng Mei
> Cc: gcc@gcc.gnu.org; John Redford
> Subject: Re: Why are these two functions compiled differently?
> 
> On Tue, Mar 3, 2009 at 4:06 PM, Bingfeng Mei 
> <b...@broadcom.com> wrote:
> > Hello,
> > I came across the following example and their 
> .final_cleanup files. To me, both functions should produce 
> the same code. But tst1 function actually requires two extra 
> sign_extend instructions compared with tst2. Is this a C 
> semantics thing, or GCC mis-compile (over-conservatively) in 
> the first case.
> 
> Both transformations are already done by the fronted (or fold), likely
> shorten_compare is quilty for tst1 and fold_unary for tst2 (which
> folds (short)((int)b - (int)A).
> 
> Richard.
> 
> > Cheers,
> > Bingfeng Mei
> > Broadcom UK
> >
> >
> > #define A  255
> >
> > int tst1(short a, short b){
> >  if(a > (b - A))
> >    return 0;
> >  else
> >    return 1;
> >
> > }
> >
> >
> > int tst2(short a, short b){
> >  short c = b - A;
> >  if(a > c)
> >    return 0;
> >  else
> >    return 1;
> >
> > }
> >
> >
> > .final_cleanup
> > ;; Function tst1 (tst1)
> >
> > tst1 (short int a, short int b)
> > {
> > <bb 2>:
> >  return (int) b + -254 > (int) a;
> >
> > }
> >
> >
> >
> > ;; Function tst2 (tst2)
> >
> > tst2 (short int a, short int b)
> > {
> > <bb 2>:
> >  return (short int) ((short unsigned int) b + 65281) >= a;
> >
> > }
> >
> >
> >
> >
> 
> 

Reply via email to