aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2025-04-14 19:31:23 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2025-04-14 19:31:23 +0200
commit2e3c91786a981f2d68600e2d7b2e25a766e59c21 (patch)
tree4c3eed09b11ceed832ee65e36706971314ac8cd9 /gcc
parent901d94e8b4eb9a273e9e75d5586cb5abde73a7a6 (diff)
downloadgcc-2e3c91786a981f2d68600e2d7b2e25a766e59c21.zip
gcc-2e3c91786a981f2d68600e2d7b2e25a766e59c21.tar.gz
gcc-2e3c91786a981f2d68600e2d7b2e25a766e59c21.tar.bz2
pretty-print, expand: Print [must tail call] for CALL_EXPRs and fix up maybe_complain_about_tail_call [PR119718]
Andrew P. mentioned earlier he'd like to see in the dump files a note whether it was a failed must tail call or not. We already print that on the tailc/musttail pass side, because print_gimple_stmt prints [must tail call] after the musttail calls. The first hunk below does it for GENERIC CALL_EXPRs too (which is needed for the expand diagnostics). That isn't enough though, because the error on it was done first and then CALL_EXPR_MUST_TAIL_CALL flag was cleared, so the dump didn't have it anymore. I've reordered the dump printing with error, so that it works properly. 2025-04-14 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/119718 * tree-pretty-print.cc (dump_generic_node) <case CALL_EXPR>: Dump also CALL_EXPR_MUST_TAIL_CALL flag. * calls.cc (maybe_complain_about_tail_call): Emit error about CALL_EXPR_MUST_TAIL_CALL only after emitting dump message, not before it.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/calls.cc10
-rw-r--r--gcc/tree-pretty-print.cc2
2 files changed, 7 insertions, 5 deletions
diff --git a/gcc/calls.cc b/gcc/calls.cc
index 372fab3..076e046 100644
--- a/gcc/calls.cc
+++ b/gcc/calls.cc
@@ -1273,11 +1273,6 @@ void
maybe_complain_about_tail_call (tree call_expr, const char *reason)
{
gcc_assert (TREE_CODE (call_expr) == CALL_EXPR);
- if (CALL_EXPR_MUST_TAIL_CALL (call_expr))
- {
- error_at (EXPR_LOCATION (call_expr), "cannot tail-call: %s", reason);
- CALL_EXPR_MUST_TAIL_CALL (call_expr) = 0;
- }
if (CALL_EXPR_TAILCALL (call_expr)
&& dump_file
&& (dump_flags & TDF_DETAILS))
@@ -1286,6 +1281,11 @@ maybe_complain_about_tail_call (tree call_expr, const char *reason)
print_generic_expr (dump_file, call_expr, TDF_SLIM);
fprintf (dump_file, "\n");
}
+ if (CALL_EXPR_MUST_TAIL_CALL (call_expr))
+ {
+ error_at (EXPR_LOCATION (call_expr), "cannot tail-call: %s", reason);
+ CALL_EXPR_MUST_TAIL_CALL (call_expr) = 0;
+ }
}
/* Fill in ARGS_SIZE and ARGS array based on the parameters found in
diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
index a2a4f5b..c1a21e7 100644
--- a/gcc/tree-pretty-print.cc
+++ b/gcc/tree-pretty-print.cc
@@ -3201,6 +3201,8 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
pp_string (pp, " [return slot optimization]");
if (CALL_EXPR_TAILCALL (node))
pp_string (pp, " [tail call]");
+ if (CALL_EXPR_MUST_TAIL_CALL (node))
+ pp_string (pp, " [must tail call]");
break;
case WITH_CLEANUP_EXPR: