]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fortran: Replace large structs as function parameters by references [PR124259]
authorHarald Anlauf <anlauf@gmx.de>
Sun, 22 Mar 2026 20:58:37 +0000 (21:58 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Sun, 22 Mar 2026 21:08:38 +0000 (22:08 +0100)
Large structs passed by value as function parameters can be replaced by
const references to improve performance.

PR fortran/124259

gcc/fortran/ChangeLog:

* target-memory.cc (gfc_merge_initializers): Change struct
gfc_typespec argument into a const reference.
* target-memory.h (gfc_merge_initializers): Adjust prototype.
* trans.cc (gfc_finalize_tree_expr): Change struct symbol_attribute
argument into a const reference.
* trans.h (gfc_finalize_tree_expr): Adjust prototype.

gcc/fortran/target-memory.cc
gcc/fortran/target-memory.h
gcc/fortran/trans.cc
gcc/fortran/trans.h

index 08180b5990842b73f158a443fdd6c623945e2b54..cf1bfa879501eac659472fe9009ea160210356ef 100644 (file)
@@ -737,7 +737,7 @@ expr_to_char (gfc_expr *e, locus *loc,
    the union declaration.  */
 
 size_t
-gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, locus *loc,
+gfc_merge_initializers (const gfc_typespec &ts, gfc_expr *e, locus *loc,
                        unsigned char *data,
                        unsigned char *chk, size_t length)
 {
index 5463510f5370c8bd059e9ffb78f14bc588e3e007..bbb5789068fc164367cedf09570d14fa70508f2c 100644 (file)
@@ -44,7 +44,7 @@ int gfc_interpret_derived (unsigned char *, size_t, gfc_expr *);
 size_t gfc_target_interpret_expr (unsigned char *, size_t, gfc_expr *, bool);
 
 /* Merge overlapping equivalence initializers for trans-common.cc. */
-size_t gfc_merge_initializers (gfc_typespec, gfc_expr *, locus *,
+size_t gfc_merge_initializers (const gfc_typespec &, gfc_expr *, locus *,
                               unsigned char *, unsigned char *,
                               size_t);
 
index dc74819cced5fcbc458094dbafb0d46304eadf6c..1d7006a69630b7530b810ce384063e3d1cd3d570 100644 (file)
@@ -1609,7 +1609,7 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag)
 
 void
 gfc_finalize_tree_expr (gfc_se *se, gfc_symbol *derived,
-                       symbol_attribute attr, int rank)
+                       const symbol_attribute &attr, int rank)
 {
   tree vptr, final_fndecl, desc, tmp, size, is_final;
   tree data_ptr, data_null, cond;
index f5359e4131d2c9364cb0f2244c4c32c9c50c9775..f97fefd2ac05b945426258df7e575507ca93f6c4 100644 (file)
@@ -457,7 +457,8 @@ tree gfc_get_vptr_from_expr (tree);
 tree gfc_copy_class_to_class (tree, tree, tree, bool);
 bool gfc_add_finalizer_call (stmtblock_t *, gfc_expr *, tree = NULL_TREE);
 bool gfc_add_comp_finalizer_call (stmtblock_t *, tree, gfc_component *, bool);
-void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, symbol_attribute, int);
+void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, const symbol_attribute &,
+                            int);
 bool gfc_assignment_finalizer_call (gfc_se *, gfc_expr *, bool);
 
 void gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);