diff options
Diffstat (limited to '0319-CSPGO-fix-bugs-when-using-cspgo.patch')
| -rw-r--r-- | 0319-CSPGO-fix-bugs-when-using-cspgo.patch | 140 | 
1 files changed, 140 insertions, 0 deletions
| diff --git a/0319-CSPGO-fix-bugs-when-using-cspgo.patch b/0319-CSPGO-fix-bugs-when-using-cspgo.patch new file mode 100644 index 0000000..bd86bb8 --- /dev/null +++ b/0319-CSPGO-fix-bugs-when-using-cspgo.patch @@ -0,0 +1,140 @@ +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 + | 
