Kenneth Zadeck <[EMAIL PROTECTED]> writes: > Richard Sandiford wrote: >> I think this is a latent bug in var-tracking.c. It's getting confused >> by the negative offsets in: >> >> (insn:HI 17 47 19 4 /tmp/foo.c:11 (set (reg:DI 26 26 [orig:124 tmp+-7 ] >> [124]) >> (lshiftrt:DI (reg:DI 31 31 [orig:141 value ] [141]) >> (const_int 56 [0x38]))) 292 {*lshrdi3_internal1} (nil)) >> >> (insn:HI 19 17 21 4 /tmp/foo.c:11 (set (reg:DI 27 27 [orig:125 tmp+-6 ] >> [125]) >> (lshiftrt:DI (reg:DI 31 31 [orig:141 value ] [141]) >> (const_int 48 [0x30]))) 292 {*lshrdi3_internal1} (nil)) >> >> where the registers have come from paradoxical subregs of QImode registers. >> (DSE itself didn't create those; combine did. DSE just created DImode >> shift instructions.) >> >> FWIW, the part of the patch that exposed the bug as the change from >> "access_bytes < UNITS_PER_WORD" to "access_bytes <= UNITS_PER_WORD". >> Your testcase passes if we change that back. >> > i would prefer that the above change be reverted and the rest of the > patch left in.
OK, thanks. It's almost 24hrs since the regression was reported, and Janis says that no-one's found a fix yet, so I've installed the mini-reversion below as preapproved. Richard gcc/ * dse.c (find_shift_sequence): Temporarily revert to forbidding word shifts. Index: gcc/dse.c =================================================================== --- gcc/dse.c (revision 128585) +++ gcc/dse.c (working copy) @@ -1407,7 +1407,7 @@ find_shift_sequence (rtx read_reg, justify the value we want to read but is available in one insn on the machine. */ - for (; access_size <= UNITS_PER_WORD; access_size *= 2) + for (; access_size < UNITS_PER_WORD; access_size *= 2) { rtx target, new_reg; enum machine_mode new_mode;