summaryrefslogtreecommitdiff
path: root/0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
committerCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
commit73127104a245052cd5cf29cdaaca3e5c32c70348 (patch)
tree8e28b63e478c43c252f18b49836dff7313affe54 /0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch
parent49d3feaf4665cdb07576fc1a2382a4d82a612d35 (diff)
automatic import of gccopeneuler24.03_LTS_SP1
Diffstat (limited to '0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch')
-rw-r--r--0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch b/0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch
new file mode 100644
index 0000000..fdefe48
--- /dev/null
+++ b/0246-Backport-SME-explow-Allow-dynamic-allocations-after-.patch
@@ -0,0 +1,110 @@
+From fe64cc72e6221cf05e40bc868287bd1fcf07479f Mon Sep 17 00:00:00 2001
+From: Richard Sandiford <richard.sandiford@arm.com>
+Date: Mon, 6 Nov 2023 10:49:58 +0000
+Subject: [PATCH 147/157] [Backport][SME] explow: Allow dynamic allocations
+ after vregs
+
+Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=a7a45364dddef399bfb550235166df51108a3142
+
+This patch allows allocate_dynamic_stack_space to be called before
+or after virtual registers have been instantiated. It uses the
+same approach as allocate_stack_local, which already supported this.
+
+gcc/
+ * function.h (get_stack_dynamic_offset): Declare.
+ * function.cc (get_stack_dynamic_offset): New function,
+ split out from...
+ (get_stack_dynamic_offset): ...here.
+ * explow.cc (allocate_dynamic_stack_space): Handle calls made
+ after virtual registers have been instantiated.
+---
+ gcc/explow.cc | 10 +++++++---
+ gcc/function.cc | 12 +++++++++++-
+ gcc/function.h | 1 +
+ 3 files changed, 19 insertions(+), 4 deletions(-)
+
+diff --git a/gcc/explow.cc b/gcc/explow.cc
+index d8aa75ee9..124e8f49e 100644
+--- a/gcc/explow.cc
++++ b/gcc/explow.cc
+@@ -1375,12 +1375,16 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
+ HOST_WIDE_INT stack_usage_size = -1;
+ rtx_code_label *final_label;
+ rtx final_target, target;
++ rtx addr = (virtuals_instantiated
++ ? plus_constant (Pmode, stack_pointer_rtx,
++ get_stack_dynamic_offset ())
++ : virtual_stack_dynamic_rtx);
+
+ /* If we're asking for zero bytes, it doesn't matter what we point
+ to since we can't dereference it. But return a reasonable
+ address anyway. */
+ if (size == const0_rtx)
+- return virtual_stack_dynamic_rtx;
++ return addr;
+
+ /* Otherwise, show we're calling alloca or equivalent. */
+ cfun->calls_alloca = 1;
+@@ -1532,7 +1536,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
+ poly_int64 saved_stack_pointer_delta;
+
+ if (!STACK_GROWS_DOWNWARD)
+- emit_move_insn (target, virtual_stack_dynamic_rtx);
++ emit_move_insn (target, force_operand (addr, target));
+
+ /* Check stack bounds if necessary. */
+ if (crtl->limit_stack)
+@@ -1575,7 +1579,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
+ stack_pointer_delta = saved_stack_pointer_delta;
+
+ if (STACK_GROWS_DOWNWARD)
+- emit_move_insn (target, virtual_stack_dynamic_rtx);
++ emit_move_insn (target, force_operand (addr, target));
+ }
+
+ suppress_reg_args_size = false;
+diff --git a/gcc/function.cc b/gcc/function.cc
+index f4fc211a0..e62b2a8d6 100644
+--- a/gcc/function.cc
++++ b/gcc/function.cc
+@@ -1945,6 +1945,16 @@ instantiate_decls (tree fndecl)
+ vec_free (cfun->local_decls);
+ }
+
++/* Return the value of STACK_DYNAMIC_OFFSET for the current function.
++ This is done through a function wrapper so that the macro sees a
++ predictable set of included files. */
++
++poly_int64
++get_stack_dynamic_offset ()
++{
++ return STACK_DYNAMIC_OFFSET (current_function_decl);
++}
++
+ /* Pass through the INSNS of function FNDECL and convert virtual register
+ references to hard register references. */
+
+@@ -1956,7 +1966,7 @@ instantiate_virtual_regs (void)
+ /* Compute the offsets to use for this function. */
+ in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
+ var_offset = targetm.starting_frame_offset ();
+- dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
++ dynamic_offset = get_stack_dynamic_offset ();
+ out_arg_offset = STACK_POINTER_OFFSET;
+ #ifdef FRAME_POINTER_CFA_OFFSET
+ cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
+diff --git a/gcc/function.h b/gcc/function.h
+index 4e8131706..a5846465a 100644
+--- a/gcc/function.h
++++ b/gcc/function.h
+@@ -711,6 +711,7 @@ extern vec<edge> convert_jumps_to_returns (basic_block last_bb, bool simple_p,
+ extern basic_block emit_return_for_exit (edge exit_fallthru_edge,
+ bool simple_p);
+ extern void reposition_prologue_and_epilogue_notes (void);
++extern poly_int64 get_stack_dynamic_offset ();
+
+ /* Returns the name of the current function. */
+ extern const char *fndecl_name (tree);
+--
+2.33.0
+