On 11/30/20 8:29 AM, Richard Sandiford via Gcc-patches wrote:
> dse.c:find_shift_sequence tries to represent a store and load
> back as a shift right followed by a truncation. It therefore
> needs to find an integer mode in which to do the shift right.
> The loop it uses has the form:
>
> FOR_EACH_MODE_FROM (new_mode_iter,
> smallest_int_mode_for_size (GET_MODE_BITSIZE (read_mode)))
>
> which implicitly assumes that read_mode has an equivalent integer mode.
> As shown in the testcase, not all modes have such an integer mode.
>
> This patch just makes the code start from the smallest integer mode and
> skip modes that are too small. The loop already breaks at the first
> mode wider than word_mode.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK for trunk and
> GCC 10 branch?
>
> Richard
>
>
> gcc/
> PR rtl-optimization/98037
> * dse.c (find_shift_sequence): Iterate over all integers and
> skip modes that are too small.
>
> gcc/testsuite/
> PR rtl-optimization/98037
> * gcc.target/aarch64/sve/acle/general/pr98037.c: New test.
OK
jeff