From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2048.outbound.protection.outlook.com [40.107.22.48]) by sourceware.org (Postfix) with ESMTPS id D850A3858436 for ; Wed, 19 Jul 2023 15:16:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D850A3858436 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vfUToh2Vx0IxNSNC9r28APc4Ed00wUEfK/Adndrb2HY=; b=o6Qkw5wgGrKpNdHlVrlm3tUPuoiza/+SiVzEw86R8cngFb9Dm7XXmU48Ndve50jwWy3mwhciY40cKA7FSp2OSNgHf8ETqRIl41gMbuZBRRUvZxgjONqLowtMuufRh1/fFdaJ5rGKFjbWpJvDNJ0800ovUUTvIap0IH/zBegJwAw= Received: from FR0P281CA0222.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:ac::18) by DBBPR08MB6137.eurprd08.prod.outlook.com (2603:10a6:10:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6609.24; Wed, 19 Jul 2023 15:16:51 +0000 Received: from VI1EUR03FT063.eop-EUR03.prod.protection.outlook.com (2603:10a6:d10:ac:cafe::52) by FR0P281CA0222.outlook.office365.com (2603:10a6:d10:ac::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6609.24 via Frontend Transport; Wed, 19 Jul 2023 15:16:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VI1EUR03FT063.mail.protection.outlook.com (100.127.144.155) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6588.33 via Frontend Transport; Wed, 19 Jul 2023 15:16:51 +0000 Received: ("Tessian outbound e1fdbe8a48d3:v145"); Wed, 19 Jul 2023 15:16:50 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 427b961879549f9d X-CR-MTA-TID: 64aa7808 Received: from 85340478f82d.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id A7E3ACAF-E75E-4362-A8EE-20647B9FEB60.1; Wed, 19 Jul 2023 15:16:43 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 85340478f82d.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 19 Jul 2023 15:16:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VGCLLF4tZgVmzk0BEJhK8NHK0JIY9v0hGaCpuo8PMycYV5yA/b8/opHaMVheTkY1EXMFS84gFKReEEvuhiknoB1whaLyWWQvlqZkL/YWhWribxUE/ZlvMZWvWJBW1E5dZwKVMTFNODyk8/lDalMmm2mN9ycc4q1HTFSSio6Z477RmwV9WgK/D/qLeQumWuACmHMdDDSa/wwfRVMvK33pO7BFY6GyHF/bMCQtjQzMgjPbCcMm4MM8o0GmPF7BRZtNLrY7xIruoWor1pwFHIXhxR73Kh2nUsdE3YVcJq3x+qcZkhx28nh+ekc2xbkHiAv380U65yI2zfKKJRHqAZxm6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vfUToh2Vx0IxNSNC9r28APc4Ed00wUEfK/Adndrb2HY=; b=n7iE6ABhRUqlFJOCq51Bhz6DCc67zcFn+Fhb/KqbNZ14aKY1Phm1RWuPYMt+RhJpjkW3RDZ6UxtCM2By9XvzM/HbG94jFWvA9fPqNrLLg8WAbfiUNcxVl8okl7ExIpOakAmwdtQIDn9yuat3+QC0Cuvcl5LWq+edxpTRzzVupzOFkFeY/roV3sgRTHZgQvlP7681JnAeqSxSeF5vRQp4npicVTkEKywggewZyxj+LYnFrez7m87EDJmFLgHh4x0E9ys1VU3e70ANCNKDAnAo6T7XRB6DzPS5oRJO+5ZNioDrqd0RLQLByqs2qE23VwpPyU6gfotcOiXvS6iV2ifIMg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vfUToh2Vx0IxNSNC9r28APc4Ed00wUEfK/Adndrb2HY=; b=o6Qkw5wgGrKpNdHlVrlm3tUPuoiza/+SiVzEw86R8cngFb9Dm7XXmU48Ndve50jwWy3mwhciY40cKA7FSp2OSNgHf8ETqRIl41gMbuZBRRUvZxgjONqLowtMuufRh1/fFdaJ5rGKFjbWpJvDNJ0800ovUUTvIap0IH/zBegJwAw= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from AM0PR08MB5316.eurprd08.prod.outlook.com (2603:10a6:208:185::14) by DB3PR08MB8818.eurprd08.prod.outlook.com (2603:10a6:10:434::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6609.23; Wed, 19 Jul 2023 15:16:41 +0000 Received: from AM0PR08MB5316.eurprd08.prod.outlook.com ([fe80::1a75:e30c:4678:5fa3]) by AM0PR08MB5316.eurprd08.prod.outlook.com ([fe80::1a75:e30c:4678:5fa3%4]) with mapi id 15.20.6588.031; Wed, 19 Jul 2023 15:16:41 +0000 Date: Wed, 19 Jul 2023 16:16:34 +0100 From: Tamar Christina To: gcc-patches@gcc.gnu.org Cc: nd@arm.com, joseph@codesourcery.com Subject: [PATCH 2/2][frontend]: Add novector C pragma Message-ID: Content-Type: multipart/mixed; boundary="3gVBXH+GJLPBb4E0" Content-Disposition: inline In-Reply-To: X-ClientProxiedBy: SA0PR11CA0160.namprd11.prod.outlook.com (2603:10b6:806:1bb::15) To AM0PR08MB5316.eurprd08.prod.outlook.com (2603:10a6:208:185::14) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AM0PR08MB5316:EE_|DB3PR08MB8818:EE_|VI1EUR03FT063:EE_|DBBPR08MB6137:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d92ab40-cf8d-4d33-d25c-08db886b2dc0 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: lz1qxNTOy9QRuHD2TE2ThCffTA/mIMSaoTY67NjmcxlbqktcpaIjEw/FV8iVmm7VsdY9FjQSa/EaarnVmkhV6MltZMasv9NZDHMabGMLahWwOzIMraj1lsKKNeXDd52xm09mHMKlLDNAJeXiTsLM0dFJucJ3/dWdbx8Fl2QO92ZMAZKs8KR9N/QOrLOTUhpopBxuvaUUsoRoNC9hvpu3aYOCy6bYcwGklNv2ugTWX0lm6iJxUq6f4XJHxLOiUlCFqKsjpnoNU3rBban+nI3U+tGP3aLBYplOEaYeigYOFLUgHR64sDhl0AvkhqEKRmGkhoFT1OY5cKVY+uZT2TQP2cF/cTxNJEfwwjci+CRHdxQ5a63N4WmbO0CzSwvu7U/6r0bC88jR9I0qrEj8a6o3HIeLpwYQsJB171FKEXLz036KIQ3qzHdYlMmosxZDW/FkUKUwMJAdpbDWQTHqzFPtqJLWF7Zlab9yOYu/jS+NaltbS4HFL1UtJuA12WMkPIChHLmQrxvN6QPPbXOMkubJCkKVW6IUMwdxCbwTBhOG0y7B5gUz9CSY8Rq94mpZsnBLVRtzSSq9RnMU7crq0brcLi14TCpEIw6bUJBr4M0QfntAec+rd+gPYwlrlWxAyflX X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR08MB5316.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(376002)(346002)(39860400002)(366004)(396003)(136003)(451199021)(478600001)(6506007)(4743002)(186003)(26005)(6666004)(44144004)(6486002)(33964004)(66556008)(6916009)(4326008)(66476007)(66946007)(83380400001)(84970400001)(2616005)(6512007)(38100700002)(30864003)(235185007)(5660300002)(41300700001)(44832011)(2906002)(316002)(8936002)(8676002)(86362001)(36756003)(67856001)(2700100001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR08MB8818 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: VI1EUR03FT063.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 8131349e-6b75-4855-6235-08db886b27a5 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: sUVn1FoVbwNAvjls1XjxOOEoeFSnILc2pYVYupUqjQky0NK5/magrOpS45RuOB2srNfNGVWlncObhSGlslJnLesoCMU2iZzYbDizJwi9ZNxqBanrx+FTlTPuZZi/P1j288nZNsrch9eO1eJ3RRwwIvbU+AMzhanp4exGh7/pXSwNBDkAu4zPR/PVW9s/I8GclOS85+BxekQcRUGyNknTyh8lKxif5OfnZyODxUvqkuLvsrM3dhZNkLrdrL3Mj5rCAGzm0DH9+wCC70byz8mxXebEzIkhC4mznlT39NtcBT14B7ICgdVrHUjBvszgSh7Q1roFXQx5rc+Rd7PAokq5K9jyQznBFqbSfD/yKzgEKuV5WXKYllcQfSJFWhhG7wE4aYu36ajKlp2F7Vl9RzmFzv9+3CSAATl4601faoSzZLoeiFplgoYzAjruASbGLvHzZ29yEcOEkHrwSo3v09jFX66Dwi0k2PGBEYwR1JZb8gu/EhQ5QN5z6D5VcgNDqGvK+Y4fx/z+SDvG/uj29hoKybLra0WUrQjShDNtYKDMnoOgjgkNXeoNeVj0f+iR4wQ+q4xlJ+WQub6Rn/v/vnrNsIaFuvGye03va1Km+45qHy1aVGDqsAStogLmwGJ8aS9dB8QxvV9NFtr/XXdOc8FrhC/hUvBsDiA4inMi2P68eNKyxd/WDxjUjdfrhW9pYLvyvO6nckwqQitA9m1J2Wv1tfxQ22RzMrmNgTy0YopMpjMFGfBt/7KkfcQyrNR84fWfivJiCGmqicIvwoIBXJhNPB8vYEos1iW2SBRzrTZIluc= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230028)(4636009)(396003)(376002)(136003)(346002)(39860400002)(82310400008)(451199021)(40470700004)(36840700001)(46966006)(2906002)(30864003)(40460700003)(478600001)(40480700001)(41300700001)(44832011)(8936002)(8676002)(5660300002)(235185007)(70206006)(70586007)(6916009)(4326008)(316002)(82740400003)(81166007)(84970400001)(107886003)(44144004)(33964004)(2616005)(36756003)(86362001)(36860700001)(47076005)(336012)(186003)(26005)(6506007)(356005)(4743002)(6486002)(83380400001)(6512007)(6666004)(2700100001)(67856001);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jul 2023 15:16:51.0109 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6d92ab40-cf8d-4d33-d25c-08db886b2dc0 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: VI1EUR03FT063.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB6137 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --3gVBXH+GJLPBb4E0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Hi All, FORTRAN currently has a pragma NOVECTOR for indicating that vectorization should not be applied to a particular loop. ICC/ICX also has such a pragma for C and C++ called #pragma novector. As part of this patch series I need a way to easily turn off vectorization of particular loops, particularly for testsuite reasons. This patch proposes a #pragma GCC novector that does the same for C as gfortan does for FORTRAN and what ICX/ICX does for C. I added only some basic tests here, but the next patch in the series uses this in the testsuite in about ~800 tests. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/c-family/ChangeLog: * c-pragma.h (enum pragma_kind): Add PRAGMA_NOVECTOR. * c-pragma.cc (init_pragma): Use it. gcc/c/ChangeLog: * c-parser.cc (c_parser_while_statement, c_parser_do_statement, c_parser_for_statement, c_parser_statement_after_labels, c_parse_pragma_novector, c_parser_pragma): Wire through novector and default to false. gcc/testsuite/ChangeLog: * gcc.dg/vect/vect-novector-pragma.c: New test. --- inline copy of patch -- diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h index 9cc95ab3ee376628dbef2485b84e6008210fa8fc..99cf2e8bd1c05537c198470f1aaa0a5a9da4e576 100644 --- a/gcc/c-family/c-pragma.h +++ b/gcc/c-family/c-pragma.h @@ -87,6 +87,7 @@ enum pragma_kind { PRAGMA_GCC_PCH_PREPROCESS, PRAGMA_IVDEP, PRAGMA_UNROLL, + PRAGMA_NOVECTOR, PRAGMA_FIRST_EXTERNAL }; diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc index 0d2b333cebbed32423d5dc6fd2a3ac0ce0bf8b94..848a850b8e123ff1c6ae1ec4b7f8ccbd599b1a88 100644 --- a/gcc/c-family/c-pragma.cc +++ b/gcc/c-family/c-pragma.cc @@ -1862,6 +1862,10 @@ init_pragma (void) cpp_register_deferred_pragma (parse_in, "GCC", "unroll", PRAGMA_UNROLL, false, false); + if (!flag_preprocess_only) + cpp_register_deferred_pragma (parse_in, "GCC", "novector", PRAGMA_NOVECTOR, + false, false); + #ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION c_register_pragma_with_expansion (0, "pack", handle_pragma_pack); #else diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 24a6eb6e4596f32c477e3f1c3f98b9792f7bc92c..4c64d898cddac437958ce20c5603b88a05a99093 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -1572,9 +1572,11 @@ static tree c_parser_c99_block_statement (c_parser *, bool *, location_t * = NULL); static void c_parser_if_statement (c_parser *, bool *, vec *); static void c_parser_switch_statement (c_parser *, bool *); -static void c_parser_while_statement (c_parser *, bool, unsigned short, bool *); -static void c_parser_do_statement (c_parser *, bool, unsigned short); -static void c_parser_for_statement (c_parser *, bool, unsigned short, bool *); +static void c_parser_while_statement (c_parser *, bool, unsigned short, bool, + bool *); +static void c_parser_do_statement (c_parser *, bool, unsigned short, bool); +static void c_parser_for_statement (c_parser *, bool, unsigned short, bool, + bool *); static tree c_parser_asm_statement (c_parser *); static tree c_parser_asm_operands (c_parser *); static tree c_parser_asm_goto_operands (c_parser *); @@ -6644,13 +6646,13 @@ c_parser_statement_after_labels (c_parser *parser, bool *if_p, c_parser_switch_statement (parser, if_p); break; case RID_WHILE: - c_parser_while_statement (parser, false, 0, if_p); + c_parser_while_statement (parser, false, 0, false, if_p); break; case RID_DO: - c_parser_do_statement (parser, false, 0); + c_parser_do_statement (parser, false, 0, false); break; case RID_FOR: - c_parser_for_statement (parser, false, 0, if_p); + c_parser_for_statement (parser, false, 0, false, if_p); break; case RID_GOTO: c_parser_consume_token (parser); @@ -7146,7 +7148,7 @@ c_parser_switch_statement (c_parser *parser, bool *if_p) static void c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, - bool *if_p) + bool novector, bool *if_p) { tree block, cond, body; unsigned char save_in_statement; @@ -7168,6 +7170,11 @@ c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); save_in_statement = in_statement; in_statement = IN_ITERATION_STMT; @@ -7199,7 +7206,8 @@ c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, */ static void -c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) +c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll, + bool novector) { tree block, cond, body; unsigned char save_in_statement; @@ -7228,6 +7236,11 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); @@ -7296,7 +7309,7 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) static void c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, - bool *if_p) + bool novector, bool *if_p) { tree block, cond, incr, body; unsigned char save_in_statement; @@ -7430,6 +7443,12 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, "with % pragma"); cond = error_mark_node; } + else if (novector) + { + c_parser_error (parser, "missing loop condition in loop " + "with % pragma"); + cond = error_mark_node; + } else { c_parser_consume_token (parser); @@ -7452,6 +7471,11 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); } /* Parse the increment expression (the third expression in a for-statement). In the case of a foreach-statement, this is @@ -13037,6 +13061,16 @@ c_parse_pragma_ivdep (c_parser *parser) return true; } +/* Parse a pragma GCC novector. */ + +static bool +c_parse_pragma_novector (c_parser *parser) +{ + c_parser_consume_pragma (parser); + c_parser_skip_to_pragma_eol (parser); + return true; +} + /* Parse a pragma GCC unroll. */ static unsigned short @@ -13261,38 +13295,50 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) case PRAGMA_OMP_ORDERED: return c_parser_omp_ordered (parser, context, if_p); + case PRAGMA_NOVECTOR: + case PRAGMA_UNROLL: case PRAGMA_IVDEP: { - const bool ivdep = c_parse_pragma_ivdep (parser); - unsigned short unroll; - if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_UNROLL) - unroll = c_parser_pragma_unroll (parser); - else - unroll = 0; - if (!c_parser_next_token_is_keyword (parser, RID_FOR) - && !c_parser_next_token_is_keyword (parser, RID_WHILE) - && !c_parser_next_token_is_keyword (parser, RID_DO)) + bool novector = false; + unsigned short unroll = 0; + bool ivdep = false; + + switch (id) { - c_parser_error (parser, "for, while or do statement expected"); - return false; + case PRAGMA_NOVECTOR: + novector = c_parse_pragma_novector (parser); + break; + case PRAGMA_UNROLL: + unroll = c_parser_pragma_unroll (parser); + break; + case PRAGMA_IVDEP: + ivdep = c_parse_pragma_ivdep (parser); + break; + default: + gcc_unreachable (); } - if (c_parser_next_token_is_keyword (parser, RID_FOR)) - c_parser_for_statement (parser, ivdep, unroll, if_p); - else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) - c_parser_while_statement (parser, ivdep, unroll, if_p); - else - c_parser_do_statement (parser, ivdep, unroll); - } - return true; - case PRAGMA_UNROLL: - { - unsigned short unroll = c_parser_pragma_unroll (parser); - bool ivdep; - if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_IVDEP) - ivdep = c_parse_pragma_ivdep (parser); - else - ivdep = false; + c_token *tok = c_parser_peek_token (parser); + while (tok->type == CPP_PRAGMA) + { + switch (tok->pragma_kind) + { + case PRAGMA_IVDEP: + ivdep = c_parse_pragma_ivdep (parser); + tok = c_parser_peek_token (parser); + break; + case PRAGMA_UNROLL: + unroll = c_parser_pragma_unroll (parser); + tok = c_parser_peek_token (parser); + break; + case PRAGMA_NOVECTOR: + novector = c_parse_pragma_novector (parser); + tok = c_parser_peek_token (parser); + break; + default: + gcc_unreachable (); + } + } if (!c_parser_next_token_is_keyword (parser, RID_FOR) && !c_parser_next_token_is_keyword (parser, RID_WHILE) && !c_parser_next_token_is_keyword (parser, RID_DO)) @@ -13301,11 +13347,11 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) return false; } if (c_parser_next_token_is_keyword (parser, RID_FOR)) - c_parser_for_statement (parser, ivdep, unroll, if_p); + c_parser_for_statement (parser, ivdep, unroll, novector, if_p); else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) - c_parser_while_statement (parser, ivdep, unroll, if_p); + c_parser_while_statement (parser, ivdep, unroll, novector, if_p); else - c_parser_do_statement (parser, ivdep, unroll); + c_parser_do_statement (parser, ivdep, unroll, novector); } return true; diff --git a/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c b/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c new file mode 100644 index 0000000000000000000000000000000000000000..3c0b8f5d2acbd276280785e8d0cbe1f7cd650266 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c @@ -0,0 +1,61 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +void f1 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC novector + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f2 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC novector +#pragma GCC ivdep +#pragma GCC unroll 2 + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f3 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC ivdep +#pragma GCC novector +#pragma GCC unroll 2 + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f4 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC ivdep +#pragma GCC unroll 2 +#pragma GCC novector + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f5 (int * restrict a, int * restrict b, int n) +{ + int i = 0; +#pragma GCC novector + do + { + a[i] += b[i]; + i++; + } + while (i < (n & -8)); +} + +void f6 (int * restrict a, int * restrict b, int n) +{ + int i = 0; +#pragma GCC novector + while (i < (n & -8)) + { + a[i] += b[i]; + i++; + } +} + +/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --3gVBXH+GJLPBb4E0 Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="rb17579.patch" diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h index 9cc95ab3ee376628dbef2485b84e6008210fa8fc..99cf2e8bd1c05537c198470f1aaa0a5a9da4e576 100644 --- a/gcc/c-family/c-pragma.h +++ b/gcc/c-family/c-pragma.h @@ -87,6 +87,7 @@ enum pragma_kind { PRAGMA_GCC_PCH_PREPROCESS, PRAGMA_IVDEP, PRAGMA_UNROLL, + PRAGMA_NOVECTOR, PRAGMA_FIRST_EXTERNAL }; diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc index 0d2b333cebbed32423d5dc6fd2a3ac0ce0bf8b94..848a850b8e123ff1c6ae1ec4b7f8ccbd599b1a88 100644 --- a/gcc/c-family/c-pragma.cc +++ b/gcc/c-family/c-pragma.cc @@ -1862,6 +1862,10 @@ init_pragma (void) cpp_register_deferred_pragma (parse_in, "GCC", "unroll", PRAGMA_UNROLL, false, false); + if (!flag_preprocess_only) + cpp_register_deferred_pragma (parse_in, "GCC", "novector", PRAGMA_NOVECTOR, + false, false); + #ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION c_register_pragma_with_expansion (0, "pack", handle_pragma_pack); #else diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 24a6eb6e4596f32c477e3f1c3f98b9792f7bc92c..4c64d898cddac437958ce20c5603b88a05a99093 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -1572,9 +1572,11 @@ static tree c_parser_c99_block_statement (c_parser *, bool *, location_t * = NULL); static void c_parser_if_statement (c_parser *, bool *, vec *); static void c_parser_switch_statement (c_parser *, bool *); -static void c_parser_while_statement (c_parser *, bool, unsigned short, bool *); -static void c_parser_do_statement (c_parser *, bool, unsigned short); -static void c_parser_for_statement (c_parser *, bool, unsigned short, bool *); +static void c_parser_while_statement (c_parser *, bool, unsigned short, bool, + bool *); +static void c_parser_do_statement (c_parser *, bool, unsigned short, bool); +static void c_parser_for_statement (c_parser *, bool, unsigned short, bool, + bool *); static tree c_parser_asm_statement (c_parser *); static tree c_parser_asm_operands (c_parser *); static tree c_parser_asm_goto_operands (c_parser *); @@ -6644,13 +6646,13 @@ c_parser_statement_after_labels (c_parser *parser, bool *if_p, c_parser_switch_statement (parser, if_p); break; case RID_WHILE: - c_parser_while_statement (parser, false, 0, if_p); + c_parser_while_statement (parser, false, 0, false, if_p); break; case RID_DO: - c_parser_do_statement (parser, false, 0); + c_parser_do_statement (parser, false, 0, false); break; case RID_FOR: - c_parser_for_statement (parser, false, 0, if_p); + c_parser_for_statement (parser, false, 0, false, if_p); break; case RID_GOTO: c_parser_consume_token (parser); @@ -7146,7 +7148,7 @@ c_parser_switch_statement (c_parser *parser, bool *if_p) static void c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, - bool *if_p) + bool novector, bool *if_p) { tree block, cond, body; unsigned char save_in_statement; @@ -7168,6 +7170,11 @@ c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); save_in_statement = in_statement; in_statement = IN_ITERATION_STMT; @@ -7199,7 +7206,8 @@ c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, */ static void -c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) +c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll, + bool novector) { tree block, cond, body; unsigned char save_in_statement; @@ -7228,6 +7236,11 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); @@ -7296,7 +7309,7 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) static void c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, - bool *if_p) + bool novector, bool *if_p) { tree block, cond, incr, body; unsigned char save_in_statement; @@ -7430,6 +7443,12 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, "with % pragma"); cond = error_mark_node; } + else if (novector) + { + c_parser_error (parser, "missing loop condition in loop " + "with % pragma"); + cond = error_mark_node; + } else { c_parser_consume_token (parser); @@ -7452,6 +7471,11 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); + if (novector && cond != error_mark_node) + cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_no_vector_kind), + integer_zero_node); } /* Parse the increment expression (the third expression in a for-statement). In the case of a foreach-statement, this is @@ -13037,6 +13061,16 @@ c_parse_pragma_ivdep (c_parser *parser) return true; } +/* Parse a pragma GCC novector. */ + +static bool +c_parse_pragma_novector (c_parser *parser) +{ + c_parser_consume_pragma (parser); + c_parser_skip_to_pragma_eol (parser); + return true; +} + /* Parse a pragma GCC unroll. */ static unsigned short @@ -13261,38 +13295,50 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) case PRAGMA_OMP_ORDERED: return c_parser_omp_ordered (parser, context, if_p); + case PRAGMA_NOVECTOR: + case PRAGMA_UNROLL: case PRAGMA_IVDEP: { - const bool ivdep = c_parse_pragma_ivdep (parser); - unsigned short unroll; - if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_UNROLL) - unroll = c_parser_pragma_unroll (parser); - else - unroll = 0; - if (!c_parser_next_token_is_keyword (parser, RID_FOR) - && !c_parser_next_token_is_keyword (parser, RID_WHILE) - && !c_parser_next_token_is_keyword (parser, RID_DO)) + bool novector = false; + unsigned short unroll = 0; + bool ivdep = false; + + switch (id) { - c_parser_error (parser, "for, while or do statement expected"); - return false; + case PRAGMA_NOVECTOR: + novector = c_parse_pragma_novector (parser); + break; + case PRAGMA_UNROLL: + unroll = c_parser_pragma_unroll (parser); + break; + case PRAGMA_IVDEP: + ivdep = c_parse_pragma_ivdep (parser); + break; + default: + gcc_unreachable (); } - if (c_parser_next_token_is_keyword (parser, RID_FOR)) - c_parser_for_statement (parser, ivdep, unroll, if_p); - else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) - c_parser_while_statement (parser, ivdep, unroll, if_p); - else - c_parser_do_statement (parser, ivdep, unroll); - } - return true; - case PRAGMA_UNROLL: - { - unsigned short unroll = c_parser_pragma_unroll (parser); - bool ivdep; - if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_IVDEP) - ivdep = c_parse_pragma_ivdep (parser); - else - ivdep = false; + c_token *tok = c_parser_peek_token (parser); + while (tok->type == CPP_PRAGMA) + { + switch (tok->pragma_kind) + { + case PRAGMA_IVDEP: + ivdep = c_parse_pragma_ivdep (parser); + tok = c_parser_peek_token (parser); + break; + case PRAGMA_UNROLL: + unroll = c_parser_pragma_unroll (parser); + tok = c_parser_peek_token (parser); + break; + case PRAGMA_NOVECTOR: + novector = c_parse_pragma_novector (parser); + tok = c_parser_peek_token (parser); + break; + default: + gcc_unreachable (); + } + } if (!c_parser_next_token_is_keyword (parser, RID_FOR) && !c_parser_next_token_is_keyword (parser, RID_WHILE) && !c_parser_next_token_is_keyword (parser, RID_DO)) @@ -13301,11 +13347,11 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) return false; } if (c_parser_next_token_is_keyword (parser, RID_FOR)) - c_parser_for_statement (parser, ivdep, unroll, if_p); + c_parser_for_statement (parser, ivdep, unroll, novector, if_p); else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) - c_parser_while_statement (parser, ivdep, unroll, if_p); + c_parser_while_statement (parser, ivdep, unroll, novector, if_p); else - c_parser_do_statement (parser, ivdep, unroll); + c_parser_do_statement (parser, ivdep, unroll, novector); } return true; diff --git a/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c b/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c new file mode 100644 index 0000000000000000000000000000000000000000..3c0b8f5d2acbd276280785e8d0cbe1f7cd650266 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-novector-pragma.c @@ -0,0 +1,61 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +void f1 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC novector + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f2 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC novector +#pragma GCC ivdep +#pragma GCC unroll 2 + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f3 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC ivdep +#pragma GCC novector +#pragma GCC unroll 2 + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f4 (int * restrict a, int * restrict b, int n) +{ +#pragma GCC ivdep +#pragma GCC unroll 2 +#pragma GCC novector + for (int i = 0; i < (n & -8); i++) + a[i] += b[i]; +} + +void f5 (int * restrict a, int * restrict b, int n) +{ + int i = 0; +#pragma GCC novector + do + { + a[i] += b[i]; + i++; + } + while (i < (n & -8)); +} + +void f6 (int * restrict a, int * restrict b, int n) +{ + int i = 0; +#pragma GCC novector + while (i < (n & -8)) + { + a[i] += b[i]; + i++; + } +} + +/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ --3gVBXH+GJLPBb4E0--