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;

Reply via email to