summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2017-12-14 15:03:09 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2017-12-14 15:03:09 +0000
commitdc988bc8e1b44b7be040b29369b28e7fdbf3fe07 (patch)
treec8073edf762e1ecf67435fbd269555ae646dd524
parentad1d5c78da501538c5d963076624e6effb326a21 (diff)
downloadgcc-dc988bc8e1b44b7be040b29369b28e7fdbf3fe07.tar.gz
[compare-debug] use call loc for nop_endbr
We skip debug insns and notes after a call that needs a nop_endbr, but since a debug insn could be the last in a block, it may affect the loc in the emitted nop_endbr insn. Although this has no effect on codegen, it does mess with debug info a bit, and it causes -fcompare-debug to fail for e.g. libsanitizer's tsan/tsan_platform_linux.cc on x86_64. So, pick the location of the call insn for the nop_endbr insn, to avoid the line number differences in dumps, including -fcompare-debug ones. Also, we don't need to determine what the insert point would be unless we're actually emitting the nop_endbr insn after the call, so rearrange the code to avoid wasting cycles. Finally, it seems like testing for barriers is a mistake. We probably never actually pass that test, for the barriers would hit BB_END first. If we did, we'd end up emitting the nop_endbr outside any BB, even after the end of the function! That would be Very Bad (TM). Now, since the test as it is can't hurt, I figured I wouldn't change the logic right now, just add a comment so that someone involved in endbr stuff can have a second look and hopefully fix it. for gcc/ChangeLog * config/i386/i386.c (rest_of_insert_endbranch): Use call loc for its nop_endbr. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@255639 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/i386/i386.c20
2 files changed, 15 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4d7f67ccb8f..5805e116ff5 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 051c3e56d82..35037434bf5 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;
}