------- Comment #4 from steven at gcc dot gnu dot org 2009-01-02 18:21 ------- Confirmed at r134530 with the following reduced test case:
typedef unsigned int USItype __attribute__ ((mode (SI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); typedef USItype halffractype; typedef UDItype fractype; typedef struct { unsigned int sign; int normal_exp; union { fractype ll; halffractype l[2]; } fraction; } fp_number_type; extern void bar (); extern fp_number_type * _fpmul_parts (fractype, fractype, fp_number_type *); fp_number_type * _fpmul_parts (fractype low, fractype high, fp_number_type *tmp) { while (high >= ((fractype) 1 << (52 + 1 + 8L))) { tmp->normal_exp++; if (high & 1) bar (); high >>= 1; } while (high < ((fractype) 1 << (52 + 8L))) { tmp->normal_exp--; high <<= 1; } tmp->fraction.ll = high; return tmp; } Unfortunately I can't reproduce it with the top-of-trunk of today. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36003