------- Comment #9 from matz at suse dot de 2006-03-13 08:57 ------- -fno-ivopts fixes it. The problem is how bitfield refs are dealt with it seems. With -fno-ivopts the final_cleanup pass looks like so at the interesting point:
D.2180 = BIT_FIELD_REF <*pdev, 32, 544> & 4294967295; ... if ((BIT_FIELD_REF <*b, 32, 0> & 4294967295) != D.2180) goto <L3>; else goto <L1>; ivopts lead to this code at that point: D.2180 = BIT_FIELD_REF <*pdev, 32, 544> & 4294967295; ... if ((MEM[base: (long unsigned int *) b] & 4294967295) != D.2180) goto <L3>; else goto <L1>; Now BIT_FIELD_REF<*b,32,0> extract exactly the 32 bit at address 'b'. But MEM[base: (long unsigned int *) b] extracts the 64 bit at that address. The masking afterwards selects the lower 32bit from that, but ppc being a big endian target this extracts the wrong half. Let's CC Zdenek for this. -- matz at suse dot de changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rakdver at gcc dot gnu dot | |org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26643