summaryrefslogtreecommitdiff
path: root/0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch
diff options
context:
space:
mode:
Diffstat (limited to '0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch')
-rw-r--r--0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch b/0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch
new file mode 100644
index 0000000..3286140
--- /dev/null
+++ b/0033-AutoFdo-Fix-memory-leaks-in-autofdo-and-autoprefetch.patch
@@ -0,0 +1,130 @@
+From adfcca263996bf174f7108b477e81e7ec58f19c4 Mon Sep 17 00:00:00 2001
+From: dingguangya <dingguangya1@huawei.com>
+Date: Mon, 14 Mar 2022 10:42:07 +0800
+Subject: [PATCH] [AutoFdo] Fix memory leaks in autofdo and autoprefetch
+
+Fix memory leaks in autofdo and autoprefetch.
+---
+ gcc/final.c | 23 +++++++++++++++--------
+ gcc/tree-ssa-loop-prefetch.c | 4 ++++
+ 2 files changed, 19 insertions(+), 8 deletions(-)
+
+diff --git a/gcc/final.c b/gcc/final.c
+index b9affd3a7..da8d20958 100644
+--- a/gcc/final.c
++++ b/gcc/final.c
+@@ -4770,12 +4770,16 @@ get_fdo_count_quality (profile_count count)
+ return profile_quality[count.quality ()];
+ }
+
+-static const char *
++/* If the function is not public, return the function_name/file_name for
++ disambiguation of local symbols since there could be identical function
++ names coming from identical file names. The caller needs to free memory. */
++
++static char *
+ alias_local_functions (const char *fnname)
+ {
+ if (TREE_PUBLIC (cfun->decl))
+ {
+- return fnname;
++ return concat (fnname, NULL);
+ }
+
+ return concat (fnname, "/", lbasename (dump_base_name), NULL);
+@@ -4826,12 +4830,14 @@ dump_direct_callee_info_to_asm (basic_block bb, gcov_type call_count)
+
+ if (callee)
+ {
++ char *func_name =
++ alias_local_functions (get_fnname_from_decl (callee));
+ fprintf (asm_out_file, "\t.string \"%x\"\n",
+ INSN_ADDRESSES (INSN_UID (insn)));
+
+ fprintf (asm_out_file, "\t.string \"%s%s\"\n",
+ ASM_FDO_CALLEE_FLAG,
+- alias_local_functions (get_fnname_from_decl (callee)));
++ func_name);
+
+ fprintf (asm_out_file,
+ "\t.string \"" HOST_WIDE_INT_PRINT_DEC "\"\n",
+@@ -4841,9 +4847,9 @@ dump_direct_callee_info_to_asm (basic_block bb, gcov_type call_count)
+ {
+ fprintf (dump_file, "call: %x --> %s\n",
+ INSN_ADDRESSES (INSN_UID (insn)),
+- alias_local_functions
+- (get_fnname_from_decl (callee)));
++ func_name);
+ }
++ free (func_name);
+ }
+ }
+ }
+@@ -4917,8 +4923,9 @@ dump_bb_info_to_asm (basic_block bb, gcov_type bb_count)
+ static void
+ dump_function_info_to_asm (const char *fnname)
+ {
++ char *func_name = alias_local_functions (fnname);
+ fprintf (asm_out_file, "\t.string \"%s%s\"\n",
+- ASM_FDO_CALLER_FLAG, alias_local_functions (fnname));
++ ASM_FDO_CALLER_FLAG, func_name);
+ fprintf (asm_out_file, "\t.string \"%s%d\"\n",
+ ASM_FDO_CALLER_SIZE_FLAG, get_function_end_addr ());
+ fprintf (asm_out_file, "\t.string \"%s%s\"\n",
+@@ -4926,8 +4933,7 @@ dump_function_info_to_asm (const char *fnname)
+
+ if (dump_file)
+ {
+- fprintf (dump_file, "\n FUNC_NAME: %s\n",
+- alias_local_functions (fnname));
++ fprintf (dump_file, "\n FUNC_NAME: %s\n", func_name);
+ fprintf (dump_file, " file: %s\n",
+ dump_base_name);
+ fprintf (dump_file, " profile_status: %s\n",
+@@ -4937,6 +4943,7 @@ dump_function_info_to_asm (const char *fnname)
+ fprintf (dump_file, " function_bind: %s\n",
+ simple_get_function_bind ());
+ }
++ free (func_name);
+ }
+
+ /* Dump function profile info form AutoFDO or PGO to asm. */
+diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
+index 0d992d8f6..781831c39 100644
+--- a/gcc/tree-ssa-loop-prefetch.c
++++ b/gcc/tree-ssa-loop-prefetch.c
+@@ -2248,6 +2248,7 @@ get_bb_branch_prob (hash_map <basic_block, bb_bp> &bb_branch_prob,
+ branch_prob.true_edge_prob = get_edge_prob (e);
+ }
+ }
++ free (body);
+ }
+
+ /* Traverse each bb in the loop and prune fake loops. */
+@@ -2416,6 +2417,7 @@ estimate_num_loop_insns (struct loop *loop, eni_weights *weights)
+ if (get_bb_prob (bb_branch_prob, loop) == false)
+ {
+ dump_loop_bb (loop);
++ free (body);
+ return 0;
+ }
+ if (dump_file && (dump_flags & TDF_DETAILS))
+@@ -2596,6 +2598,7 @@ is_high_exec_rate_loop (struct loop *loop)
+
+ if (loop_exec_rate < (float) LOOP_EXECUTION_RATE / 100.0)
+ {
++ exit_edges.release ();
+ return false;
+ }
+ }
+@@ -2606,6 +2609,7 @@ is_high_exec_rate_loop (struct loop *loop)
+ loop_exec_rate, (float) LOOP_EXECUTION_RATE / 100.0);
+ dump_loop_bb (loop);
+ }
++ exit_edges.release ();
+ return true;
+ }
+
+--
+2.27.0.windows.1
+