From patchwork Wed Dec 21 18:48:04 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernd Schmidt X-Patchwork-Id: 132705 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]) by ozlabs.org (Postfix) with SMTP id A7EFEB7113 for ; Thu, 22 Dec 2011 05:48:31 +1100 (EST) Received: (qmail 7453 invoked by alias); 21 Dec 2011 18:48:28 -0000 Received: (qmail 7306 invoked by uid 22791); 21 Dec 2011 18:48:23 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, FROM_12LTRDOM X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 21 Dec 2011 18:48:08 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1RdRCx-0004e4-Hz from Bernd_Schmidt@mentor.com for gcc-patches@gcc.gnu.org; Wed, 21 Dec 2011 10:48:07 -0800 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 21 Dec 2011 10:47:31 -0800 Received: from [127.0.0.1] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.1.289.1; Wed, 21 Dec 2011 18:48:05 +0000 Message-ID: <4EF229E4.6080801@codesourcery.com> Date: Wed, 21 Dec 2011 19:48:04 +0100 From: Bernd Schmidt User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.20) Gecko/20110920 Lightning/1.0b3pre Thunderbird/3.1.12 MIME-Version: 1.0 To: GCC Patches Subject: Add an extra reload dump file 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 IRA can make quite a lot of changes to the RTL, but the debugging dumps are not very helpful as the .ira dump is produced after reload has run. The patch below splits off reload into its own pass so that we get two separate dump files. This makes debugging certain classes of problems a lot easier. Bootstrapped and regression tested on i686-linux. Ok? Bernd * tree-pass.h (pass_reload): Declare. * ira.c (overall_cost_before, saved_flag_ira_share_spill_slots): New global variables, moved out of ira. (do_reload): New static function, split off from the second half of ... (ira): ... here. (gate_true): Renamed from gate_ira. All uses changed. (pass_ira): Use TV_IRA, and set flags to TODO_dump_func. (rest_of_handle_reload): New static function. (pass_reload): New. Index: tree-pass.h =================================================================== --- tree-pass.h (revision 182544) +++ tree-pass.h (working copy) @@ -541,6 +541,7 @@ extern struct rtl_opt_pass pass_mode_swi extern struct rtl_opt_pass pass_sms; extern struct rtl_opt_pass pass_sched; extern struct rtl_opt_pass pass_ira; +extern struct rtl_opt_pass pass_reload; extern struct rtl_opt_pass pass_postreload; extern struct rtl_opt_pass pass_clean_state; extern struct rtl_opt_pass pass_branch_prob; Index: ira.c =================================================================== --- ira.c (revision 182544) +++ ira.c (working copy) @@ -406,11 +406,12 @@ int ira_spilled_reg_stack_slots_num; stack slots used in current function so far. */ struct ira_spilled_reg_stack_slot *ira_spilled_reg_stack_slots; -/* Correspondingly overall cost of the allocation, cost of the - allocnos assigned to hard-registers, cost of the allocnos assigned - to memory, cost of loads, stores and register move insns generated - for pseudo-register live range splitting (see ira-emit.c). */ -int ira_overall_cost; +/* Correspondingly overall cost of the allocation, overall cost before + reload, cost of the allocnos assigned to hard-registers, cost of + the allocnos assigned to memory, cost of loads, stores and register + move insns generated for pseudo-register live range splitting (see + ira-emit.c). */ +int ira_overall_cost, overall_cost_before; int ira_reg_cost, ira_mem_cost; int ira_load_cost, ira_store_cost, ira_shuffle_cost; int ira_move_loops_num, ira_additional_jumps_num; @@ -3521,19 +3522,17 @@ struct loops ira_loops; mode or when the conflict table is too big. */ bool ira_conflicts_p; +/* Saved between IRA and reload. */ +static int saved_flag_ira_share_spill_slots; + /* This is the main entry of IRA. */ static void ira (FILE *f) { - int overall_cost_before, allocated_reg_info_size; + int allocated_reg_info_size; bool loops_p; int max_regno_before_ira, ira_max_point_before_emit; int rebuild_p; - int saved_flag_ira_share_spill_slots; - basic_block bb; - bool need_dce; - - timevar_push (TV_IRA); if (flag_caller_saves) init_caller_save (); @@ -3715,17 +3714,22 @@ ira (FILE *f) max_regno * sizeof (struct ira_spilled_reg_stack_slot)); } allocate_initial_values (reg_equivs); +} - timevar_pop (TV_IRA); +static void +do_reload (void) +{ + basic_block bb; + bool need_dce; + + if (flag_ira_verbose < 10 && dump_file) + ira_dump_file = dump_file; - timevar_push (TV_RELOAD); df_set_flags (DF_NO_INSN_RESCAN); build_insn_chain (); need_dce = reload (get_insns (), ira_conflicts_p); - timevar_pop (TV_RELOAD); - timevar_push (TV_IRA); if (ira_conflicts_p) @@ -3733,7 +3737,6 @@ ira (FILE *f) ira_free (ira_spilled_reg_stack_slots); ira_finish_assign (); - } if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL && overall_cost_before != ira_overall_cost) @@ -3782,11 +3785,9 @@ ira (FILE *f) timevar_pop (TV_IRA); } - - static bool -gate_ira (void) +gate_true (void) { return true; } @@ -3804,16 +3805,42 @@ struct rtl_opt_pass pass_ira = { RTL_PASS, "ira", /* name */ - gate_ira, /* gate */ + gate_true, /* gate */ rest_of_handle_ira, /* execute */ NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ - TV_NONE, /* tv_id */ + TV_IRA, /* tv_id */ 0, /* properties_required */ 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_ggc_collect /* todo_flags_finish */ + TODO_dump_func /* todo_flags_finish */ + } +}; + +static unsigned int +rest_of_handle_reload (void) +{ + do_reload (); + return 0; +} + +struct rtl_opt_pass pass_reload = +{ + { + RTL_PASS, + "reload", /* name */ + gate_true, /* gate */ + rest_of_handle_reload, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_RELOAD, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */ } }; Index: passes.c =================================================================== --- passes.c (revision 182544) +++ passes.c (working copy) @@ -1484,6 +1484,7 @@ init_optimization_passes (void) NEXT_PASS (pass_sms); NEXT_PASS (pass_sched); NEXT_PASS (pass_ira); + NEXT_PASS (pass_reload); NEXT_PASS (pass_postreload); { struct opt_pass **p = &pass_postreload.pass.sub;