From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21525 invoked by alias); 23 Aug 2012 07:37:58 -0000 Received: (qmail 21207 invoked by uid 22791); 23 Aug 2012 07:37:54 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,TW_TM X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 23 Aug 2012 07:37:40 +0000 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 0D58D99430; Thu, 23 Aug 2012 09:37:39 +0200 (CEST) Date: Thu, 23 Aug 2012 07:37:00 -0000 From: Richard Guenther To: Steven Bosscher Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH][RFC] Virtual operands in loop-closed SSA form In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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: 2012-08/txt/msg01550.txt.bz2 On Wed, 22 Aug 2012, Steven Bosscher wrote: > On Wed, Aug 22, 2012 at 3:01 PM, Richard Guenther wrote: > > > > While we should already be in loop-closed SSA form for virtual > > operands most of the time (because we have a virtual use at > > the return statement) and loop-closed SSA form for virtuals > > is cheap (we only have a single virtual operand now) the following > > makes sure that a loop-closed PHI node for virtuals does exist. > > Make sense. I think it would be good to add an explanation of what > this means in the comment before rewrite_into_loop_closed_ssa, because > "liveness" of a memory reference isn't as obvious as that of an ssa > register. > > Did you try this with the header-copying change from PR46590 to make > it do only TODO_update_ssa_no_phi? Yes, but it didn't help :( The following is the patch I am applying, bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2012-08-23 Richard Guenther * tree-ssa-loop-manip.c (add_exit_phis_var): Allow virtual operands. (find_uses_to_rename_use): Likewise. (find_uses_to_rename_bb): Likewise. (find_uses_to_rename_stmt): Walk over all operands. Index: gcc/tree-ssa-loop-manip.c =================================================================== *** gcc/tree-ssa-loop-manip.c.orig 2012-08-22 15:02:02.000000000 +0200 --- gcc/tree-ssa-loop-manip.c 2012-08-23 09:14:02.141575345 +0200 *************** add_exit_phis_var (tree var, bitmap use_ *** 303,310 **** basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var)); bitmap live_exits = BITMAP_ALLOC (&loop_renamer_obstack); ! gcc_checking_assert (! virtual_operand_p (var)); ! gcc_assert (! bitmap_bit_p (use_blocks, def_bb->index)); compute_live_loop_exits (live_exits, use_blocks, loop_exits, def_bb); --- 303,309 ---- basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var)); bitmap live_exits = BITMAP_ALLOC (&loop_renamer_obstack); ! gcc_checking_assert (! bitmap_bit_p (use_blocks, def_bb->index)); compute_live_loop_exits (live_exits, use_blocks, loop_exits, def_bb); *************** find_uses_to_rename_use (basic_block bb, *** 367,376 **** if (TREE_CODE (use) != SSA_NAME) return; - /* We don't need to keep virtual operands in loop-closed form. */ - if (virtual_operand_p (use)) - return; - ver = SSA_NAME_VERSION (use); def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); if (!def_bb) --- 366,371 ---- *************** find_uses_to_rename_stmt (gimple stmt, b *** 408,414 **** if (is_gimple_debug (stmt)) return; ! FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE) find_uses_to_rename_use (bb, var, use_blocks, need_phis); } --- 403,409 ---- if (is_gimple_debug (stmt)) return; ! FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_USES) find_uses_to_rename_use (bb, var, use_blocks, need_phis); } *************** find_uses_to_rename_bb (basic_block bb, *** 428,436 **** for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi)) { gimple phi = gsi_stmt (bsi); ! if (! virtual_operand_p (gimple_phi_result (phi))) ! find_uses_to_rename_use (bb, PHI_ARG_DEF_FROM_EDGE (phi, e), ! use_blocks, need_phis); } for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) --- 423,430 ---- for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi)) { gimple phi = gsi_stmt (bsi); ! find_uses_to_rename_use (bb, PHI_ARG_DEF_FROM_EDGE (phi, e), ! use_blocks, need_phis); } for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) *************** find_uses_to_rename (bitmap changed_bbs, *** 474,479 **** --- 468,476 ---- 1) Updating it during unrolling/peeling/versioning is trivial, since we do not need to care about the uses outside of the loop. + The same applies to virtual operands which are also rewritten into + loop closed SSA form. Note that virtual operands are always live + until function exit. 2) The behavior of all uses of an induction variable is the same. Without this, you need to distinguish the case when the variable is used outside of the loop it is defined in, for example