]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-propagate: Special case lhs of musttail calls in may_propagate_copy [PR118430]
authorJakub Jelinek <jakub@redhat.com>
Thu, 16 Jan 2025 08:25:16 +0000 (09:25 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 16 Jan 2025 08:27:54 +0000 (09:27 +0100)
This patch ensures that VRP or similar passes don't replace the uses of lhs of
[[gnu::musttail]] calls with some constant (e.g. if the call is known is known
to return a singleton value range) etc. to make it more likely that it is actually
tail callable.

2025-01-16  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/118430
* tree-ssa-propagate.cc (may_propagate_copy): Return false if dest
is lhs of an [[gnu::musttail]] call.
(substitute_and_fold_dom_walker::before_dom_children): Formatting fix.

* c-c++-common/musttail14.c: Expect lhs on the must tail call calls.

gcc/testsuite/c-c++-common/musttail14.c
gcc/tree-ssa-propagate.cc

index e2ab20bc5a46c9ac32f63510b24526e80afafdc4..e95bc9bc76888c80c0c08138e99b0f2751e8487a 100644 (file)
@@ -1,9 +1,9 @@
 /* PR tree-optimization/118430 */
 /* { dg-do compile { target musttail } } */
 /* { dg-options "-O2 -fdump-tree-optimized" } */
-/* { dg-final { scan-tree-dump-times "  bar \\\(\[^\n\r]\*\\\); \\\[tail call\\\] \\\[must tail call\\\]" 1 "optimized" } } */
-/* { dg-final { scan-tree-dump-times "  freddy \\\(\[^\n\r]\*\\\); \\\[tail call\\\] \\\[must tail call\\\]" 1 "optimized" } } */
-/* { dg-final { scan-tree-dump-times "  (?:bar|freddy) \\\(\[^\n\r]\*\\\); \\\[tail call\\\]" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "  \[^\n\r]* = bar \\\(\[^\n\r]\*\\\); \\\[tail call\\\] \\\[must tail call\\\]" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "  \[^\n\r]* = freddy \\\(\[^\n\r]\*\\\); \\\[tail call\\\] \\\[must tail call\\\]" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-not "  (?:bar|freddy) \\\(\[^\n\r]\*\\\); \\\[tail call\\\]" "optimized" } } */
 
 __attribute__ ((noipa)) void
 foo (int x)
index 94d4401f54af5e4b240d9245ced10959769e8666..ec2068948215a295bd1c86108cec5e23b4b53557 100644 (file)
@@ -870,7 +870,7 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
        }
       /* Also fold if we want to fold all statements.  */
       else if (substitute_and_fold_engine->fold_all_stmts
-         && fold_stmt (&i, follow_single_use_edges))
+              && fold_stmt (&i, follow_single_use_edges))
        {
          did_replace = true;
          stmt = gsi_stmt (i);
@@ -1081,6 +1081,13 @@ may_propagate_copy (tree dest, tree orig, bool dest_not_abnormal_phi_edge_p)
   if (TREE_CODE (dest) == SSA_NAME && virtual_operand_p (dest))
     return false;
 
+  /* Keep lhs of [[gnu::musttail]] calls as is, those need to be still
+     tail callable.  */
+  if (TREE_CODE (dest) == SSA_NAME
+      && is_gimple_call (SSA_NAME_DEF_STMT (dest))
+      && gimple_call_must_tail_p (as_a <gcall *> (SSA_NAME_DEF_STMT (dest))))
+    return false;
+
   /* Anything else is OK.  */
   return true;
 }