141 lines
4.8 KiB
Diff
141 lines
4.8 KiB
Diff
|
|
From 610470b1892213afd4ddcf83862667c758724872 Mon Sep 17 00:00:00 2001
|
||
|
|
From: liyancheng <412998149@qq.com>
|
||
|
|
Date: Wed, 4 Dec 2024 16:25:01 +0800
|
||
|
|
Subject: [PATCH] [CSPGO] fix bugs when using cspgo
|
||
|
|
|
||
|
|
---
|
||
|
|
gcc/opts.cc | 36 ++++++++++++++++++++++++++----------
|
||
|
|
gcc/tree-profile.cc | 20 ++++++++++++++++++++
|
||
|
|
2 files changed, 46 insertions(+), 10 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/gcc/opts.cc b/gcc/opts.cc
|
||
|
|
index 6ca9dde7e..2433ace06 100644
|
||
|
|
--- a/gcc/opts.cc
|
||
|
|
+++ b/gcc/opts.cc
|
||
|
|
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see
|
||
|
|
#include "diagnostic-color.h"
|
||
|
|
#include "version.h"
|
||
|
|
#include "selftest.h"
|
||
|
|
+#include "ai4c-infer.h"
|
||
|
|
|
||
|
|
/* In this file all option sets are explicit. */
|
||
|
|
#undef OPTION_SET_P
|
||
|
|
@@ -3086,17 +3087,28 @@ common_handle_option (struct gcc_options *opts,
|
||
|
|
break;
|
||
|
|
|
||
|
|
case OPT_fcfgo_profile_use_:
|
||
|
|
+ opts->x_profile_data_prefix = xstrdup (arg);
|
||
|
|
+ opts->x_flag_profile_use = true;
|
||
|
|
+ value = true;
|
||
|
|
/* No break here - do -fcfgo-profile-use processing. */
|
||
|
|
/* FALLTHRU */
|
||
|
|
case OPT_fcfgo_profile_use:
|
||
|
|
- value = true;
|
||
|
|
- if (value)
|
||
|
|
+ if (get_optimize_decision_from_ai4c ())
|
||
|
|
{
|
||
|
|
+ value = true;
|
||
|
|
enable_cfgo_optimizations (opts, opts_set, value);
|
||
|
|
SET_OPTION_IF_UNSET (opts, opts_set, flag_cfgo_profile_use, value);
|
||
|
|
+ /* Enable orig fdo optimizations. */
|
||
|
|
+ enable_fdo_optimizations (opts, opts_set, value);
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
|
||
|
|
+ value);
|
||
|
|
+ /* Indirect call profiling should do all useful transformations
|
||
|
|
+ speculative devirtualization does. */
|
||
|
|
+ if (opts->x_flag_value_profile_transformations)
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
|
||
|
|
+ false);
|
||
|
|
}
|
||
|
|
- /* No break here - do -fprofile-use processing. */
|
||
|
|
- /* FALLTHRU */
|
||
|
|
+ break;
|
||
|
|
case OPT_fprofile_use_:
|
||
|
|
opts->x_profile_data_prefix = xstrdup (arg);
|
||
|
|
opts->x_flag_profile_use = true;
|
||
|
|
@@ -3116,10 +3128,10 @@ common_handle_option (struct gcc_options *opts,
|
||
|
|
|
||
|
|
case OPT_fcfgo_csprofile_use_:
|
||
|
|
opts->x_csprofile_data_prefix = xstrdup (arg);
|
||
|
|
- value = true;
|
||
|
|
/* No break here - do -fcfgo-csprofile-use processing. */
|
||
|
|
/* FALLTHRU */
|
||
|
|
case OPT_fcfgo_csprofile_use:
|
||
|
|
+ value = get_optimize_decision_from_ai4c ();
|
||
|
|
SET_OPTION_IF_UNSET (opts, opts_set, flag_csprofile_use, value);
|
||
|
|
break;
|
||
|
|
|
||
|
|
@@ -3155,18 +3167,22 @@ common_handle_option (struct gcc_options *opts,
|
||
|
|
break;
|
||
|
|
|
||
|
|
case OPT_fcfgo_profile_generate_:
|
||
|
|
+ opts->x_profile_data_prefix = xstrdup (arg);
|
||
|
|
+ value = true;
|
||
|
|
/* No break here - do -fcfgo-profile-generate processing. */
|
||
|
|
/* FALLTHRU */
|
||
|
|
case OPT_fcfgo_profile_generate:
|
||
|
|
- value = true;
|
||
|
|
- if (value)
|
||
|
|
+ if (get_optimize_decision_from_ai4c ())
|
||
|
|
{
|
||
|
|
enable_cfgo_optimizations (opts, opts_set, value);
|
||
|
|
SET_OPTION_IF_UNSET (opts, opts_set, flag_cfgo_profile_generate,
|
||
|
|
value);
|
||
|
|
}
|
||
|
|
- /* No break here - do -fprofile-generate processing. */
|
||
|
|
- /* FALLTHRU */
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
|
||
|
|
+ SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
|
||
|
|
+ break;
|
||
|
|
case OPT_fprofile_generate_:
|
||
|
|
opts->x_profile_data_prefix = xstrdup (arg);
|
||
|
|
value = true;
|
||
|
|
@@ -3181,10 +3197,10 @@ common_handle_option (struct gcc_options *opts,
|
||
|
|
|
||
|
|
case OPT_fcfgo_csprofile_generate_:
|
||
|
|
opts->x_csprofile_data_prefix = xstrdup (arg);
|
||
|
|
- value = true;
|
||
|
|
/* No break here - do -fcfgo-csprofile-generate processing. */
|
||
|
|
/* FALLTHRU */
|
||
|
|
case OPT_fcfgo_csprofile_generate:
|
||
|
|
+ value = get_optimize_decision_from_ai4c ();
|
||
|
|
SET_OPTION_IF_UNSET (opts, opts_set, flag_csprofile_generate, value);
|
||
|
|
break;
|
||
|
|
|
||
|
|
diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
|
||
|
|
index aa3a2b3a9..ace1fe31c 100644
|
||
|
|
--- a/gcc/tree-profile.cc
|
||
|
|
+++ b/gcc/tree-profile.cc
|
||
|
|
@@ -1114,6 +1114,26 @@ public:
|
||
|
|
to do anything. */
|
||
|
|
virtual unsigned int execute (function *)
|
||
|
|
{
|
||
|
|
+ if (!profile_data_prefix)
|
||
|
|
+ error ("profile_data_prefix must set when using cspgo.");
|
||
|
|
+
|
||
|
|
+ if (!csprofile_data_prefix)
|
||
|
|
+ error ("csprofile_data_prefix must set when using cspgo.");
|
||
|
|
+
|
||
|
|
+ if (!flag_cfgo_profile_use)
|
||
|
|
+ error ("cspgo must used with cfgo-pgo.");
|
||
|
|
+
|
||
|
|
+ /* Just compare canonical pathnames. */
|
||
|
|
+ char* cfgo_pgo_path = lrealpath (profile_data_prefix);
|
||
|
|
+ char* cfgo_cspgo_path = lrealpath (csprofile_data_prefix);
|
||
|
|
+ bool files_differ = filename_cmp (cfgo_pgo_path, cfgo_cspgo_path);
|
||
|
|
+ if (!files_differ)
|
||
|
|
+ {
|
||
|
|
+ error ("pgo and cspgo path must different between %s and %s",
|
||
|
|
+ cfgo_pgo_path, cfgo_cspgo_path);
|
||
|
|
+ }
|
||
|
|
+ free (cfgo_pgo_path);
|
||
|
|
+ free (cfgo_cspgo_path);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|