From patchwork Thu Oct 27 23:33:56 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikael Morin X-Patchwork-Id: 122318 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 78809B6F62 for ; Fri, 28 Oct 2011 10:36:57 +1100 (EST) Received: (qmail 3465 invoked by alias); 27 Oct 2011 23:36:17 -0000 Received: (qmail 5948 invoked by uid 22791); 27 Oct 2011 23:34:13 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL, BAYES_20, RP_MATCHES_RCVD, TW_TM X-Spam-Check-By: sourceware.org Received: from smtp25.services.sfr.fr (HELO smtp25.services.sfr.fr) (93.17.128.120) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 27 Oct 2011 23:33:58 +0000 Received: from filter.sfr.fr (localhost [127.0.0.1]) by msfrf2512.sfr.fr (SMTP Server) with ESMTP id 4BC9E7000054; Fri, 28 Oct 2011 01:33:57 +0200 (CEST) Received: from gimli.local (145.15.72.86.rev.sfr.net [86.72.15.145]) by msfrf2512.sfr.fr (SMTP Server) with ESMTP id EDB157000040; Fri, 28 Oct 2011 01:33:56 +0200 (CEST) X-SFR-UUID: 20111027233356973.EDB157000040@msfrf2512.sfr.fr MIME-Version: 1.0 From: Mikael Morin To: gfortran , GCC patches Message-ID: <20111027233356.18581.91526@gimli.local> In-Reply-To: <20111027233339.18581.86093@gimli.local> References: <20111027232818.18581.901@gimli.local> <20111027233339.18581.86093@gimli.local> Subject: [Patch, fortran] [64/66] inline sum and product: Inline sum: Change loop use. Date: Fri, 28 Oct 2011 01:33:56 +0200 (CEST) X-IsSubscribed: yes 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 In the non-scalar case the scalarizer needs to take code out of the outer loop, which means that the inner one (the "sum" loop) has already been handled before entering gfc_conv_intrinsic_arith, which means loop shall be a pointer to that loop instead of the address of the local loop in that case. This patch changes local loop uses with a pointer loop use (which is initialized to the local loop for now). OK? 2011-10-19 Mikael Morin * trans-intrinsic.c (gfc_conv_intrinsic.c): Introduce current loop pointer. Use it. diff --git a/trans-intrinsic.c b/trans-intrinsic.c index b701502..f7b1041 100644 --- a/trans-intrinsic.c +++ b/trans-intrinsic.c @@ -2568,7 +2568,7 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, stmtblock_t body; stmtblock_t block; tree tmp; - gfc_loopinfo loop; + gfc_loopinfo loop, *ploop; gfc_actual_arglist *arg_array, *arg_mask; gfc_ss *arrayss; gfc_ss *maskss; @@ -2646,14 +2646,16 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, gfc_mark_ss_chain_used (arrayss, 1); if (maskexpr && maskexpr->rank > 0) gfc_mark_ss_chain_used (maskss, 1); + + ploop = &loop; /* Generate the loop body. */ - gfc_start_scalarized_body (&loop, &body); + gfc_start_scalarized_body (ploop, &body); /* If we have a mask, only add this element if the mask is set. */ if (maskexpr && maskexpr->rank > 0) { gfc_init_se (&maskse, NULL); - gfc_copy_loopinfo_to_se (&maskse, &loop); + gfc_copy_loopinfo_to_se (&maskse, ploop); maskse.ss = maskss; gfc_conv_expr_val (&maskse, maskexpr); gfc_add_block_to_block (&body, &maskse.pre); @@ -2665,7 +2667,7 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, /* Do the actual summation/product. */ gfc_init_se (&arrayse, NULL); - gfc_copy_loopinfo_to_se (&arrayse, &loop); + gfc_copy_loopinfo_to_se (&arrayse, ploop); arrayse.ss = arrayss; gfc_conv_expr_val (&arrayse, arrayexpr); gfc_add_block_to_block (&block, &arrayse.pre); @@ -2753,7 +2755,7 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, tmp = gfc_finish_block (&block); gfc_add_expr_to_block (&body, tmp); - gfc_trans_scalarizing_loops (&loop, &body); + gfc_trans_scalarizing_loops (ploop, &body); /* For a scalar mask, enclose the loop in an if statement. */ if (maskexpr && maskexpr->rank == 0) @@ -2761,8 +2763,8 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, gfc_init_se (&maskse, NULL); gfc_conv_expr_val (&maskse, maskexpr); gfc_init_block (&block); - gfc_add_block_to_block (&block, &loop.pre); - gfc_add_block_to_block (&block, &loop.post); + gfc_add_block_to_block (&block, &ploop->pre); + gfc_add_block_to_block (&block, &ploop->post); tmp = gfc_finish_block (&block); tmp = build3_v (COND_EXPR, maskse.expr, tmp, @@ -2772,11 +2774,11 @@ gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, enum tree_code op, } else { - gfc_add_block_to_block (&se->pre, &loop.pre); - gfc_add_block_to_block (&se->pre, &loop.post); + gfc_add_block_to_block (&se->pre, &ploop->pre); + gfc_add_block_to_block (&se->pre, &ploop->post); } - gfc_cleanup_loop (&loop); + gfc_cleanup_loop (ploop); if (norm2) {