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]

Patch for PR target/38018 & middle-end/37565, optimization overrides


This patch fixes PR target/38018, where GCC aborts on IA64 because we
don't (can't) override options after changing them via an optimize
attribute or pragma.  It also addresses PR middle-end/37565, though
other targets may need to define OVERRIDE_OPTIONS_AFTER_CHANGE to work
correctly.

I used HJ's idea of having a new macro but it is a little different in
that the new macro, OVERRIDE_OPTIONS_AFTER_CHANGE, is only called when
changing the opt level via an attribute or pragma (and when changing it
back after reaching the end of the affected code).  It is not called
directly at the beginning of the program, but if you want the code
executed then you can have OVERRIDE_OPTIONS call the same code.  This is
what I did for IA64 (ia64_override_options calls
ia64_override_options_after_change).

The tricky part here was realizing that I had to have
cl_target_option_restore call this macro in addition to having
parse_optimize_options call it so that we are still OK after restoring
the options after changing them via the attribute.

Tested on IA64 HP-UX and Linux with no regressions.

OK for checkin?

Steve Ellcey
sje@cup.hp.com

2009-06-03  Steve Ellcey  <sje@cup.hp.com>

	PR middle-end/37565
	PR target/38018
	* doc/tm.texi (OVERRIDE_OPTIONS): Update.
	(OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* optc-gen.awk (cl_target_option_restore): Include call to 
	OVERRIDE_OPTIONS_AFTER_CHANGE.
	* c-common.c (parse_optimize_options): Call
	OVERRIDE_OPTIONS_AFTER_CHANGE.
	* ia64-protos.h (ia64_override_options_after_change): New.
	* ia64.h (OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* ia64.c (ia64_override_options_after_change): New.
	(ia64_override_options) Add call to above.


Index: doc/tm.texi
===================================================================
--- doc/tm.texi	(revision 148110)
+++ doc/tm.texi	(working copy)
@@ -813,6 +813,20 @@ parsed.
 
 Don't use this macro to turn on various extra optimizations for
 @option{-O}.  That is what @code{OPTIMIZATION_OPTIONS} is for.
+
+If you need to do something whenever the optimization level is
+changed via the optimize attribute or pragma, see
+@code{OVERRIDE_OPTIONS_AFTER_CHANGE}
+@end defmac
+
+@defmac OVERRIDE_OPTIONS_AFTER_CHANGE
+This macro is like @code{OVERRIDE_OPTIONS} but is called when the
+optimize level is changed via an attribute or pragma or when it
+is reset at the end of the code affected by the attribute or pragma.
+It is not called at the beginning of compilation when
+@code{OVERRIDE_OPTIONS} is called so if you want to perform these
+actions then, you should have @code{OVERRIDE_OPTIONS} call
+@code{OVERRIDE_OPTIONS_AFTER_CHANGE}.
 @end defmac
 
 @defmac C_COMMON_OVERRIDE_OPTIONS
Index: optc-gen.awk
===================================================================
--- optc-gen.awk	(revision 148110)
+++ optc-gen.awk	(working copy)
@@ -75,6 +75,7 @@ print "int target_flags;"
 print "#else"
 print "#include " quote "flags.h" quote
 print "#include " quote "target.h" quote
+print "#include " quote "tm_p.h" quote
 print "#endif /* GCC_DRIVER */"
 print ""
 
@@ -327,6 +328,9 @@ for (i = 0; i < n_opt_char; i++) {
 	print "  " var_opt_char[i] " = ptr->" var_opt_char[i] ";";
 }
 
+print "#ifdef OVERRIDE_OPTIONS_AFTER_CHANGE";
+print "  OVERRIDE_OPTIONS_AFTER_CHANGE;";
+print "#endif";
 print "}";
 
 print "";
Index: c-common.c
===================================================================
--- c-common.c	(revision 148110)
+++ c-common.c	(working copy)
@@ -7693,6 +7693,10 @@ parse_optimize_options (tree args, bool 
   /* Now parse the options.  */
   decode_options (opt_argc, opt_argv);
 
+#ifdef OVERRIDE_OPTIONS_AFTER_CHANGE
+  OVERRIDE_OPTIONS_AFTER_CHANGE;
+#endif
+
   /* Don't allow changing -fstrict-aliasing.  */
   flag_strict_aliasing = saved_flag_strict_aliasing;
 
Index: config/ia64/ia64-protos.h
===================================================================
--- config/ia64/ia64-protos.h	(revision 148110)
+++ config/ia64/ia64-protos.h	(working copy)
@@ -86,6 +86,7 @@ extern int ia64_eh_uses (int);
 extern void emit_safe_across_calls (void);
 extern void ia64_init_builtins (void);
 extern void ia64_override_options (void);
+extern void ia64_override_options_after_change (void);
 extern int ia64_dbx_register_number (int);
 
 extern rtx ia64_return_addr_rtx (HOST_WIDE_INT, rtx);
Index: config/ia64/ia64.h
===================================================================
--- config/ia64/ia64.h	(revision 148110)
+++ config/ia64/ia64.h	(working copy)
@@ -121,6 +121,13 @@ extern enum processor_type ia64_tune;
 
 #define OVERRIDE_OPTIONS ia64_override_options ()
 
+/* Since options can be changed by attributes or pragmas
+   OVERRIDE_OPTIONS_AFTER_CHANGE is called after the options are
+   changed in order to reset anything that needs to be fixed
+   for a particular target machine.  */
+
+#define OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change ()
+
 /* Some machines may desire to change what optimizations are performed for
    various optimization levels.  This macro, if defined, is executed once just
    after the optimization level is determined and before the remainder of the
Index: config/ia64/ia64.c
===================================================================
--- config/ia64/ia64.c	(revision 148110)
+++ config/ia64/ia64.c	(working copy)
@@ -5280,6 +5280,23 @@ ia64_override_options (void)
   if (TARGET_AUTO_PIC)
     target_flags |= MASK_CONST_GP;
 
+  ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
+
+  init_machine_status = ia64_init_machine_status;
+
+  if (align_functions <= 0)
+    align_functions = 64;
+  if (align_loops <= 0)
+    align_loops = 32;
+
+  ia64_override_options_after_change();
+}
+
+/* Implement OVERRIDE_OPTIONS_AFTER_CHANGE.  */
+
+void
+ia64_override_options_after_change (void)
+{
   ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
   flag_schedule_insns_after_reload = 0;
 
@@ -5289,27 +5306,20 @@ ia64_override_options (void)
       flag_selective_scheduling2 = 1;
       flag_sel_sched_pipelining = 1;
     }
+
   if (mflag_sched_control_spec == 2)
     {
       /* Control speculation is on by default for the selective scheduler,
          but not for the Haifa scheduler.  */
       mflag_sched_control_spec = flag_selective_scheduling2 ? 1 : 0;
     }
+
   if (flag_sel_sched_pipelining && flag_auto_inc_dec)
     {
       /* FIXME: remove this when we'd implement breaking autoinsns as
          a transformation.  */
       flag_auto_inc_dec = 0;
     }
-
-  ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
-
-  init_machine_status = ia64_init_machine_status;
-
-  if (align_functions <= 0)
-    align_functions = 64;
-  if (align_loops <= 0)
-    align_loops = 32;
 }
 
 /* Initialize the record of emitted frame related registers.  */


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