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 <[email protected]>
---
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