From patchwork Thu Mar 3 19:32:40 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 85329 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 11393B6F01 for ; Fri, 4 Mar 2011 06:33:06 +1100 (EST) Received: (qmail 25847 invoked by alias); 3 Mar 2011 19:32:55 -0000 Received: (qmail 25728 invoked by uid 22791); 3 Mar 2011 19:32:53 -0000 X-SWARE-Spam-Status: No, hits=-6.4 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; Thu, 03 Mar 2011 19:32:42 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p23JWf3D012636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 3 Mar 2011 14:32:41 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p23JWeMT019264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 3 Mar 2011 14:32:41 -0500 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 p23JWexn005465 for ; Thu, 3 Mar 2011 20:32:40 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p23JWeeo005464 for gcc-patches@gcc.gnu.org; Thu, 3 Mar 2011 20:32:40 +0100 Date: Thu, 3 Mar 2011 20:32:40 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [gomp3.1] C/C++ min/max reductions Message-ID: <20110303193239.GX30899@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! This patch adds min/max reduction support for C/C++, which was quite easy given that the middle-end already needs to support it for Fortran. Tested on x86_64-linux, committed to gomp-3_1-branch. 2011-03-03 Jakub Jelinek * c-parser.c (c_parser_omp_clause_reduction): Handle min and max. * c-typeck.c (c_finish_omp_clauses): Handle MIN_EXPR and MAX_EXPR. * parser.c (cp_parser_omp_clause_reduction): Handle min and max. * semantics.c (finish_omp_clauses): Handle MIN_EXPR and MAX_EXPR. * testsuite/libgomp.c/reduction-6.c: New test. * testsuite/libgomp.c++/reduction-4.C: New test. Jakub --- gcc/c-parser.c.jj 2011-03-03 16:57:07.000000000 +0100 +++ gcc/c-parser.c 2011-03-03 19:49:05.000000000 +0100 @@ -8692,7 +8692,12 @@ c_parser_omp_clause_private (c_parser *p reduction ( reduction-operator : variable-list ) reduction-operator: - One of: + * - & ^ | && || */ + One of: + * - & ^ | && || + + OpenMP 3.1: + + reduction-operator: + One of: + * - & ^ | && || max min */ static tree c_parser_omp_clause_reduction (c_parser *parser, tree list) @@ -8728,10 +8733,26 @@ c_parser_omp_clause_reduction (c_parser case CPP_OR_OR: code = TRUTH_ORIF_EXPR; break; + case CPP_NAME: + { + const char *p + = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); + if (strcmp (p, "min") == 0) + { + code = MIN_EXPR; + break; + } + if (strcmp (p, "max") == 0) + { + code = MAX_EXPR; + break; + } + } + /* FALLTHRU */ default: c_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, " - "%<^%>, %<|%>, %<&&%>, or %<||%>"); + "%<^%>, %<|%>, %<&&%>, %<||%>, % or %"); c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0); return list; } --- gcc/c-typeck.c.jj 2011-02-24 14:20:36.000000000 +0100 +++ gcc/c-typeck.c 2011-03-03 19:27:19.000000000 +0100 @@ -10441,6 +10441,8 @@ c_finish_omp_clauses (tree clauses) case PLUS_EXPR: case MULT_EXPR: case MINUS_EXPR: + case MIN_EXPR: + case MAX_EXPR: break; case BIT_AND_EXPR: r_name = "&"; --- gcc/cp/parser.c.jj 2011-02-24 14:18:07.000000000 +0100 +++ gcc/cp/parser.c 2011-03-03 19:48:52.000000000 +0100 @@ -23683,7 +23683,12 @@ cp_parser_omp_clause_ordered (cp_parser reduction ( reduction-operator : variable-list ) reduction-operator: - One of: + * - & ^ | && || */ + One of: + * - & ^ | && || + + OpenMP 3.1: + + reduction-operator: + One of: + * - & ^ | && || min max */ static tree cp_parser_omp_clause_reduction (cp_parser *parser, tree list) @@ -23720,9 +23725,26 @@ cp_parser_omp_clause_reduction (cp_parse case CPP_OR_OR: code = TRUTH_ORIF_EXPR; break; + case CPP_NAME: + { + tree id = cp_lexer_peek_token (parser->lexer)->u.value; + const char *p = IDENTIFIER_POINTER (id); + + if (strcmp (p, "min") == 0) + { + code = MIN_EXPR; + break; + } + if (strcmp (p, "max") == 0) + { + code = MAX_EXPR; + break; + } + } + /* FALLTHROUGH */ default: cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, " - "%<|%>, %<&&%>, or %<||%>"); + "%<|%>, %<&&%>, %<||%>, % or %"); resync_fail: cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true, /*or_comma=*/false, --- gcc/cp/semantics.c.jj 2011-02-28 19:27:17.000000000 +0100 +++ gcc/cp/semantics.c 2011-03-03 19:50:38.000000000 +0100 @@ -3893,6 +3893,8 @@ finish_omp_clauses (tree clauses) case PLUS_EXPR: case MULT_EXPR: case MINUS_EXPR: + case MIN_EXPR: + case MAX_EXPR: break; default: error ("%qE has invalid type for %", --- libgomp/testsuite/libgomp.c/reduction-6.c.jj 2011-03-03 19:44:19.000000000 +0100 +++ libgomp/testsuite/libgomp.c/reduction-6.c 2011-03-03 19:43:38.000000000 +0100 @@ -0,0 +1,29 @@ +/* { dg-do run } */ + +extern void abort (void); +int j; +float f; + +int +main () +{ + j = -10000; + f = 1024.0; + int i; + #pragma omp parallel for reduction (min:f) reduction (max:j) + for (i = 0; i < 4; i++) + switch (i) + { + case 0: + if (j < -16) j = -16; break; + case 1: + if (f > -2.0) f = -2.0; break; + case 2: + if (j < 8) j = 8; if (f > 9.0) f = 9.0; break; + case 3: + break; + } + if (j != 8 || f != -2.0) + abort (); + return 0; +} --- libgomp/testsuite/libgomp.c++/reduction-4.C.jj 2011-03-03 19:54:22.000000000 +0100 +++ libgomp/testsuite/libgomp.c++/reduction-4.C 2011-03-03 19:53:49.000000000 +0100 @@ -0,0 +1,54 @@ +// { dg-do run } + +extern "C" void abort (void); + +template +void +foo () +{ + I j = -10000; + F f = 1024.0; + int i; + #pragma omp parallel for reduction (min:f) reduction (max:j) + for (i = 0; i < 4; i++) + switch (i) + { + case 0: + if (j < -16) j = -16; break; + case 1: + if (f > -2.0) f = -2.0; break; + case 2: + if (j < 8) j = 8; if (f > 9.0) f = 9.0; break; + case 3: + break; + } + if (j != 8 || f != -2.0) + abort (); +} + +int +main () +{ + int j = -10000; + float f = 1024.0; + int i; + #pragma omp parallel for reduction (min:f) reduction (max:j) + for (i = 0; i < 4; i++) + switch (i) + { + case 0: + if (j < -16) j = -16; break; + case 1: + if (f > -2.0) f = -2.0; break; + case 2: + if (j < 8) j = 8; if (f > 9.0) f = 9.0; break; + case 3: + break; + } + if (j != 8 || f != -2.0) + abort (); + foo (); + foo (); + foo (); + return 0; +}