From patchwork Sat Apr 20 01:22:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 238130 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 3EA042C015C for ; Sat, 20 Apr 2013 11:23:29 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; q=dns; s= default; b=s3sge99rIRjGNVWDtpn6As3kjIzeQEdNGweM7p9dK91CeLk1NMKPV ShZdvsC0udoXqAihNoyywujCLhl7YNvpL6aErLaPccCLd1cGUUsd+B2lsIiGReBR QCXE544UVMq5Du7kPjpRoN/qobyLMattBWIrUYh58E+C833NUl33/Y= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; s= default; bh=qzPWUFm0gS4idkaOLJkYtTX9/bU=; b=U0tmScV5ZsttHq8GG/gh yRbL1zNT88xJR0OB+gLPDt44JlxJalK9iQ5mMe+gJUirrhPfsx0RyTWZzV+Tkr5A 7K5LuKDxOaPctOQOls81Co94PAiP5M8Rane9KIojowUfZc1cHyFAh6tf+q/5v1DK FLPDUWtKpH0F9zbos3Zi5fY= Received: (qmail 17936 invoked by alias); 20 Apr 2013 01:23:09 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 17836 invoked by uid 89); 20 Apr 2013 01:23:08 -0000 X-Spam-SWARE-Status: No, score=-7.9 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sat, 20 Apr 2013 01:23:07 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3K1N5Jx004595 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 19 Apr 2013 21:23:05 -0400 Received: from surprise.redhat.com (vpn-238-97.phx2.redhat.com [10.3.238.97]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3K1N3Zx010184; Fri, 19 Apr 2013 21:23:05 -0400 From: David Malcolm To: gcc-patches@gcc.gnu.org Cc: David Malcolm Subject: [PATCH 1/6] Introduce macros when constructing the tree of passes Date: Fri, 19 Apr 2013 21:22:57 -0400 Message-Id: <1366420982-1546-2-git-send-email-dmalcolm@redhat.com> In-Reply-To: <1366420982-1546-1-git-send-email-dmalcolm@redhat.com> References: <1365087283.1778.35.camel@surprise> <1366420982-1546-1-git-send-email-dmalcolm@redhat.com> * passes.c (init_optimization_passes): introduce macros INSERT_PASSES_AFTER, PUSH_INSERT_PASSES_WITHIN, POP_INSERT_PASSES, TERMINATE_PASS_LIST when constructing the tree of passes --- gcc/ChangeLog | 6 ++++ gcc/passes.c | 108 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 62 insertions(+), 52 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c27e4da..37c425a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-04-19 David Malcolm + + * passes.c (init_optimization_passes): introduce macros + INSERT_PASSES_AFTER, PUSH_INSERT_PASSES_WITHIN, POP_INSERT_PASSES, + TERMINATE_PASS_LIST when constructing the tree of passes + 2013-04-19 Vladimir Makarov PR rtl-optimization/56847 diff --git a/gcc/passes.c b/gcc/passes.c index 47dca56..de6f259 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -1277,13 +1277,26 @@ init_optimization_passes (void) { struct opt_pass **p; +#define INSERT_PASSES_AFTER(PASS) \ + p = &(PASS); + +#define PUSH_INSERT_PASSES_WITHIN(PASS) \ + { \ + struct opt_pass **p = &(PASS).pass.sub; + +#define POP_INSERT_PASSES() \ + } + #define NEXT_PASS(PASS) (p = next_pass_1 (p, &((PASS).pass))) +#define TERMINATE_PASS_LIST() \ + *p = NULL; + /* All passes needed to lower the function into shape optimizers can operate on. These passes are always run first on the function, but backend might produce already lowered functions that are not processed by these passes. */ - p = &all_lowering_passes; + INSERT_PASSES_AFTER (all_lowering_passes) NEXT_PASS (pass_warn_unused_result); NEXT_PASS (pass_diagnose_omp_blocks); NEXT_PASS (pass_diagnose_tm_blocks); @@ -1296,15 +1309,14 @@ init_optimization_passes (void) NEXT_PASS (pass_build_cfg); NEXT_PASS (pass_warn_function_return); NEXT_PASS (pass_build_cgraph_edges); - *p = NULL; + TERMINATE_PASS_LIST () /* Interprocedural optimization passes. */ - p = &all_small_ipa_passes; + INSERT_PASSES_AFTER (all_small_ipa_passes) NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_ipa_function_and_variable_visibility); NEXT_PASS (pass_early_local_passes); - { - struct opt_pass **p = &pass_early_local_passes.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_early_local_passes) NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_expand_omp); @@ -1315,8 +1327,7 @@ init_optimization_passes (void) NEXT_PASS (pass_inline_parameters); NEXT_PASS (pass_early_inline); NEXT_PASS (pass_all_early_optimizations); - { - struct opt_pass **p = &pass_all_early_optimizations.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations) NEXT_PASS (pass_remove_cgraph_callee_edges); NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_ccp); @@ -1341,23 +1352,22 @@ init_optimization_passes (void) early optimizations again. It is thus good idea to do this late. */ NEXT_PASS (pass_split_functions); - } + POP_INSERT_PASSES () NEXT_PASS (pass_release_ssa_names); NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_inline_parameters); - } + POP_INSERT_PASSES () NEXT_PASS (pass_ipa_free_inline_summary); NEXT_PASS (pass_ipa_tree_profile); - { - struct opt_pass **p = &pass_ipa_tree_profile.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile) NEXT_PASS (pass_feedback_split_functions); - } + POP_INSERT_PASSES () NEXT_PASS (pass_ipa_increase_alignment); NEXT_PASS (pass_ipa_tm); NEXT_PASS (pass_ipa_lower_emutls); - *p = NULL; + TERMINATE_PASS_LIST () - p = &all_regular_ipa_passes; + INSERT_PASSES_AFTER (all_regular_ipa_passes) NEXT_PASS (pass_ipa_whole_program_visibility); NEXT_PASS (pass_ipa_profile); NEXT_PASS (pass_ipa_cp); @@ -1365,28 +1375,27 @@ init_optimization_passes (void) NEXT_PASS (pass_ipa_inline); NEXT_PASS (pass_ipa_pure_const); NEXT_PASS (pass_ipa_reference); - *p = NULL; + TERMINATE_PASS_LIST () - p = &all_lto_gen_passes; + INSERT_PASSES_AFTER (all_lto_gen_passes) NEXT_PASS (pass_ipa_lto_gimple_out); NEXT_PASS (pass_ipa_lto_finish_out); /* This must be the last LTO pass. */ - *p = NULL; + TERMINATE_PASS_LIST () /* Simple IPA passes executed after the regular passes. In WHOPR mode the passes are executed after partitioning and thus see just parts of the compiled unit. */ - p = &all_late_ipa_passes; + INSERT_PASSES_AFTER (all_late_ipa_passes) NEXT_PASS (pass_ipa_pta); - *p = NULL; + TERMINATE_PASS_LIST () /* These passes are run after IPA passes on every function that is being output to the assembler file. */ - p = &all_passes; + INSERT_PASSES_AFTER (all_passes) NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_lower_eh_dispatch); NEXT_PASS (pass_all_optimizations); - { - struct opt_pass **p = &pass_all_optimizations.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations) NEXT_PASS (pass_remove_cgraph_callee_edges); /* Initial scalar cleanups before alias computation. They ensure memory accesses are not indirect wherever possible. */ @@ -1448,8 +1457,7 @@ init_optimization_passes (void) NEXT_PASS (pass_asan); NEXT_PASS (pass_tsan); NEXT_PASS (pass_tree_loop); - { - struct opt_pass **p = &pass_tree_loop.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_tree_loop) NEXT_PASS (pass_tree_loop_init); NEXT_PASS (pass_lim); NEXT_PASS (pass_copy_prop); @@ -1461,20 +1469,18 @@ init_optimization_passes (void) NEXT_PASS (pass_loop_distribution); NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_graphite); - { - struct opt_pass **p = &pass_graphite.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_graphite) NEXT_PASS (pass_graphite_transforms); NEXT_PASS (pass_lim); NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_dce_loop); - } + POP_INSERT_PASSES () NEXT_PASS (pass_iv_canon); NEXT_PASS (pass_if_conversion); NEXT_PASS (pass_vectorize); - { - struct opt_pass **p = &pass_vectorize.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_vectorize) NEXT_PASS (pass_dce_loop); - } + POP_INSERT_PASSES () NEXT_PASS (pass_predcom); NEXT_PASS (pass_complete_unroll); NEXT_PASS (pass_slp_vectorize); @@ -1483,7 +1489,7 @@ init_optimization_passes (void) NEXT_PASS (pass_iv_optimize); NEXT_PASS (pass_lim); NEXT_PASS (pass_tree_loop_done); - } + POP_INSERT_PASSES () NEXT_PASS (pass_lower_vector_ssa); NEXT_PASS (pass_cse_reciprocals); NEXT_PASS (pass_reassoc); @@ -1518,10 +1524,9 @@ init_optimization_passes (void) NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_uncprop); NEXT_PASS (pass_local_pure_const); - } + POP_INSERT_PASSES () NEXT_PASS (pass_all_optimizations_g); - { - struct opt_pass **p = &pass_all_optimizations_g.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations_g) NEXT_PASS (pass_remove_cgraph_callee_edges); NEXT_PASS (pass_strip_predict_hints); /* Lower remaining pieces of GIMPLE. */ @@ -1545,14 +1550,13 @@ init_optimization_passes (void) NEXT_PASS (pass_late_warn_uninitialized); NEXT_PASS (pass_uncprop); NEXT_PASS (pass_local_pure_const); - } + POP_INSERT_PASSES () NEXT_PASS (pass_tm_init); - { - struct opt_pass **p = &pass_tm_init.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_tm_init) NEXT_PASS (pass_tm_mark); NEXT_PASS (pass_tm_memopt); NEXT_PASS (pass_tm_edges); - } + POP_INSERT_PASSES () NEXT_PASS (pass_lower_vector); NEXT_PASS (pass_lower_complex_O0); NEXT_PASS (pass_asan_O0); @@ -1567,8 +1571,7 @@ init_optimization_passes (void) NEXT_PASS (pass_expand); NEXT_PASS (pass_rest_of_compilation); - { - struct opt_pass **p = &pass_rest_of_compilation.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_rest_of_compilation) NEXT_PASS (pass_instantiate_virtual_regs); NEXT_PASS (pass_into_cfg_layout_mode); NEXT_PASS (pass_jump); @@ -1588,16 +1591,15 @@ init_optimization_passes (void) sooner, but we want the profile feedback to work more efficiently. */ NEXT_PASS (pass_loop2); - { - struct opt_pass **p = &pass_loop2.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_loop2) NEXT_PASS (pass_rtl_loop_init); NEXT_PASS (pass_rtl_move_loop_invariants); NEXT_PASS (pass_rtl_unswitch); NEXT_PASS (pass_rtl_unroll_and_peel_loops); NEXT_PASS (pass_rtl_doloop); NEXT_PASS (pass_rtl_loop_done); - *p = NULL; - } + TERMINATE_PASS_LIST () + POP_INSERT_PASSES () NEXT_PASS (pass_web); NEXT_PASS (pass_rtl_cprop); NEXT_PASS (pass_cse2); @@ -1622,8 +1624,7 @@ init_optimization_passes (void) NEXT_PASS (pass_ira); NEXT_PASS (pass_reload); NEXT_PASS (pass_postreload); - { - struct opt_pass **p = &pass_postreload.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_postreload) NEXT_PASS (pass_postreload_cse); NEXT_PASS (pass_gcse2); NEXT_PASS (pass_split_after_reload); @@ -1645,11 +1646,10 @@ init_optimization_passes (void) NEXT_PASS (pass_split_before_sched2); NEXT_PASS (pass_sched2); NEXT_PASS (pass_stack_regs); - { - struct opt_pass **p = &pass_stack_regs.pass.sub; + PUSH_INSERT_PASSES_WITHIN (pass_stack_regs) NEXT_PASS (pass_split_before_regstack); NEXT_PASS (pass_stack_regs_run); - } + POP_INSERT_PASSES () NEXT_PASS (pass_compute_alignments); NEXT_PASS (pass_duplicate_computed_gotos); NEXT_PASS (pass_variable_tracking); @@ -1663,13 +1663,17 @@ init_optimization_passes (void) NEXT_PASS (pass_set_nothrow_function_flags); NEXT_PASS (pass_dwarf2_frame); NEXT_PASS (pass_final); - } + POP_INSERT_PASSES () NEXT_PASS (pass_df_finish); - } + POP_INSERT_PASSES () NEXT_PASS (pass_clean_state); - *p = NULL; + TERMINATE_PASS_LIST () +#undef INSERT_PASSES_AFTER +#undef PUSH_INSERT_PASSES_WITHIN +#undef POP_INSERT_PASSES #undef NEXT_PASS +#undef TERMINATE_PASS_LIST /* Register the passes with the tree dump code. */ register_dump_files (all_lowering_passes, PROP_gimple_any);