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; > > } > > > >