On Wed, Jan 04, 2017 at 06:42:23PM +0000, Richard Sandiford wrote:
> 1. reload has a bug that no-one really wants to fix (understandable)
> 2. the bug is triggered by paradoxical subregs of mems
> 3. those subregs are normally disabled on targets that support insn
> scheduling
> 4. therefore, define an insn scheduler
> 5. we don't actually want insn scheduling, so either
> (a) make sure the insn scheduler is never actually used for insn
> scheduling, or
> (b) allow the insn scheduler to run anyway but encourage it to do nothing
> (other than take compile time)
>
> (4) and (5) feel like too much of a hack to me. They're going to have
> other consequences, e.g. we'll no longer give the warning:
>
> instruction scheduling not supported on this target machine
>
> if users try to use -fschedule-insns. And since we don't support
> meaningful insn scheduling even after this patch, giving the warning
> seems more user-friendly than dropping it.
>
> I think the consensus is that we don't want these subregs for AVR
> regardless of whether scheduling is used, and probably wouldn't want
> them even without this bug.
Right, and the same is true for most targets. Subregs of memory are not
something you want. As rtl.texi says:
@item mem
@code{subreg}s of @code{mem} were common in earlier versions of GCC and
are still supported. During the reload pass these are replaced by plain
@code{mem}s. On machines that do not do instruction scheduling, use of
@code{subreg}s of @code{mem} are still used, but this is no longer
recommended. Such @code{subreg}s are considered to be
@code{register_operand}s rather than @code{memory_operand}s before and
during reload. Because of this, the scheduling passes cannot properly
schedule instructions with @code{subreg}s of @code{mem}, so for machines
that do scheduling, @code{subreg}s of @code{mem} should never be used.
To support this, the combine and recog passes have explicit code to
inhibit the creation of @code{subreg}s of @code{mem} when
@code{INSN_SCHEDULING} is defined.
> So why not instead change the condition
> used by general_operand, like we were talking about yesterday?
> It seems simpler and more direct.
We should split off a new "SUBREGS_OF_MEM_ALLOWED" from !INSN_SCHEDULING,
and then probably even default it to false.
Segher