From patchwork Thu Jun 16 13:31:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamar Christina X-Patchwork-Id: 55135 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B8C55382C14A for ; Thu, 16 Jun 2022 13:32:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B8C55382C14A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1655386366; bh=yvEoxm7OeHEDf713BSvqTXnKO6W1bcLYrgmu+9sp8KE=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=HGuQlmI1eqI+Tpwjj8sze+6uZko9ASdp5mHUOg933Q/3yCG1GEcsd/uv0yFFOXJ7r gTwsUOoy3G8kBkakJDtFHn7OO/n0QCnrv0W4gtsWOEuaXcXUOgIIjhOQjKpBXjWbEs X1NYJfKsl8vvVjodFcwDEpmH6ARIYWzYabrWQtsQ= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2061.outbound.protection.outlook.com [40.107.20.61]) by sourceware.org (Postfix) with ESMTPS id 9D84B382C161 for ; Thu, 16 Jun 2022 13:32:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9D84B382C161 ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=VkcQdexKGsybUK6QMHL/HAkP1KF1TZsg7KRY2R0R3a1EEcv/nHXpB5bB1DtHxVpF1KMU4p3P4mIE0uut/XRoHSjSkgDLiJAfkZijETCLhDKZXlXGv2+YHdAP03a96WjMnwzYXeIo4eW1bnc1RNSa9dW9Cb3t5tKMwkGZJHkesKIZr6U27F/diCgUGb2s4i29qPnCJBcY32knEtyJY1IzZ9Y0aRFSo+2eVR72aUFFOD+SpUUXUwFXrCPaf7em5y/S2MEmX28BIKWq9CNIFnemyfBrSm83eDBtvaikFip0W/dQXxaoix3XHMwSbBZVYHdO73dYP6/to5Apw6cW/Jipow== ARC-Message-Signature: i=2; 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=yvEoxm7OeHEDf713BSvqTXnKO6W1bcLYrgmu+9sp8KE=; b=Wvp5iCL3sy81B6Nxd1ghz7aOC7E/JmSSB4FE8iIzp8CO2zti9xGMgZcirlgk7zgws/e65Rcyq6w2BaofAQSpIBIWpcse8MC9I5MlWnZ2iJN7Uzu0drm/jmS0YqyUCoglIUatXmuL8bfWNzf0QdqOZjZq2aNAMM9XKMxEkCGuqZSkLiwmLQAXV1h+TzTYiHfx0Rj1w4uGu4vgemo7u5/0yj1khjP2G7cNsu3QhxjXcZ3NULa7oXjtnRmTIOtGHWLO27K+cOsGDW/unUGeAtAwvKTFWEERm2twO9yuuTY5wVDM6RJu1+Tdf2EbSjYB0sne+m4JWFHaORxYIKxsZwQZwA== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from DBBPR09CA0037.eurprd09.prod.outlook.com (2603:10a6:10:d4::25) by AS8PR08MB8160.eurprd08.prod.outlook.com (2603:10a6:20b:561::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15; Thu, 16 Jun 2022 13:32:08 +0000 Received: from DBAEUR03FT005.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:d4:cafe::9c) by DBBPR09CA0037.outlook.office365.com (2603:10a6:10:d4::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15 via Frontend Transport; Thu, 16 Jun 2022 13:32:08 +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 DBAEUR03FT005.mail.protection.outlook.com (100.127.142.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.14 via Frontend Transport; Thu, 16 Jun 2022 13:32:08 +0000 Received: ("Tessian outbound 1766a3bff204:v120"); Thu, 16 Jun 2022 13:32:08 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: a7f1539967ce8a16 X-CR-MTA-TID: 64aa7808 Received: from d38a6adb8ba2.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 66C59AB3-6FE8-4F9A-AD9F-FF03F5CAE8EE.1; Thu, 16 Jun 2022 13:32:02 +0000 Received: from EUR02-AM5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id d38a6adb8ba2.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 16 Jun 2022 13:32:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cqMjK0PZqLj7RWXJR5bEJR2dCVr/uUe6JJTqOs7kXb8KYaFWI8NVQx7vHrMP0NIdWZrfTg+8ppraD97mlaqxkHTbE+sBvqwXkIlL4fLHoq+K1Tz3ps8zRsvigIdP8IACel7bivWg+2k5v0yacqYtkJ3i4x7uM2IHNntn0mqF2xqIvbXM+UJ5FV9txZ2gc32lPQdYFNy86JJYlo7GU/8mMfMhueQqUQ6U8duWfTrYA0UFWYqbwbopzDeQ7ZQpeApM9Tjo6AZIWxQi1mmhrddcvuNjBwa/6OcFXyWSgrxTDPvSdS7ykLbPUIbay4v8f1SDKOjWV6mx9prdxczaxvhCrw== 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=yvEoxm7OeHEDf713BSvqTXnKO6W1bcLYrgmu+9sp8KE=; b=f+IpsUIiC4MZr0SU4Pw6mbOCJhnBGllg39ZWd+FCUmlmn51VoJQA9bsyTGq132aG/fLxdyDEg2Zob5JVbcjTHJzLOipx5LGmkbU0vIQY62199lnjjjcFjEhwMmDSjwYN1GDbuxVyL57BiczHYT3ofJR5qDPNl2X2M4BJ9r+AJ1WqULgkBsT6sjCNnP/6PvIKkLOwSmm2BetipKYddGojskIOw7L3UhdSgxcmS56lgK1e4xJxyVWeU7Cp35YZ1yBEcasuBCyStLtnj66QP9NEz1xDwSXfkDF3FxdaOMgbWYkevqigML6y+qsuyW+WtOwFAgxxa5ULRjblyyAgcQ2mbQ== 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 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by AM0PR08MB4564.eurprd08.prod.outlook.com (2603:10a6:208:12f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.13; Thu, 16 Jun 2022 13:32:00 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::54e5:594b:e5fd:a9b4]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::54e5:594b:e5fd:a9b4%8]) with mapi id 15.20.5353.014; Thu, 16 Jun 2022 13:31:59 +0000 Date: Thu, 16 Jun 2022 14:31:52 +0100 To: gcc-patches@gcc.gnu.org Subject: [PATCH]middle-end simplify complex if expressions where comparisons are inverse of one another. Message-ID: Content-Disposition: inline X-ClientProxiedBy: SN7PR04CA0044.namprd04.prod.outlook.com (2603:10b6:806:120::19) To VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: acf205be-5336-414f-263e-08da4f9c9c9e X-MS-TrafficTypeDiagnostic: AM0PR08MB4564:EE_|DBAEUR03FT005:EE_|AS8PR08MB8160:EE_ X-Microsoft-Antispam-PRVS: 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: 7x999kpDJ0XNH79gVPFc81TUgW1tOQ0j5cq+GB9CrWX4ttzuaD1WJFa7aKzcLC5hw6vWFwKIXWN3XB9psEUWDC/2odf5QyCk+EFmj1BAYYtdlx7+9EgN/HErg+UoabNx42mxr6QLrkO4TgQdgsLiTl9uVv+SEqpq6+x2CQharwn75op77/I4VcrhInmnMfIKOCdGriVWRKvrynOnXG2RJ/ii8uY/LswhHJZExH7b8nLq6QsuhePgk7e2P3nHzIk2yKCpIf1S8kuRZ3D2EARgyewn+nLAyT/qSw9E7Ps0HD6N5PmGDHkzYQDUYYyhZuB72KPOwGGGDT3uiIF06sGZhiGiFuhzTUiGjqTCZDrXyhlfbYFHdUxXdFnppZZbwTjkBOuqCoNEYbEuyw+bEVQDz2LuVkM3r+jb/0cBMGOsEvgGGR6G61QLb21Sc+zC3btVXs5SdlnGAAB1kvCm3Yyz374lwDJ1g1KmNE2A9bw5P6PkAD3QBGDX1qskm+bE+trb3rK1m9iDzajGsd5EBMn3n9WOw9Euid5SdCqIHtQYFXjiSbsTs0nMW5piVumLZspMs7CY5TDwEaUfld2p13FgINiYCh1KIv0RcoKI6WY8wjliZqze+r1dTkAqflqO8PqE2zi/CJ+S4qcUZbMKiNWO/vVLDc1lZvIdC26J2x5Q9u1JWfIH+5N4eWKHJlfc+L9FX3ns9ktH4f5rnfkwAVrbms+QwJKeAlawtAWb2Vi9ZR9v8RSiaTsXPhFNcJNDb5wrmHITq16rL7yLQafR+OjwxaOLGepuJX/Ej9oU9kNMey21Cfc+ncPEmwmz3rG2F8mijPOLbvqOE1nv9mRhClgwrQ07spYo5pnfRfS1jnsbv2o= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR08MB5325.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(366004)(26005)(6916009)(44832011)(2906002)(66476007)(6666004)(66946007)(36756003)(66556008)(508600001)(186003)(86362001)(2616005)(38100700002)(316002)(84970400001)(8936002)(6506007)(6486002)(6512007)(44144004)(4326008)(235185007)(33964004)(8676002)(5660300002)(4216001)(2700100001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB4564 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: DBAEUR03FT005.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: bd782e19-bc0e-44c9-2a20-08da4f9c9738 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BGEDln2aecPKNyOTBoVn7JvG5B6XFnGvtL3G8FuUB8JkPhQpIlz1AHirjcl6M6cCZRoya5C7ChenIS1/I/sH/3vclL/qekoX9ahj3cJtu3u1Sn4FSi3856ahroN4LSGbEreMFwPUQBojAR1vjuMtndKBuvRu1+sFu+swW5JtS2ZudO2sXErjYtF/WnuXyYUdVKAtTUsPDOQsXrfBX4mqq0xxo7H1kJhOW1Dxmd5MU7kUSLgH1rjKk0Fa8dKJlrKmIKIDWyGkZh47DMAaw4a2PJI4SGNgWp7YLOWgvYVu2MOmQKrt1MI2dB1iZdJDwXd+wixvZIPND5vyhzaReLpFoAhw1jeLOp5thSxkDWJzWGEV6siwYt3KZYjN12hlnmlEzPR5LGQ6dIpkEoKVdl7bDkZEeqRcAoCuTIy0P9iN0zfpRcAm0or7R/QLmiNezFkIx2qKbEn+LntwbSqUQDR1JlD5mGes+MdJnpZLoZXpODkMG6AthmTX5Fl5vDlC7/TYkn2RWQvC47cV5fkq2JU0kcRTQ9yzTS9YcEnmWAVt0qgIDZNwxtHVHiNwBdv2HnoTUpkfakCc2LNDIN0xYujXR7oI0KrRIzuDNBwoO84CmNhwe5uBAWGY1CM86vQSu7jZR3qePQnmfzGWZ0FIWKemw+Vgvj1I7utLpMQyQ3l1mSYsRnMhCDxKV5i5jNYish48sblRUkNsmWqVuyFdBkOH5FhsAJy6c1sUrZRl3isvczivPOZr6mtaHK0HGBoD5DBpOOFgjmYqlJpqRAwqtN03mN+M/UFTbQLdM5JUvuqFBLu+nsvEYuxlxZeJ65d5UUjkOWA9bb7X3SIwgSwZ8a7CZB08uEZV8kX6BaQ4wscHDXc= 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:(13230016)(4636009)(40470700004)(36840700001)(46966006)(26005)(6512007)(6916009)(316002)(36756003)(33964004)(44144004)(70206006)(70586007)(8676002)(2616005)(6506007)(86362001)(81166007)(235185007)(4326008)(5660300002)(82310400005)(40460700003)(36860700001)(6486002)(2906002)(508600001)(107886003)(84970400001)(6666004)(47076005)(44832011)(356005)(8936002)(186003)(336012)(4216001)(2700100001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2022 13:32:08.7292 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: acf205be-5336-414f-263e-08da4f9c9c9e 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: DBAEUR03FT005.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8160 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_LOTSOFHASH, KAM_SHORT, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tamar Christina via Gcc-patches From: Tamar Christina Reply-To: Tamar Christina Cc: nd@arm.com, rguenther@suse.de Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi All, This optimizes the following sequence ((a < b) & c) | ((a >= b) & d) into (a < b ? c : d) & 1 for scalar. On vector we can omit the & 1. This changes the code generation from zoo2: cmp w0, w1 cset w0, lt cset w1, ge and w0, w0, w2 and w1, w1, w3 orr w0, w0, w1 ret into cmp w0, w1 csel w0, w2, w3, lt and w0, w0, 1 ret and significantly reduces the number of selects we have to do in the vector code. Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: * fold-const.cc (inverse_conditions_p): Traverse if SSA_NAME. * match.pd: Add new rule. gcc/testsuite/ChangeLog: * gcc.target/aarch64/if-compare_1.c: New test. * gcc.target/aarch64/if-compare_2.c: New test. --- inline copy of patch -- diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index 39a5a52958d87497f301826e706886b290771a2d..f180599b90150acd3ed895a64280aa3255061256 100644 --- diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index 39a5a52958d87497f301826e706886b290771a2d..f180599b90150acd3ed895a64280aa3255061256 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -2833,15 +2833,38 @@ compcode_to_comparison (enum comparison_code code) bool inverse_conditions_p (const_tree cond1, const_tree cond2) { - return (COMPARISON_CLASS_P (cond1) - && COMPARISON_CLASS_P (cond2) - && (invert_tree_comparison - (TREE_CODE (cond1), - HONOR_NANS (TREE_OPERAND (cond1, 0))) == TREE_CODE (cond2)) - && operand_equal_p (TREE_OPERAND (cond1, 0), - TREE_OPERAND (cond2, 0), 0) - && operand_equal_p (TREE_OPERAND (cond1, 1), - TREE_OPERAND (cond2, 1), 0)); + if (COMPARISON_CLASS_P (cond1) + && COMPARISON_CLASS_P (cond2) + && (invert_tree_comparison + (TREE_CODE (cond1), + HONOR_NANS (TREE_OPERAND (cond1, 0))) == TREE_CODE (cond2)) + && operand_equal_p (TREE_OPERAND (cond1, 0), + TREE_OPERAND (cond2, 0), 0) + && operand_equal_p (TREE_OPERAND (cond1, 1), + TREE_OPERAND (cond2, 1), 0)) + return true; + + if (TREE_CODE (cond1) == SSA_NAME + && TREE_CODE (cond2) == SSA_NAME) + { + gimple *gcond1 = SSA_NAME_DEF_STMT (cond1); + gimple *gcond2 = SSA_NAME_DEF_STMT (cond2); + if (!is_gimple_assign (gcond1) || !is_gimple_assign (gcond2)) + return false; + + tree_code code1 = gimple_assign_rhs_code (gcond1); + tree_code code2 = gimple_assign_rhs_code (gcond2); + return TREE_CODE_CLASS (code1) == tcc_comparison + && TREE_CODE_CLASS (code2) == tcc_comparison + && invert_tree_comparison (code1, + HONOR_NANS (gimple_arg (gcond1, 0))) == code2 + && operand_equal_p (gimple_arg (gcond1, 0), + gimple_arg (gcond2, 0), 0) + && operand_equal_p (gimple_arg (gcond1, 1), + gimple_arg (gcond2, 1), 0); + } + + return false; } /* Return a tree for the comparison which is the combination of diff --git a/gcc/match.pd b/gcc/match.pd index 6d691d302b339c0e4556b40af158b5208c12d08f..bad49dd348add751d9ec1e3023e34d9ac123194f 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1160,6 +1160,32 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (convert (bit_and (negate (convert:utype { pmop[0]; })) (convert:utype @1))))))) +/* Fold (((a < b) & c) | ((a >= b) & d)) into (a < b ? c : d) & 1. */ +(simplify + (bit_ior + (bit_and:c (convert? @0) @2) + (bit_and:c (convert? @1) @3)) + (if (inverse_conditions_p (@0, @1) + /* The scalar version has to be canonicalized after vectorization + because it makes unconditional loads conditional ones, which + means we lose vectorization because the loads may trap. */ + && canonicalize_math_after_vectorization_p ()) + (bit_and (cond @0 @2 @3) { build_each_one_cst (type); }))) +(simplify + (bit_ior + (bit_and:c (convert? (vec_cond:s @0 @4 integer_zerop)) @2) + (bit_and:c (convert? (vec_cond:s @1 @4 integer_zerop)) @3)) + (if (inverse_conditions_p (@0, @1) + && integer_onep (@4)) + (bit_and (vec_cond @0 @2 @3) @4))) +/* Fold (((a < b) & c) | ((a >= b) & d)) into a < b ? c : d. */ +(simplify + (bit_ior + (bit_and:c (convert? (vec_cond:s @0 integer_minus_onep integer_zerop)) @2) + (bit_and:c (convert? (vec_cond:s @1 integer_minus_onep integer_zerop)) @3)) + (if (inverse_conditions_p (@0, @1)) + (vec_cond @0 @2 @3))) + /* X % Y is smaller than Y. */ (for cmp (lt ge) (simplify diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_1.c b/gcc/testsuite/gcc.target/aarch64/if-compare_1.c new file mode 100644 index 0000000000000000000000000000000000000000..05a1292fa90c70b14a7985122f43711f55d047ea --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +/* +**zoo2: +** cmp w0, w1 +** csel w0, w2, w3, lt +** and w0, w0, 1 +** ret +*/ +int zoo2 (int a, int b, int c, int d) +{ + return ((a < b) & c) | ((a >= b) & d); +} + diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_2.c b/gcc/testsuite/gcc.target/aarch64/if-compare_2.c new file mode 100644 index 0000000000000000000000000000000000000000..34bc65f5db10eae81b8dee3316dfb7d12bf471c8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_2.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O3 -std=c99" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +typedef int v4si __attribute__ ((vector_size (16))); + +/* +**foo: +** cmgt v0.4s, v1.4s, v0.4s +** bsl v0.16b, v2.16b, v3.16b +** ret +*/ +v4si foo (v4si a, v4si b, v4si c, v4si d) { + return ((a < b) & c) | ((a >= b) & d); +} + + +/** +**bar: +**... +** cmge v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** bsl v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +** and v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +**... +*/ +void bar (int * restrict a, int * restrict b, int * restrict c, + int * restrict d, int * restrict res, int n) +{ + for (int i = 0; i < (n & -4); i++) + res[i] = ((a[i] < b[i]) & c[i]) | ((a[i] >= b[i]) & d[i]); +} + --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -2833,15 +2833,38 @@ compcode_to_comparison (enum comparison_code code) bool inverse_conditions_p (const_tree cond1, const_tree cond2) { - return (COMPARISON_CLASS_P (cond1) - && COMPARISON_CLASS_P (cond2) - && (invert_tree_comparison - (TREE_CODE (cond1), - HONOR_NANS (TREE_OPERAND (cond1, 0))) == TREE_CODE (cond2)) - && operand_equal_p (TREE_OPERAND (cond1, 0), - TREE_OPERAND (cond2, 0), 0) - && operand_equal_p (TREE_OPERAND (cond1, 1), - TREE_OPERAND (cond2, 1), 0)); + if (COMPARISON_CLASS_P (cond1) + && COMPARISON_CLASS_P (cond2) + && (invert_tree_comparison + (TREE_CODE (cond1), + HONOR_NANS (TREE_OPERAND (cond1, 0))) == TREE_CODE (cond2)) + && operand_equal_p (TREE_OPERAND (cond1, 0), + TREE_OPERAND (cond2, 0), 0) + && operand_equal_p (TREE_OPERAND (cond1, 1), + TREE_OPERAND (cond2, 1), 0)) + return true; + + if (TREE_CODE (cond1) == SSA_NAME + && TREE_CODE (cond2) == SSA_NAME) + { + gimple *gcond1 = SSA_NAME_DEF_STMT (cond1); + gimple *gcond2 = SSA_NAME_DEF_STMT (cond2); + if (!is_gimple_assign (gcond1) || !is_gimple_assign (gcond2)) + return false; + + tree_code code1 = gimple_assign_rhs_code (gcond1); + tree_code code2 = gimple_assign_rhs_code (gcond2); + return TREE_CODE_CLASS (code1) == tcc_comparison + && TREE_CODE_CLASS (code2) == tcc_comparison + && invert_tree_comparison (code1, + HONOR_NANS (gimple_arg (gcond1, 0))) == code2 + && operand_equal_p (gimple_arg (gcond1, 0), + gimple_arg (gcond2, 0), 0) + && operand_equal_p (gimple_arg (gcond1, 1), + gimple_arg (gcond2, 1), 0); + } + + return false; } /* Return a tree for the comparison which is the combination of diff --git a/gcc/match.pd b/gcc/match.pd index 6d691d302b339c0e4556b40af158b5208c12d08f..bad49dd348add751d9ec1e3023e34d9ac123194f 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1160,6 +1160,32 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (convert (bit_and (negate (convert:utype { pmop[0]; })) (convert:utype @1))))))) +/* Fold (((a < b) & c) | ((a >= b) & d)) into (a < b ? c : d) & 1. */ +(simplify + (bit_ior + (bit_and:c (convert? @0) @2) + (bit_and:c (convert? @1) @3)) + (if (inverse_conditions_p (@0, @1) + /* The scalar version has to be canonicalized after vectorization + because it makes unconditional loads conditional ones, which + means we lose vectorization because the loads may trap. */ + && canonicalize_math_after_vectorization_p ()) + (bit_and (cond @0 @2 @3) { build_each_one_cst (type); }))) +(simplify + (bit_ior + (bit_and:c (convert? (vec_cond:s @0 @4 integer_zerop)) @2) + (bit_and:c (convert? (vec_cond:s @1 @4 integer_zerop)) @3)) + (if (inverse_conditions_p (@0, @1) + && integer_onep (@4)) + (bit_and (vec_cond @0 @2 @3) @4))) +/* Fold (((a < b) & c) | ((a >= b) & d)) into a < b ? c : d. */ +(simplify + (bit_ior + (bit_and:c (convert? (vec_cond:s @0 integer_minus_onep integer_zerop)) @2) + (bit_and:c (convert? (vec_cond:s @1 integer_minus_onep integer_zerop)) @3)) + (if (inverse_conditions_p (@0, @1)) + (vec_cond @0 @2 @3))) + /* X % Y is smaller than Y. */ (for cmp (lt ge) (simplify diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_1.c b/gcc/testsuite/gcc.target/aarch64/if-compare_1.c new file mode 100644 index 0000000000000000000000000000000000000000..05a1292fa90c70b14a7985122f43711f55d047ea --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +/* +**zoo2: +** cmp w0, w1 +** csel w0, w2, w3, lt +** and w0, w0, 1 +** ret +*/ +int zoo2 (int a, int b, int c, int d) +{ + return ((a < b) & c) | ((a >= b) & d); +} + diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_2.c b/gcc/testsuite/gcc.target/aarch64/if-compare_2.c new file mode 100644 index 0000000000000000000000000000000000000000..34bc65f5db10eae81b8dee3316dfb7d12bf471c8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_2.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O3 -std=c99" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +typedef int v4si __attribute__ ((vector_size (16))); + +/* +**foo: +** cmgt v0.4s, v1.4s, v0.4s +** bsl v0.16b, v2.16b, v3.16b +** ret +*/ +v4si foo (v4si a, v4si b, v4si c, v4si d) { + return ((a < b) & c) | ((a >= b) & d); +} + + +/** +**bar: +**... +** cmge v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** bsl v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +** and v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +**... +*/ +void bar (int * restrict a, int * restrict b, int * restrict c, + int * restrict d, int * restrict res, int n) +{ + for (int i = 0; i < (n & -4); i++) + res[i] = ((a[i] < b[i]) & c[i]) | ((a[i] >= b[i]) & d[i]); +} +