On Wed, 20 Nov 2019, Richard Biener wrote:
> On Tue, Nov 19, 2019 at 5:07 PM Vladimir Makarov <[email protected]> wrote:
> >
> > The following patch fixes
> >
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90007
> >
> > Sometime ago a code which permits LRA to reload hard register into
> > memory as it did for pseudo were added. But this LRA possibility was
> > not reflected in recog.c. The following patch fixes this discrepancy
> > and as a result fixes PR90007.
> >
> > OK to commit?
>
> I guess the change is OK but for the bug itself it sounds like
> selective scheduling doesn't properly recognize insns it
> proagates into (and avoids doing that then)? That is,
> selective scheduling creates invalid RTL?
We validate the substitution by invoking validate_replace_rtx_part_nosimplify
from substitute_reg_in_expr. I think that should be sufficient? I see similar
code in haifa-sched uses attempt_change, which also ultimately uses
apply_change_group.
FWIW, here's gdb session transcript showing that the substituted insn is
greenlighted:
Breakpoint 1, substitute_reg_in_expr (expr=0x248ee98, insn=0x7ffff791b880,
undo=false) at /home/monoid/gcc-vecdoc/gcc/sel-sched.c:743
743 bool has_rhs = VINSN_RHS (*vi) != NULL;
(gdb) call debug_expr(expr)
[((17;r95=flt(r98);)type:set;count:3;)prio:8;orig_bb:2;]
(gdb) call debug_insn(insn)
([((35;r98=r8;)type:use;count:1;)prio:9;orig_bb:2;];seqno:2;)
(gdb) b validate_replace_rtx_part_nosimplify
Breakpoint 2 at 0xcc1cfb: file /home/monoid/gcc-vecdoc/gcc/recog.c, line 835.
(gdb) c
Continuing.
Breakpoint 2, validate_replace_rtx_part_nosimplify
(from=from@entry=0x7ffff7aa2588, to=to@entry=0x7ffff7a9acd8,
where=0x7ffff7aa2d00, insn=insn@entry=0x7ffff791b940) at
/home/monoid/gcc-vecdoc/gcc/recog.c:835
835 validate_replace_rtx_1 (where, from, to, insn, false);
(gdb) call debug_rtx(from)
(reg:SI 98)
(gdb) call debug_rtx(to)
(reg:SI 36 r8 [ e7 ])
(gdb) call debug_rtx(*where)
(float:DF (reg:SI 98))
(gdb) call debug_rtx(insn)
(insn 39 0 0 (set (reg:DF 95)
(float:DF (reg:SI 98))) 167 {*floatsidf2}
(expr_list:REG_DEAD (reg:SI 98)
(nil)))
(gdb) fin
Run till exit from #0 validate_replace_rtx_part_nosimplify
(from=from@entry=0x7ffff7aa2588, to=to@entry=0x7ffff7a9acd8,
where=0x7ffff7aa2d00, insn=insn@entry=0x7ffff791b940) at
/home/monoid/gcc-vecdoc/gcc/recog.c:835
substitute_reg_in_expr (expr=0x248ee98, insn=<optimized out>, undo=<optimized
out>) at /home/monoid/gcc-vecdoc/gcc/sel-sched.c:783
783 if (new_insn_valid)
Value returned is $1 = 1
(gdb) call debug_rtx(new_insn)
(insn 39 0 0 (set (reg:DF 95)
(float:DF (reg:SI 36 r8 [ e7 ]))) 167 {*floatsidf2}
(expr_list:REG_DEAD (reg:SI 98)
(nil)))
Alexander