From patchwork Fri Dec 2 15:46:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Vehreschild X-Patchwork-Id: 86319 Delivered-To: patch@linaro.org Received: by 10.182.112.6 with SMTP id im6csp388841obb; Fri, 2 Dec 2016 07:47:20 -0800 (PST) X-Received: by 10.99.176.14 with SMTP id h14mr80318244pgf.22.1480693640029; Fri, 02 Dec 2016 07:47:20 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id w190si5725916pfb.30.2016.12.02.07.47.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Dec 2016 07:47:20 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-443345-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-443345-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-443345-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=Z+CctbqzdO26y3fzvWaMLXGi9dkELBumZtVY+FUq/ABNNgZIdNfAM LG2k+Vvh0jdJaR83lLfXb0QJ3lwIMA/Ft759kHjk7CrJzgvjrCqUNBeYAlBZQewc ioP9PQbKr04CwN9xWnIblS7mMh3qwAPinHmH0Vfb8RRgFkaO5HrS0Y= 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:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=T9D8xXpb+jV6eq3/Be72JlBJmjs=; b=xVLL9QeBkJH1IV9SsgRj iULv5W/jcygxNjMjveCGOq/EE8ogF42OgAfhQqtqGFJuIhDamJgWOAYIRLVhUJQS t6JY8tJB2ObGFu8hPUUuO9T8MrLvs8b1EfudFKNKMFDx2P0k6An7ARXflpIE/xp7 0GaQCztU2U8zRyELgAW1Wdk= Received: (qmail 71961 invoked by alias); 2 Dec 2016 15:46:49 -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 71886 invoked by uid 89); 2 Dec 2016 15:46:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=HTo:U*damian, UD:trans-stmt.c, trans-stmt.c, transstmtc X-Spam-User: qpsmtpd, 2 recipients X-HELO: mout.gmx.net Received: from mout.gmx.net (HELO mout.gmx.net) (212.227.15.18) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 02 Dec 2016 15:46:38 +0000 Received: from vepi2 ([92.76.205.227]) by mail.gmx.com (mrgmx003 [212.227.17.190]) with ESMTPSA (Nemesis) id 0MCcvy-1cMDi93Va6-009PLH; Fri, 02 Dec 2016 16:46:32 +0100 Date: Fri, 2 Dec 2016 16:46:29 +0100 From: Andre Vehreschild To: GCC-Patches-ML , GCC-Fortran-ML , Damian Rouson Subject: [PATCH, Fortran, pr78505, v1] [F08] Coarray source allocation not synchronizing on oversubscribed cores Message-ID: <20161202164629.7822c479@vepi2> MIME-Version: 1.0 X-UI-Out-Filterresults: notjunk:1; V01:K0:2jRkNCyvAv4=:n+5PTHHrk4zRml8n8I3b8v T0UzP3lTr6kzfW5Sj/hKDdq4qOCjntKbxRt7/1NlrtI5pqebOv9IAzSERrqZjtZgKKhyEQ99H AL3vyGHpOIpUmWXU64LahSquYR1KVtkGzSZas8psXanTQ0gtQPTvv3JNCvcCcJapnjQefSE+X M8K8E6FO1OLn44yNKXgIgTzNjBeCI5WcZONeUWPAhyIFMXwn0lovSFRq3wuosmTMCJyzQmomr jA7VaXrIElsttdLZsdlcDSowk9m/Mu2zBqolu9CimCJGhmjjUBYpgJZ4k6IBB9ahW/NenqXeD mXwnoSW3T6IuoprO+YkN+VqVfXtJXGxiHDB5JoX/tx/YO1FdHBk+JkksFwYlSh8NOHdqzKhjh bM66ktjsF3Zftgq4NpU6ExeX8jnBCu0ipZgThcAvMEo0ffwrlNISNmQBh+zuOJ+gJHGNho4Pi rixJA6u2w6KK7Muzdg76Woc/dXf0G7Hzyy/0+cXqbmQ+LDPhHSIMl/TtCztLdVBsviAyUetpu 7lmQrpvKwVDbbt+VQjwPH4GeIlOX4M4hKRgPjPfR3raU+PTp1NtlCOw2hXi+PV9hF5q3nAica ouOjiYAr1IiyQhDcPdv8/XgsqcqoPa140aHZeh5oWT1oFcvQHXfuTyPcUGIn04wmpBer2cs9S Hifyy2F+tKoiTuSl/oFy34CUAKpV6ws8tynQJql3o7qp+R9gQWsJBoheszfa6of70/yH5PB0B Sv7qeUzzji5A8zYB+1kARWPyGImk2mSQAZ6ea1nbsFTxQSMBAd8Y+2/IXrw= Hi all, attached patch adds a call to sync_all after an ALLOCATE allocating a coarray. This is to adhere to standard wanting: ..., execution of the segment (11.6.2) following the statement is delayed until all other active images in the current team have executed the same statement the same number of times in this team. This, esp. the "statement", means that assigning the SOURCE= is to come before the sync all, which means we have to do it explicitly after that assignment. Or the other way around the sync all can be done in library caf_register(). Bootstraps and regtests ok on x86_64-linux/F23. Ok for trunk? Regards, Andre -- Andre Vehreschild * Email: vehre ad gmx dot de gcc/fortran/ChangeLog: 2016-12-02 Andre Vehreschild PR fortran/78505 * trans-stmt.c (gfc_trans_allocate): Add sync all after the execution of the whole allocate-statement to adhere to the standard. gcc/testsuite/ChangeLog: 2016-12-02 Andre Vehreschild PR fortran/78505 * gfortran.dg/coarray_alloc_with_implicit_sync_1.f90: New test. diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 514db28..2219bcc 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -5506,7 +5506,7 @@ gfc_trans_allocate (gfc_code * code) stmtblock_t block; stmtblock_t post; tree nelems; - bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set; + bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set, is_coarray ; gfc_symtree *newsym = NULL; if (!code->ext.alloc.list) @@ -5516,6 +5516,7 @@ gfc_trans_allocate (gfc_code * code) expr3 = expr3_vptr = expr3_len = expr3_esize = NULL_TREE; label_errmsg = label_finish = errmsg = errlen = NULL_TREE; e3_is = E3_UNSET; + is_coarray = false; gfc_init_block (&block); gfc_init_block (&post); @@ -5555,8 +5556,9 @@ gfc_trans_allocate (gfc_code * code) expression. */ if (code->expr3) { - bool vtab_needed = false, temp_var_needed = false, - is_coarray = gfc_is_coarray (code->expr3); + bool vtab_needed = false, temp_var_needed = false; + + is_coarray = gfc_is_coarray (code->expr3); /* Figure whether we need the vtab from expr3. */ for (al = code->ext.alloc.list; !vtab_needed && al != NULL; @@ -6093,6 +6095,9 @@ gfc_trans_allocate (gfc_code * code) tree caf_decl, token; gfc_se caf_se; + /* Set flag, to add synchronize after the allocate. */ + is_coarray = true; + gfc_init_se (&caf_se, NULL); caf_decl = gfc_get_tree_for_caf_expr (expr); @@ -6114,6 +6119,11 @@ gfc_trans_allocate (gfc_code * code) } else { + /* Allocating coarrays needs a sync after the allocate executed. + Set the flag to add the sync after all objects are allocated. */ + is_coarray = is_coarray || (gfc_caf_attr (expr).codimension + && flag_coarray == GFC_FCOARRAY_LIB); + if (expr->ts.type == BT_CHARACTER && al_len != NULL_TREE && expr3_len != NULL_TREE) { @@ -6357,6 +6367,15 @@ gfc_trans_allocate (gfc_code * code) gfc_add_modify (&block, se.expr, tmp); } + if (is_coarray && flag_coarray == GFC_FCOARRAY_LIB) + { + /* Add a sync all after the allocation has been executed. */ + tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_sync_all, + 3, null_pointer_node, null_pointer_node, + integer_zero_node); + gfc_add_expr_to_block (&post, tmp); + } + gfc_add_block_to_block (&block, &se.post); gfc_add_block_to_block (&block, &post); diff --git a/gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 b/gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 new file mode 100644 index 0000000..1dbbcb7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original -fcoarray=lib" } +! Check that allocating a coarray adds an implicit sync all. + + implicit none + integer, allocatable :: f(:)[:] + allocate( f(20)[*], source = 1 ) +end + +! { dg-final { scan-tree-dump-times "_gfortran_caf_sync_all \\(" 1 "original" } }