From patchwork Thu Oct 27 23:32:14 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikael Morin X-Patchwork-Id: 122300 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 ED0DC1007D8 for ; Fri, 28 Oct 2011 10:34:47 +1100 (EST) Received: (qmail 9330 invoked by alias); 27 Oct 2011 23:34:34 -0000 Received: (qmail 25537 invoked by uid 22791); 27 Oct 2011 23:32:33 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL, BAYES_00, 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:32:16 +0000 Received: from filter.sfr.fr (localhost [127.0.0.1]) by msfrf2512.sfr.fr (SMTP Server) with ESMTP id E65787000040; Fri, 28 Oct 2011 01:32:14 +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 4B51070000AC; Fri, 28 Oct 2011 01:32:14 +0200 (CEST) X-SFR-UUID: 20111027233214308.4B51070000AC@msfrf2512.sfr.fr MIME-Version: 1.0 From: Mikael Morin To: gfortran , GCC patches Message-ID: <20111027233214.18581.41687@gimli.local> In-Reply-To: <20111027233144.18581.30688@gimli.local> References: <20111027232818.18581.901@gimli.local> <20111027233144.18581.30688@gimli.local> Subject: [Patch, fortran] [35..39/66] inline sum and product: Update the scalarizer: New gfc_ss::loop field. Date: Fri, 28 Oct 2011 01:32:14 +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 To avoid confusion between multiple loops, a new loop field is added to the gfc_ss (patch 35). Then we can remove superfluous loop argument in function interfaces: - set_vector_loop_bounds (patch 36) - gfc_trans_array_constructor (patch 37) - gfc_trans_create_temp_array (patch 39) Patch 38 prepares patch 39 by adding a new variable total_dim which will be the sum of multiple nested loop dimensions so that the number of loop usages (through loop.dimen) is reduced. OK? 2011-10-19 Mikael Morin * trans.h (struct gfc_ss): New field loop. * trans-array.c (set_ss_loop): New function. (gfc_add_ss_to_loop): Call set_ss_loop. 2011-10-19 Mikael Morin * trans-array.c (gfc_set_vector_loop_bounds): Get loop from ss. Remove loop argument. (gfc_add_loop_ss_code): Update call. 2011-10-19 Mikael Morin * trans-array.c (gfc_trans_array_constructor, trans_array_constructor): Rename the former to the later. Get loop from ss. Remove loop argument. (gfc_add_loop_ss_code): Update call. 2011-10-19 Mikael Morin * trans-array.c (gfc_trans_create_temp_array): New variable total_dim. Set total_dim to loop's rank. Replace usages of loop's rank. 2011-10-19 Mikael Morin * trans-array.h (gfc_trans_create_temp_array): Remove loop argument. * trans-array.c (gfc_trans_create_temp_array): Get loop from ss. Update reference to loop. Remove loop argument. (gfc_trans_array_constructor, gfc_conv_loop_setup): Update calls to gfc_trans_create_temp_array. * trans-expr.c (gfc_conv_procedure_call): Ditto. * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Ditto. * trans-stmt.c (gfc_conv_elemental_dependencies): Ditto. Set loop before calling gfc_trans_create_temp_array. diff --git a/trans-array.c b/trans-array.c index b2388c1..d386a22 100644 --- a/trans-array.c +++ b/trans-array.c @@ -888,15 +888,14 @@ get_array_ref_dim (gfc_ss *ss, int loop_dim) callee allocated array. PRE, POST, INITIAL, DYNAMIC and DEALLOC are as for - gfc_trans_allocate_array_storage. - */ + gfc_trans_allocate_array_storage. */ tree -gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, - gfc_loopinfo * loop, gfc_ss * ss, +gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss, tree eltype, tree initial, bool dynamic, bool dealloc, bool callee_alloc, locus * where) { + gfc_loopinfo *loop; gfc_array_info *info; tree from[GFC_MAX_DIMENSIONS], to[GFC_MAX_DIMENSIONS]; tree type; @@ -915,11 +914,12 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, info = &ss->info->data.array; gcc_assert (ss->dimen > 0); - gcc_assert (loop->dimen == ss->dimen); + gcc_assert (ss->loop->dimen == ss->dimen); if (gfc_option.warn_array_temp && where) gfc_warning ("Creating array temporary at %L", where); + loop = ss->loop; total_dim = loop->dimen; /* Set the lower bound to zero. */ for (n = 0; n < loop->dimen; n++) @@ -1065,8 +1065,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_trans_allocate_array_storage (pre, post, info, size, nelem, initial, dynamic, dealloc); - if (ss->dimen > loop->temp_dim) - loop->temp_dim = ss->dimen; + if (ss->dimen > ss->loop->temp_dim) + ss->loop->temp_dim = ss->dimen; return size; } @@ -2113,8 +2113,8 @@ trans_array_constructor (gfc_ss * ss, locus * where) if (TREE_CODE (loop->to[0]) == VAR_DECL) dynamic = true; - gfc_trans_create_temp_array (&loop->pre, &loop->post, loop, ss, - type, NULL_TREE, dynamic, true, false, where); + gfc_trans_create_temp_array (&loop->pre, &loop->post, ss, type, NULL_TREE, + dynamic, true, false, where); desc = ss_info->data.array.descriptor; offset = gfc_index_zero_node; @@ -4211,9 +4211,8 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) gcc_assert (tmp_ss->dimen != 0); - gfc_trans_create_temp_array (&loop->pre, &loop->post, loop, - tmp_ss, tmp, NULL_TREE, - false, true, false, where); + gfc_trans_create_temp_array (&loop->pre, &loop->post, tmp_ss, tmp, + NULL_TREE, false, true, false, where); } /* For array parameters we don't have loop variables, so don't calculate the diff --git a/trans-array.h b/trans-array.h index 57805b6..aad8c47 100644 --- a/trans-array.h +++ b/trans-array.h @@ -31,9 +31,8 @@ void gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping *, gfc_se *, gfc_array_spec *); /* Generate code to create a temporary array. */ -tree gfc_trans_create_temp_array (stmtblock_t *, stmtblock_t *, gfc_loopinfo *, - gfc_ss *, tree, tree, bool, bool, bool, - locus *); +tree gfc_trans_create_temp_array (stmtblock_t *, stmtblock_t *, gfc_ss *, + tree, tree, bool, bool, bool, locus *); /* Generate function entry code for allocation of compiler allocated array variables. */ diff --git a/trans-expr.c b/trans-expr.c index 01d4ca3..e091c89 100644 --- a/trans-expr.c +++ b/trans-expr.c @@ -3606,7 +3606,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, returns a pointer, the temporary will be a shallow copy and mustn't be deallocated. */ callee_alloc = comp->attr.allocatable || comp->attr.pointer; - gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, se->ss, + gfc_trans_create_temp_array (&se->pre, &se->post, se->ss, tmp, NULL_TREE, false, !comp->attr.pointer, callee_alloc, &se->ss->info->expr->where); @@ -3642,7 +3642,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, returns a pointer, the temporary will be a shallow copy and mustn't be deallocated. */ callee_alloc = sym->attr.allocatable || sym->attr.pointer; - gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, se->ss, + gfc_trans_create_temp_array (&se->pre, &se->post, se->ss, tmp, NULL_TREE, false, !sym->attr.pointer, callee_alloc, &se->ss->info->expr->where); diff --git a/trans-intrinsic.c b/trans-intrinsic.c index fcc59d7..c3a414b 100644 --- a/trans-intrinsic.c +++ b/trans-intrinsic.c @@ -5501,9 +5501,8 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr) /* Build a destination descriptor, using the pointer, source, as the data field. */ - gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, - se->ss, mold_type, NULL_TREE, false, true, false, - &expr->where); + gfc_trans_create_temp_array (&se->pre, &se->post, se->ss, mold_type, + NULL_TREE, false, true, false, &expr->where); /* Cast the pointer to the result. */ tmp = gfc_conv_descriptor_data_get (info->descriptor); diff --git a/trans-stmt.c b/trans-stmt.c index 86a56e8..2e02320 100644 --- a/trans-stmt.c +++ b/trans-stmt.c @@ -309,11 +309,10 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse, size = gfc_create_var (gfc_array_index_type, NULL); data = gfc_create_var (pvoid_type_node, NULL); gfc_init_block (&temp_post); - tmp = gfc_trans_create_temp_array (&se->pre, &temp_post, - &tmp_loop, ss, temptype, - initial, - false, true, false, - &arg->expr->where); + ss->loop = &tmp_loop; + tmp = gfc_trans_create_temp_array (&se->pre, &temp_post, ss, + temptype, initial, false, true, + false, &arg->expr->where); gfc_add_modify (&se->pre, size, tmp); tmp = fold_convert (pvoid_type_node, info->data); gfc_add_modify (&se->pre, data, tmp);