diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 20 |
2 files changed, 15 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d7f67c..5805e11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2017-12-14 Alexandre Oliva <aoliva@redhat.com> + * config/i386/i386.c (rest_of_insert_endbranch): Use call loc + for its nop_endbr. + PR bootstrap/83396 * config/arc/arc.c (hwloop_optimize): Skip debug insns. * config/sh/sh-protos.h (sh_find_set_of_reg): Adjust. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 051c3e5..3503743 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2609,21 +2609,25 @@ rest_of_insert_endbranch (void) { if (INSN_P (insn) && GET_CODE (insn) == CALL_INSN) { - rtx_insn *next_insn = insn; + if (find_reg_note (insn, REG_SETJMP, NULL) == NULL) + continue; + /* Generate ENDBRANCH after CALL, which can return more than + twice, setjmp-like functions. */ + /* Skip notes and debug insns that must be next to the + call insn. ??? This might skip a lot more than + that... ??? Skipping barriers and emitting code + after them surely looks like a mistake; we probably + won't ever hit it, for we'll hit BB_END first. */ + rtx_insn *next_insn = insn; while ((next_insn != BB_END (bb)) && (DEBUG_INSN_P (NEXT_INSN (next_insn)) || NOTE_P (NEXT_INSN (next_insn)) || BARRIER_P (NEXT_INSN (next_insn)))) next_insn = NEXT_INSN (next_insn); - /* Generate ENDBRANCH after CALL, which can return more than - twice, setjmp-like functions. */ - if (find_reg_note (insn, REG_SETJMP, NULL) != NULL) - { - cet_eb = gen_nop_endbr (); - emit_insn_after (cet_eb, next_insn); - } + cet_eb = gen_nop_endbr (); + emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn)); continue; } |