aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-04-09 09:28:27 +0200
committerJakub Jelinek <jakub@redhat.com>2024-04-09 09:28:27 +0200
commit7dd1f9d2ec422173f490d91b9173d4fa5d32d909 (patch)
treedab91fe83932f4737e241f9597fce98595ff6a7f /gcc
parent46c91665f4bceba19aed56f5bd6e934c548b84ff (diff)
downloadgcc-7dd1f9d2ec422173f490d91b9173d4fa5d32d909.zip
gcc-7dd1f9d2ec422173f490d91b9173d4fa5d32d909.tar.gz
gcc-7dd1f9d2ec422173f490d91b9173d4fa5d32d909.tar.bz2
bitint: Don't move debug stmts from before returns_twice calls [PR114628]
Debug stmts are allowed by the verifier before the returns_twice calls. More importantly, they don't have a lhs, so the current handling of arg_stmts statements to force them on the edges ICEs. The following patch just keeps them where they were before. 2024-04-09 Jakub Jelinek <jakub@redhat.com> PR middle-end/114628 * gimple-lower-bitint.cc (gimple_lower_bitint): Keep debug stmts before returns_twice calls as is, don't push them into arg_stmts vector/move to edges. * gcc.dg/bitint-105.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-lower-bitint.cc9
-rw-r--r--gcc/testsuite/gcc.dg/bitint-105.c29
2 files changed, 36 insertions, 2 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 1afd4de..4c3b7f7 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -7172,8 +7172,13 @@ gimple_lower_bitint (void)
gimple_stmt_iterator gsi = gsi_after_labels (gimple_bb (stmt));
while (gsi_stmt (gsi) != stmt)
{
- arg_stmts.safe_push (gsi_stmt (gsi));
- gsi_remove (&gsi, false);
+ if (is_gimple_debug (gsi_stmt (gsi)))
+ gsi_next (&gsi);
+ else
+ {
+ arg_stmts.safe_push (gsi_stmt (gsi));
+ gsi_remove (&gsi, false);
+ }
}
gimple *g;
basic_block bb = NULL;
diff --git a/gcc/testsuite/gcc.dg/bitint-105.c b/gcc/testsuite/gcc.dg/bitint-105.c
new file mode 100644
index 0000000..d3215b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-105.c
@@ -0,0 +1,29 @@
+/* PR middle-end/114628 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2 -g" } */
+
+int foo (int);
+#if __BITINT_MAXWIDTH__ >= 129
+__attribute__((returns_twice)) int bar (_BitInt(129) x);
+
+void
+baz (int x, _BitInt(129) y)
+{
+ void *q[] = { &&l1, &&l2 };
+l2:
+ x = foo (foo (3));
+ bar (y);
+ goto *q[x & 1];
+l1:;
+}
+
+void
+qux (int x, _BitInt(129) y)
+{
+ void *q[] = { &&l1, &&l2 };
+l2:
+ x = foo (foo (3));
+ bar (y);
+l1:;
+}
+#endif