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;