From patchwork Wed Jun 5 08:16:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 1110349 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-502358-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="i7/4TIa6"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45JhTc1L58z9s4Y for ; Wed, 5 Jun 2019 18:16:47 +1000 (AEST) 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:reply-to:mime-version:content-type; q=dns; s=default; b=xfcQY812NZ4lnqzULzFdsUNONicXI/H12dEeUEReX7U 91BOYv+oUJlh7AEBQ4Kja5R6gNiSh78P7jU8aRfb7biXJDfNweymfsaxoOfoXEaT RVXeTODXaXboId84oaeRKnSHJG22iCDQdM8I2q1CCyUelrdlwryL9Stb58jwEzmA = 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:reply-to:mime-version:content-type; s=default; bh=LBNSiOp1twWEK3N/B9GVcr2byTA=; b=i7/4TIa6H1aEQSEeI aQcaDhGG2MGXA5KSPeCeqpueNwtxLWF3INN/O56DScqfY72Tj+w0RzdLEDHaW3Xd kOUb0z610SFKHQ7uU1ZMW0+UnganRG4B8GvMgE1jbCqvTLlUOh6lo4bPaeJDYC25 28VwqFc/9i2D8kMNxiCrXLRNJI= Received: (qmail 85029 invoked by alias); 5 Jun 2019 08:16:39 -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 85012 invoked by uid 89); 5 Jun 2019 08:16:38 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-7.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=1104, sk:get_bas X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 05 Jun 2019 08:16:36 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 21E72B0CCB for ; Wed, 5 Jun 2019 08:16:35 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-116-52.ams2.redhat.com [10.36.116.52]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BEEAA3790 for ; Wed, 5 Jun 2019 08:16:34 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id x558GWRA005701 for ; Wed, 5 Jun 2019 10:16:33 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id x558GU06005700 for gcc-patches@gcc.gnu.org; Wed, 5 Jun 2019 10:16:30 +0200 Date: Wed, 5 Jun 2019 10:16:30 +0200 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [committed] Add support for lastprivate (conditional: ) with reference arguments Message-ID: <20190605081630.GZ19695@tucnak> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.11.3 (2019-02-01) X-IsSubscribed: yes Hi! The following patch fixes handling of references in lastprivate (conditional:). Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2019-06-05 Jakub Jelinek * omp-low.c (lower_rec_input_clauses): For lastprivate conditional references, lookup in in hash map MEM_REF operand instead of the MEM_REF itself. (lower_omp_1): When looking for lastprivate conditional assignments, handle MEM_REFs with REFERENCE_TYPE operands. * testsuite/libgomp.c++/lastprivate-conditional-1.C: New test. * testsuite/libgomp.c++/lastprivate-conditional-2.C: New test. Jakub --- gcc/omp-low.c.jj 2019-06-03 15:12:45.535613313 +0200 +++ gcc/omp-low.c 2019-06-03 17:57:42.060631242 +0200 @@ -4795,8 +4795,14 @@ lower_rec_input_clauses (tree clauses, g if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c)) { - tree v - = *ctx->lastprivate_conditional_map->get (new_var); + tree v = new_var; + if (!DECL_P (v)) + { + gcc_assert (TREE_CODE (v) == MEM_REF); + v = TREE_OPERAND (v, 0); + gcc_assert (DECL_P (v)); + } + v = *ctx->lastprivate_conditional_map->get (v); tree t = create_tmp_var (TREE_TYPE (v)); tree z = build_zero_cst (TREE_TYPE (v)); tree orig_v @@ -10835,6 +10841,11 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p else if (!up->lastprivate_conditional_map) break; tree lhs = get_base_address (gimple_assign_lhs (stmt)); + if (TREE_CODE (lhs) == MEM_REF + && DECL_P (TREE_OPERAND (lhs, 0)) + && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, + 0))) == REFERENCE_TYPE) + lhs = TREE_OPERAND (lhs, 0); if (DECL_P (lhs)) if (tree *v = up->lastprivate_conditional_map->get (lhs)) { --- libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C.jj 2019-06-03 17:09:39.808619044 +0200 +++ libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C 2019-06-03 17:28:00.612116989 +0200 @@ -0,0 +1,62 @@ +extern "C" void abort (); +int w; +struct S { int s, &t; S () : s (0), t (w) {}; void foo (short &); bool bar (int, int); void baz (short &); }; + +bool +S::bar (int i, int q) +{ + switch (q) + { + case 0: return (i % 17) == 7; + case 1: return (i % 19) == 2; + case 2: return (i % 23) == 5; + default: abort (); + } +} + +void +S::foo (short &x) +{ + #pragma omp for lastprivate (conditional: x, s, t) + for (int i = 0; i < 1025; ++i) + { + if (bar (i, 0)) + x = i; + if (bar (i, 1)) + s = i + 3; + if (bar (i, 2)) + t = i + 6; + } +} + +void +S::baz (short &x) +{ + #pragma omp parallel for lastprivate (conditional: x, s, t) collapse (3) + for (int i = 0; i < 15; ++i) + for (int j = -4; j < 9; j++) + for (int k = 12; k > 7; --k) + { + int l = (k - 8) + (j + 4) * 5 + i * 13 * 5; + if (bar (l, 0)) + x = l; + if (bar (l, 1)) + s = l + 3; + if (bar (l, 2)) + t = l + 6; + } +} + +int +main () +{ + short x; + S s; + #pragma omp parallel + s.foo (x); + if (x != 1010 || s.s != 1012 || s.t != 1023) + abort (); + s.baz (x); + if (x != 959 || s.s != 974 || s.t != 977) + abort (); +} --- libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C.jj 2019-06-03 17:46:38.207960734 +0200 +++ libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C 2019-06-03 17:46:22.542204491 +0200 @@ -0,0 +1,104 @@ +extern "C" void abort (); +int w; +struct S { + int s, &t; + int *p; + S (int *x) : s (0), t (w), p(x) {}; + void foo (short &); + void bar (short &); + void baz (short &); + void qux (short &); +}; + +void +S::foo (short &x) +{ + #pragma omp simd lastprivate (conditional: x, s, t) + for (int i = 0; i < 1025; ++i) + { + if (p[i]) + x = i; + if (p[i + 1025]) + s = i + 3; + if (p[i + 2 * 1025]) + t = i + 6; + } +} + +void +S::bar (short &x) +{ + #pragma omp simd lastprivate (conditional: x, s, t) collapse (3) if (0) + for (int i = 0; i < 15; ++i) + for (int j = -4; j < 9; j++) + for (int k = 12; k > 7; --k) + { + int l = (k - 8) + (j + 4) * 5 + i * 13 * 5; + if (p[l]) + x = l; + if (p[l + 1025]) + s = l + 3; + if (p[l + 1025 * 2]) + t = l + 6; + } +} + +void +S::baz (short &x) +{ + #pragma omp parallel for simd lastprivate (conditional: x, s, t) if (simd: 0) + for (int i = 0; i < 1025; ++i) + { + if (p[i]) + x = i; + if (p[i + 1025]) + s = i + 3; + if (p[i + 2 * 1025]) + t = i + 6; + } +} + +void +S::qux (short &x) +{ + #pragma omp for simd lastprivate (conditional: x, s, t) collapse (3) schedule (simd: guided, 8) + for (int i = 0; i < 15; ++i) + for (int j = -4; j < 9; j++) + for (int k = 12; k > 7; --k) + { + int l = (k - 8) + (j + 4) * 5 + i * 13 * 5; + if (p[l]) + x = l; + if (p[l + 1025]) + s = l + 3; + if (p[l + 1025 * 2]) + t = l + 6; + } +} + +int +main () +{ + short x; + int a[3 * 1025]; + for (int i = 0; i < 1025; ++i) + { + a[i] = ((i % 17) == 7); + a[1025 + i] = ((i % 19) == 2); + a[2 * 1025 + i] = ((i % 23) == 5); + } + S s = a; + s.foo (x); + if (x != 1010 || s.s != 1012 || s.t != 1023) + abort (); + s.bar (x); + if (x != 959 || s.s != 974 || s.t != 977) + abort (); + #pragma omp parallel + s.baz (x); + if (x != 1010 || s.s != 1012 || s.t != 1023) + abort (); + s.qux (x); + if (x != 959 || s.s != 974 || s.t != 977) + abort (); +}