[Bug rtl-optimization/78029] [7 Regression] ICE in maybe_record_trace_start, at dwarf2cfi.c:2285

segher at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Oct 28 15:31:00 GMT 2016


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

--- Comment #8 from Segher Boessenkool <segher at gcc dot gnu.org> ---
Author: segher
Date: Fri Oct 28 14:39:28 2016
New Revision: 241650

URL: https://gcc.gnu.org/viewcvs?rev=241650&root=gcc&view=rev
Log:
sched: Do not mix prologue and epilogue insns

This patch makes scheduling not reorder prologue insns relative to
epilogue insns and vice versa.  This fixes PR78029.

The problem in that PR:
We have two insns, in this order:

(insn/f 300 299 267 8 (set (reg:DI 65 lr)
        (reg:DI 0 0)) 579 {*movdi_internal64}
     (expr_list:REG_DEAD (reg:DI 0 0)
        (expr_list:REG_CFA_RESTORE (reg:DI 65 lr)
            (nil))))
...
(insn/f 310 268 134 8 (set (mem/c:DI (plus:DI (reg/f:DI 1 1)
                (const_int 144 [0x90])) [6  S8 A8])
        (reg:DI 0 0)) 579 {*movdi_internal64}
     (expr_list:REG_DEAD (reg:DI 0 0)
        (expr_list:REG_CFA_OFFSET (set (mem/c:DI (plus:DI (reg/f:DI 1 1)
                        (const_int 144 [0x90])) [6  S8 A8])
                (reg:DI 65 lr))
            (nil))))

and sched swaps them (when compiling for power6, it tries to put memory
stores together, so insn 310 is moved up past 300 to go together with
some other store).  But the REG_CFA_RESTORE and REG_CFA_OFFSET cannot be
swapped (they both say where the orig value of LR now lives).


        PR rtl-optimization/78029
        * function.c (prologue_contains, epilogue_contains): New functions.
        (record_prologue_seq, record_epilogue_seq): New functions.
        * function.h (prologue_contains, epilogue_contains,
        record_prologue_seq, record_epilogue_seq): New declarations.
        * sched-deps.c (sched_analyze_insn): Make dependencies to prevent
        mixing prologue and epilogue insns.
        (init_deps): Initialize the new fields in struct deps_desc.
        * sched-int.h (struct deps_desc): New fields last_prologue,
        last_epilogue, and last_logue_was_epilogue.
        * shrink-wrap.c (emit_common_heads_for_components): Record all
        emitted prologue and epilogue insns.
        (emit_common_tails_for_components): Ditto.
        (insert_prologue_epilogue_for_components): Ditto.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/function.c
    trunk/gcc/function.h
    trunk/gcc/sched-deps.c
    trunk/gcc/sched-int.h
    trunk/gcc/shrink-wrap.c


More information about the Gcc-bugs mailing list