From patchwork Wed Apr 27 15:46:19 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 93073 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 999661007D7 for ; Thu, 28 Apr 2011 01:46:53 +1000 (EST) Received: (qmail 23547 invoked by alias); 27 Apr 2011 15:46:51 -0000 Received: (qmail 23538 invoked by uid 22791); 27 Apr 2011 15:46:50 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 27 Apr 2011 15:46:21 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p3RFkLTS013732 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 27 Apr 2011 11:46:21 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p3RFkKMD000785 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 27 Apr 2011 11:46:21 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id p3RFkKSU017924 for ; Wed, 27 Apr 2011 17:46:20 +0200 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p3RFkK4j017923 for gcc-patches@gcc.gnu.org; Wed, 27 Apr 2011 17:46:20 +0200 Date: Wed, 27 Apr 2011 17:46:19 +0200 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [gomp3.1] Fix #pragma omp atomic write Message-ID: <20110427154619.GL17079@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) 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 Hi! #pragma omp atomic write RHS can be arbitrary expression (not mentioning the LHS), so it is wrong to parse it just as unary expression. Fixed thusly, tested on x86_64-linux, committed to gomp-3_1-branch. 2011-04-27 Jakub Jelinek * c-parser.c (c_parser_omp_atomic): Parse #pragma omp write RHS using c_parser_expression instead of c_parser_unary_expression. * parser.c (cp_parser_omp_atomic): Parse #pragma omp write RHS using cp_parser_expression instead of cp_parser_unary_expression. * testsuite/libgomp.c/atomic-13.c: New test. * testsuite/libgomp.c++/atomic-6.C: New test. * testsuite/libgomp.c++/atomic-7.C: New test. Jakub --- gcc/c-parser.c.jj 2011-04-20 18:31:25.000000000 +0200 +++ gcc/c-parser.c 2011-04-27 17:02:46.000000000 +0200 @@ -9095,7 +9095,10 @@ c_parser_omp_atomic (location_t loc, c_p loc = c_parser_peek_token (parser)->location; if (!c_parser_require (parser, CPP_EQ, "expected %<=%>")) goto saw_error; - lhs = c_parser_unary_expression (parser).value; + if (code == NOP_EXPR) + lhs = c_parser_expression (parser).value; + else + lhs = c_parser_unary_expression (parser).value; lhs = c_fully_fold (lhs, false, NULL); if (lhs == error_mark_node) goto saw_error; --- gcc/cp/parser.c.jj 2011-04-26 18:55:38.000000000 +0200 +++ gcc/cp/parser.c 2011-04-27 17:25:06.000000000 +0200 @@ -24108,8 +24108,11 @@ cp_parser_omp_atomic (cp_parser *parser, goto saw_error; if (!cp_parser_require (parser, CPP_EQ, RT_EQ)) goto saw_error; - lhs = cp_parser_unary_expression (parser, /*address_p=*/false, - /*cast_p=*/false, NULL); + if (code == NOP_EXPR) + lhs = cp_parser_expression (parser, /*cast_p=*/false, NULL); + else + lhs = cp_parser_unary_expression (parser, /*address_p=*/false, + /*cast_p=*/false, NULL); if (lhs == error_mark_node) goto saw_error; if (code == NOP_EXPR) --- libgomp/testsuite/libgomp.c/atomic-13.c.jj 2011-04-27 17:17:17.000000000 +0200 +++ libgomp/testsuite/libgomp.c/atomic-13.c 2011-04-27 17:20:18.000000000 +0200 @@ -0,0 +1,59 @@ +/* { dg-do run } */ + +extern void abort (void); +long long l, m; +int i, j; + +void +foo (void) +{ + #pragma omp atomic read + i = l; + #pragma omp atomic read + m = j; + if (i != 77 || m != 88) + abort (); + #pragma omp atomic write + l = 1 + i + 6 * 1; + #pragma omp atomic write + j = 170 - 170 + m + 1 * 7; + #pragma omp atomic capture + i = l += 4; + #pragma omp atomic capture + m = j += 4; + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + i = l; + l += 4; + } + #pragma omp atomic capture + { + m = j; + j += 4; + } + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + l += 4; + i = l; + } + #pragma omp atomic capture + { + j += 4; + m = j; + } + if (i != 96 || m != 107) + abort (); +} + +int +main () +{ + l = 77; + j = 88; + foo (); + return 0; +} --- libgomp/testsuite/libgomp.c++/atomic-6.C.jj 2011-04-27 17:19:46.000000000 +0200 +++ libgomp/testsuite/libgomp.c++/atomic-6.C 2011-04-27 17:21:03.000000000 +0200 @@ -0,0 +1,58 @@ +// { dg-do run } + +extern "C" void abort (void); +long long l, m; +int i, j; + +void +foo (void) +{ + #pragma omp atomic read + i = l; + #pragma omp atomic read + m = j; + if (i != 77 || m != 88) + abort (); + #pragma omp atomic write + l = 1 + i + 6 * 1; + #pragma omp atomic write + j = 170 - 170 + m + 1 * 7; + #pragma omp atomic capture + i = l += 4; + #pragma omp atomic capture + m = j += 4; + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + i = l; + l += 4; + } + #pragma omp atomic capture + { + m = j; + j += 4; + } + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + l += 4; + i = l; + } + #pragma omp atomic capture + { + j += 4; + m = j; + } + if (i != 96 || m != 107) + abort (); +} + +int +main () +{ + l = 77; + j = 88; + foo (); +} --- libgomp/testsuite/libgomp.c++/atomic-7.C.jj 2011-04-27 17:21:11.000000000 +0200 +++ libgomp/testsuite/libgomp.c++/atomic-7.C 2011-04-27 17:21:58.000000000 +0200 @@ -0,0 +1,63 @@ +// { dg-do run } + +extern "C" void abort (void); + +template +void +foo (void) +{ + extern S l, m; + extern T i, j; + + #pragma omp atomic read + i = l; + #pragma omp atomic read + m = j; + if (i != 77 || m != 88) + abort (); + #pragma omp atomic write + l = 1 + i + 6 * 1; + #pragma omp atomic write + j = 170 - 170 + m + 1 * 7; + #pragma omp atomic capture + i = l += 4; + #pragma omp atomic capture + m = j += 4; + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + i = l; + l += 4; + } + #pragma omp atomic capture + { + m = j; + j += 4; + } + if (i != 88 || m != 99) + abort (); + #pragma omp atomic capture + { + l += 4; + i = l; + } + #pragma omp atomic capture + { + j += 4; + m = j; + } + if (i != 96 || m != 107) + abort (); +} + +long long l, m; +int i, j; + +int +main () +{ + l = 77; + j = 88; + foo (); +}