When we emit .p2align to align BB_HEAD, we must update BB_HEAD.  Otherwise
ENDBR will be inserted as the wrong place.

gcc/

        PR target/116174
        * config/i386/i386.cc (ix86_align_loops): Update BB_HEAD when
        aligning BB_HEAD

gcc/testsuite/

        PR target/116174
        * gcc.target/i386/pr116174.c: New test.

Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
---
 gcc/config/i386/i386.cc                  |  7 +++++--
 gcc/testsuite/gcc.target/i386/pr116174.c | 12 ++++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr116174.c

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 77c441893b4..ec6cc5e3548 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -23528,8 +23528,11 @@ ix86_align_loops ()
 
          if (padding_p && detect_tight_loop_p)
            {
-             emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 (size)),
-                                                   GEN_INT (0)), label);
+             rtx_insn *align =
+               emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 
(size)),
+                                                     GEN_INT (0)), label);
+             if (BB_HEAD (bb) == label)
+               BB_HEAD (bb) = align;
              /* End of function.  */
              if (!tbb || tbb == EXIT_BLOCK_PTR_FOR_FN (cfun))
                break;
diff --git a/gcc/testsuite/gcc.target/i386/pr116174.c 
b/gcc/testsuite/gcc.target/i386/pr116174.c
new file mode 100644
index 00000000000..8877d0b51af
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr116174.c
@@ -0,0 +1,12 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fcf-protection=branch" } */
+
+char *
+foo (char *dest, const char *src)
+{
+  while ((*dest++ = *src++) != '\0')
+    /* nothing */;
+  return --dest;
+}
+
+/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n" } } */
-- 
2.45.2

Reply via email to