This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] IPA ICF: add comparison for target and optimization nodes


On 01/07/2015 12:38 PM, Martin LiÅka wrote:
Hello.

Following patch adds support for target and optimization nodes comparison, which is
based on Honza's newly added infrastructure.

Apart from that, there's a small hunk that corrects formatting and removes unnecessary
call to a comparison function.

Hope it can be applied as one patch.

Tested on x86_64-linux-pc without any new regression introduction.

Ready for trunk?

Thank you,
Martin

Hello.

Apart from the previous patch, I would like to install following patch which introduces
new dump functions related to target and optimization nodes. These functions dump just
different flags.

Patch has been tested on x86_64-linux-pc.

Thanks,
Martin
>From dfc2b68a2f81745f3768cc9349076cc56d3efc8f Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Thu, 8 Jan 2015 10:35:38 +0100
Subject: [PATCH 2/2] Option diff dump is added for target and optimization
 flags.

gcc/ChangeLog:

2015-01-09  Martin Liska  <mliska@suse.cz>

	* ipa-icf.c (sem_function::equals_private): Call new functions
	cl_target_option_print_diff and cl_optimization_print_diff.
	* optc-save-gen.awk (cl_target_option_print_diff): New function.
	(cl_optimization_print_diff): Likewise.
	* opth-gen.awk: Likewise.
---
 gcc/ipa-icf.c         |  12 ++---
 gcc/optc-save-gen.awk | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++
 gcc/opth-gen.awk      |   6 +++
 3 files changed, 143 insertions(+), 8 deletions(-)

diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index 28158b3..3d9943e 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -437,10 +437,8 @@ sem_function::equals_private (sem_item *item,
 	{
 	  if (dump_file && (dump_flags & TDF_DETAILS))
 	    {
-	      fprintf (dump_file, "Source target flags\n");
-	      cl_target_option_print (dump_file, 2, tar1);
-	      fprintf (dump_file, "Target target flags\n");
-	      cl_target_option_print (dump_file, 2, tar2);
+	      fprintf (dump_file, "target flags difference");
+	      cl_target_option_print_diff (dump_file, 2, tar1, tar2);
 	    }
 
 	  return return_false_with_msg ("Target flags are different");
@@ -458,10 +456,8 @@ sem_function::equals_private (sem_item *item,
 	{
 	  if (dump_file && (dump_flags & TDF_DETAILS))
 	    {
-	      fprintf (dump_file, "Source optimization flags\n");
-	      cl_optimization_print (dump_file, 2, opt1);
-	      fprintf (dump_file, "Target optimization flags\n");
-	      cl_optimization_print (dump_file, 2, opt2);
+	      fprintf (dump_file, "optimization flags difference");
+	      cl_optimization_print_diff (dump_file, 2, opt1, opt2);
 	    }
 
 	  return return_false_with_msg ("optimization flags are different");
diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk
index ebeb509..4e28261 100644
--- a/gcc/optc-save-gen.awk
+++ b/gcc/optc-save-gen.awk
@@ -234,6 +234,69 @@ for (i = 0; i < n_opt_char; i++) {
 print "}";
 
 print "";
+print "/* Print different optimization variables from structures provided as arguments.  */";
+print "void";
+print "cl_optimization_print_diff (FILE *file,";
+print "                            int indent_to,";
+print "                            struct cl_optimization *ptr1,";
+print "                            struct cl_optimization *ptr2)";
+print "{";
+
+print "  fputs (\"\\n\", file);";
+for (i = 0; i < n_opt_other; i++) {
+	print "  if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")";
+	print "    fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
+	print "             indent_to, \"\",";
+	print "             \"" var_opt_other[i] "\",";
+	print "             (unsigned long)ptr1->x_" var_opt_other[i] ",";
+	print "             (unsigned long)ptr2->x_" var_opt_other[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_opt_int; i++) {
+	print "  if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent_to, \"\",";
+	print "             \"" var_opt_int[i] "\",";
+	print "             ptr1->x_" var_opt_int[i] ",";
+	print "             ptr2->x_" var_opt_int[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_opt_enum; i++) {
+	print "  if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")";
+	print "  fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "           indent_to, \"\",";
+	print "           \"" var_opt_enum[i] "\",";
+	print "           (int) ptr1->x_" var_opt_enum[i] ",";
+	print "           (int) ptr2->x_" var_opt_enum[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_opt_short; i++) {
+	print "  if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent_to, \"\",";
+	print "             \"" var_opt_short[i] "\",";
+	print "             ptr1->x_" var_opt_short[i] ",";
+	print "             ptr2->x_" var_opt_short[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_opt_char; i++) {
+	print "  if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent_to, \"\",";
+	print "             \"" var_opt_char[i] "\",";
+	print "             ptr1->x_" var_opt_char[i] ",";
+	print "             ptr2->x_" var_opt_char[i] ");";
+	print "";
+}
+
+print "}";
+
+
+print "";
 print "/* Save selected option variables into a structure.  */"
 print "void";
 print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)";
@@ -426,6 +489,76 @@ for (i = 0; i < n_target_char; i++) {
 print "";
 print "  if (targetm.target_option.print)";
 print "    targetm.target_option.print (file, indent, ptr);";
+print "}";
+
+print "";
+print "/* Print different target option variables from structures provided as arguments.  */";
+print "void";
+print "cl_target_option_print_diff (FILE *file,";
+print "                             int indent,";
+print "                             struct cl_target_option *ptr1,";
+print "                             struct cl_target_option *ptr2)";
+print "{";
+
+print "  fputs (\"\\n\", file);";
+for (i = 0; i < n_target_other; i++) {
+	print "  if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")";
+	if (host_wide_int[var_target_other[i]] == "yes")
+		print "    fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
+	else
+		print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_other[i] "\",";
+	if (host_wide_int[var_target_other[i]] == "yes") {
+		print "             ptr1->x_" var_target_other[i] ",";
+		print "             ptr2->x_" var_target_other[i] ");";
+	}
+	else {
+		print "             (unsigned long)ptr1->x_" var_target_other[i] ",";
+		print "             (unsigned long)ptr2->x_" var_target_other[i] ");";
+	}
+	print "";
+}
+
+for (i = 0; i < n_target_enum; i++) {
+	print "  if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_enum[i] "\",";
+	print "             ptr1->x_" var_target_enum[i] ",";
+	print "             ptr2->x_" var_target_enum[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_target_int; i++) {
+	print "  if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_int[i] "\",";
+	print "             ptr1->x_" var_target_int[i] ",";
+	print "             ptr2->x_" var_target_int[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_target_short; i++) {
+	print "  if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_short[i] "\",";
+	print "             ptr1->x_" var_target_short[i] ",";
+	print "             ptr2->x_" var_target_short[i] ");";
+	print "";
+}
+
+for (i = 0; i < n_target_char; i++) {
+	print "  if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")";
+	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_char[i] "\",";
+	print "             ptr1->x_" var_target_char[i] ",";
+	print "             ptr2->x_" var_target_char[i] ");";
+	print "";
+}
 
 print "}";
 
diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk
index b891ef7..837b26b 100644
--- a/gcc/opth-gen.awk
+++ b/gcc/opth-gen.awk
@@ -284,6 +284,9 @@ print "";
 print "/* Print optimization variables from a structure.  */";
 print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);";
 print "";
+print "/* Print different optimization variables from structures provided as arguments.  */";
+print "extern void cl_optimization_print_diff (FILE *, int, cl_optimization *ptr1, cl_optimization *ptr2);";
+print "";
 print "/* Save selected option variables into a structure.  */"
 print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);";
 print "";
@@ -293,6 +296,9 @@ print "";
 print "/* Print target option variables from a structure.  */";
 print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);";
 print "";
+print "/* Print different target option variables from structures provided as arguments.  */";
+print "extern void cl_target_option_print_diff (FILE *, int, cl_target_option *ptr1, cl_target_option *ptr2);";
+print "";
 print "/* Compare two target option variables from a structure.  */";
 print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);";
 print "";
-- 
2.1.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]