https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79985

Alexander Monakov <amonakov at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-03-10
                 CC|                            |abel at gcc dot gnu.org,
                   |                            |amonakov at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
Thanks for the nice minimal testcase. We choose to schedule the bottom asm
first (it doesn't depend on anything else), but then while moving it up we
notice a use/set conflict with the upper asm in undo_transformations.  Somehow
register 110 (vscr) is added to set/use regsets for insns representing asms via
DF:

Breakpoint 2, setup_id_reg_sets (id=0x1d71e28, insn=0x7ffff18af400) at
gcc/sel-sched-ir.c:2677
2677      struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
(gdb) c
Continuing.

Breakpoint 2, setup_id_reg_sets (id=0x1dcedf8, insn=0x7ffff18af6c0) at
gcc/sel-sched-ir.c:2677
2677      struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
(gdb)
Continuing.

Breakpoint 2, setup_id_reg_sets (id=0x1dcf058, insn=0x7ffff18af480) at
gcc/sel-sched-ir.c:2677
2677      struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
(gdb) call debug_rtx(insn)
(insn 8 14 5 2 (parallel [
            (set (reg:DI 155)
                (asm_operands:DI ("") ("=r") 0 [
                        (reg:DI 155)
                    ]
                     [
                        (asm_input:DI ("0") t.c:6)
                    ]
                     [] t.c:6))
            (clobber (reg:SI 76 ca))
        ]) "t.c":6 -1
     (expr_list:REG_UNUSED (reg:SI 76 ca)
        (nil)))
(gdb) n
2679      regset tmp = get_clear_regset_from_pool ();
(gdb)
2681      FOR_EACH_INSN_INFO_DEF (def, insn_info)
(gdb)
2683          unsigned int regno = DF_REF_REGNO (def);
(gdb)
2686          if (DF_REF_FLAGS_IS_SET (def, (DF_REF_MUST_CLOBBER
(gdb) p regno
$15 = 110

Reply via email to