From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28858 invoked by alias); 22 Oct 2009 16:44:42 -0000 Received: (qmail 28846 invoked by uid 22791); 22 Oct 2009 16:44:40 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from g6t0184.atlanta.hp.com (HELO g6t0184.atlanta.hp.com) (15.193.32.61) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 22 Oct 2009 16:44:31 +0000 Received: from smtp1.cup.hp.com (smtp1.cup.hp.com [16.89.217.160]) by g6t0184.atlanta.hp.com (Postfix) with ESMTP id 924AFC102 for ; Thu, 22 Oct 2009 16:44:29 +0000 (UTC) Received: from lucas.cup.hp.com (lucas.cup.hp.com [15.244.97.116]) by smtp1.cup.hp.com (Postfix) with ESMTP id 1B2BB515090 for ; Thu, 22 Oct 2009 16:25:29 +0000 (UTC) Received: (from sje@localhost) by lucas.cup.hp.com (8.11.1 (PHNE_35485)/8.11.1) id n9MGiHJ05006 for gcc-patches@gcc.gnu.org; Thu, 22 Oct 2009 09:44:17 -0700 (PDT) Date: Thu, 22 Oct 2009 16:49:00 -0000 From: Steve Ellcey Message-Id: <200910221644.n9MGiHJ05006@lucas.cup.hp.com> To: gcc-patches@gcc.gnu.org Subject: [patch, ping] PR 38018 & 37565 - Option pragma and attribute handling Reply-To: sje@cup.hp.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2009-10/txt/msg01427.txt.bz2 This is a resubmission / ping for a patch to fix PR target/38018 and PR middle-end/37565. The original patch was submitted back in June here: http://gcc.gnu.org/ml/gcc-patches/2009-06/msg00348.html I have updated it so it would apply to the ToT but otherwise made no changes to it. I got no approval or rejection last time so any comments would be welcome. -------- 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-10-22 Steve Ellcey 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 153444) +++ 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: c-common.c =================================================================== --- c-common.c (revision 153444) +++ c-common.c (working copy) @@ -7797,6 +7797,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 153444) +++ config/ia64/ia64-protos.h (working copy) @@ -89,6 +89,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 153444) +++ config/ia64/ia64.h (working copy) @@ -123,6 +123,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 153444) +++ config/ia64/ia64.c (working copy) @@ -5496,6 +5496,25 @@ 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; + if (TARGET_ABI_OPEN_VMS) + flag_no_common = 1; + + 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; @@ -5517,18 +5536,6 @@ ia64_override_options (void) 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; - - if (TARGET_ABI_OPEN_VMS) - flag_no_common = 1; } /* Initialize the record of emitted frame related registers. */