[v9,02/10] Fix pro_and_epilogue for sibcalls at -O0 (PR115255)

Message ID 20240708170031.1621184-3-ak@linux.intel.com
State New
Headers
Series [v9,01/10] Improve must tail in RTL backend |

Commit Message

Andi Kleen July 8, 2024, 4:55 p.m. UTC
  Some of the cfg fixups in pro_and_epilogue for sibcalls were dependent on "optimize".
Make them check cfun->tail_call_marked instead to handle the -O0 musttail
case. This fixes the musttail test cases on arm targets.

gcc/ChangeLog:

	PR target/115255
	* function.cc (thread_prologue_and_epilogue_insns): Check
	  cfun->tail_call_marked for sibcalls too.
	(rest_of_handle_thread_prologue_and_epilogue): Dito.
---
 gcc/function.cc | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/function.cc b/gcc/function.cc
index 4edd4da12474..a6f6de349420 100644
--- a/gcc/function.cc
+++ b/gcc/function.cc
@@ -2231,6 +2231,7 @@  use_register_for_decl (const_tree decl)
       /* We don't set DECL_IGNORED_P for the function_result_decl.  */
       if (optimize)
 	return true;
+      /* Needed for [[musttail]] which can operate even at -O0 */
       if (cfun->tail_call_marked)
 	return true;
       /* We don't set DECL_REGISTER for the function_result_decl.  */
@@ -6259,8 +6260,11 @@  thread_prologue_and_epilogue_insns (void)
     }
 
   /* Threading the prologue and epilogue changes the artificial refs in the
-     entry and exit blocks, and may invalidate DF info for tail calls.  */
+     entry and exit blocks, and may invalidate DF info for tail calls.
+     This is also needed for [[musttail]] conversion even when not
+     optimizing.  */
   if (optimize
+      || cfun->tail_call_marked
       || flag_optimize_sibling_calls
       || flag_ipa_icf_functions
       || in_lto_p)
@@ -6557,7 +6561,7 @@  rest_of_handle_thread_prologue_and_epilogue (function *fun)
 {
   /* prepare_shrink_wrap is sensitive to the block structure of the control
      flow graph, so clean it up first.  */
-  if (optimize)
+  if (cfun->tail_call_marked || optimize)
     cleanup_cfg (0);
 
   /* On some machines, the prologue and epilogue code, or parts thereof,