From patchwork Tue Jul 16 13:31:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wilco Dijkstra X-Patchwork-Id: 1132767 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-505150-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="SHdLzc0Z"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.b="j9OqNUa3"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.b="j9OqNUa3"; 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 45p1Wm5JyRz9s7T for ; Tue, 16 Jul 2019 23:31:25 +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:from :to:cc:subject:date:message-id:content-type :content-transfer-encoding:mime-version; q=dns; s=default; b=M/n e5LsamYOLhluDJLarARbTQzgng4kVM2gLhMCSA2Db3SJpIyDXdFhH6qu9S2XrQ1f /3C/t3lI/rp2yEzoM9SjdJ8VZV1KElp1Aky2C+HLEno6z/xvM8XlyGrzquwBcT1X nmll9QaGRbyWaINfonv3KHkMiQOuFesrGT+Jlyjs= 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:from :to:cc:subject:date:message-id:content-type :content-transfer-encoding:mime-version; s=default; bh=c7eQVQiUC HiBB++UuVpY/dd7tQ0=; b=SHdLzc0Z2/lY2llOxYnSyXKblqW2a6YCAfMG3tIC7 G/ZLFlaZad5XNC71eZdueOqXA2BK1htA7l/z8SUXeLLvClvvo5r3Wzltgj0tdwSA V5KlkHg534H9aF5yC2ErDzaZr14KHcwtF45Ame4EfU1Vpx36tOHlfIFb23CS4XHM BA= Received: (qmail 60510 invoked by alias); 16 Jul 2019 13:31:16 -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 60500 invoked by uid 89); 16 Jul 2019 13:31:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-17.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: EUR04-VI1-obe.outbound.protection.outlook.com Received: from mail-eopbgr80079.outbound.protection.outlook.com (HELO EUR04-VI1-obe.outbound.protection.outlook.com) (40.107.8.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 16 Jul 2019 13:31:14 +0000 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=ZcgJbCOoYhVBVHm+yyGajo9ZHOLHWjGODYxQLcNoo1k=; b=j9OqNUa3FtA9B80PQEVD3vLvCEgz5EHuLl+N9k/In8HKfpXOMBP2nJQhMc+9GzrTJONJdBULY9+KmQF9hCKoVDPb6wS1jeeOPfS3Km2cJnBIBA8oOC+svsLIx7Ju7RlCkZrfkDqJNfGfT9swfrSt9KiXl7k+JINzo3lhgpSnU60= Received: from VE1PR08CA0013.eurprd08.prod.outlook.com (2603:10a6:803:104::26) by DB6PR0802MB2598.eurprd08.prod.outlook.com (2603:10a6:4:97::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2073.14; Tue, 16 Jul 2019 13:31:09 +0000 Received: from VE1EUR03FT013.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e09::206) by VE1PR08CA0013.outlook.office365.com (2603:10a6:803:104::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2073.14 via Frontend Transport; Tue, 16 Jul 2019 13:31:08 +0000 Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; gcc.gnu.org; dmarc=temperror action=none header.from=arm.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of arm.com: DNS Timeout) Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VE1EUR03FT013.mail.protection.outlook.com (10.152.19.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2052.18 via Frontend Transport; Tue, 16 Jul 2019 13:31:07 +0000 Received: ("Tessian outbound cb57de15885d:v24"); Tue, 16 Jul 2019 13:31:07 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: b3b578a8f9c599d7 X-CR-MTA-TID: 64aa7808 Received: from 0e078d9d9502.1 (cr-mta-lb-1.cr-mta-net [104.47.8.57]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id 0DAE1634-E0EA-41A8-A4A7-1106ABC6AE5F.1; Tue, 16 Jul 2019 13:31:01 +0000 Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-am5eur03lp2057.outbound.protection.outlook.com [104.47.8.57]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 0e078d9d9502.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 16 Jul 2019 13:31:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=R3UkzssCwqR4gT5zdk8bSJ1dUUgMCxdDZzcvGyetAK/o9oFU75+a/hRhTC84ctV/zJVcERqHSPXW7p+1XWsFWPpjucgB6hxSySxjnQUR6s031wgtexT5DKf/+5SsQTrTRh6ukKy7uYgDoeJ4Z68Sdvbn+OZBdkqNlBzeuyWaOniH9JKFPmF6uci6k1mcaEQ3L+hCyyhsszehGhr6QiDXRJZPebQRK2xYfWo8S4W2RQSUdAlW8nPRZjNulA/lZhTZYWX9f3Dy/93KNcL1D7cCF2c7ImWZI71+BQSzcH92Ojpthv9caoC3Tw8YZq1v9t/7wnOfr3G26IRXmlxwN45MJQ== 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-SenderADCheck; bh=ZcgJbCOoYhVBVHm+yyGajo9ZHOLHWjGODYxQLcNoo1k=; b=cyLhB6zn1hBL0MRBlalhlsPCP34lUAlI2A+GyUxEODuMO4j9cvxzVKDUpneMSW0SKyTB3oiVRxW2fynhxObG6wSJlWcqbTP17lEYYB2MFzE5sQoao76cX0SmVwDaHbBX9BHk+F8cGjndbe9a/rnc8Fr1n5Kp3Xq0TdCuQVpFxfI3Y2kphhIRD6d/yvSlw4t3iAYezq8iEQcUI5bT9AmbQI+CwhHPri8KF/AnfP09dR27r4fJGvgPNmdoH8ZwtjMAZ2DTyuMpYY8VUjcxXjK/4OihGvxpHBfm0dDta7DiqqovhlyDVoyZNKeQrjrL3e/ZVqLYrf/xD4kTOV4LQhMCgg== 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=ZcgJbCOoYhVBVHm+yyGajo9ZHOLHWjGODYxQLcNoo1k=; b=j9OqNUa3FtA9B80PQEVD3vLvCEgz5EHuLl+N9k/In8HKfpXOMBP2nJQhMc+9GzrTJONJdBULY9+KmQF9hCKoVDPb6wS1jeeOPfS3Km2cJnBIBA8oOC+svsLIx7Ju7RlCkZrfkDqJNfGfT9swfrSt9KiXl7k+JINzo3lhgpSnU60= Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com (10.168.62.22) by VI1PR0801MB1695.eurprd08.prod.outlook.com (10.168.67.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2073.14; Tue, 16 Jul 2019 13:31:00 +0000 Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::dcfd:3eda:5cf:aef7]) by VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::dcfd:3eda:5cf:aef7%5]) with mapi id 15.20.2073.012; Tue, 16 Jul 2019 13:31:00 +0000 From: Wilco Dijkstra To: GCC Patches CC: nd Subject: [COMMITTED][GCC7][GCC8] Backport PR89222 (ARM thumb-2 misoptimisation of func ptr call with -O2 or -Os) Date: Tue, 16 Jul 2019 13:31:00 +0000 Message-ID: Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; X-Microsoft-Antispam-Untrusted: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020); SRVR:VI1PR0801MB1695; x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:5797;OLM:5797; X-Forefront-Antispam-Report-Untrusted: SFV:NSPM; SFS:(10009020)(4636009)(136003)(366004)(376002)(346002)(39860400002)(396003)(199004)(189003)(316002)(99286004)(81166006)(3846002)(8936002)(6436002)(6116002)(81156014)(68736007)(66066001)(478600001)(486006)(25786009)(33656002)(476003)(6506007)(102836004)(7696005)(2906002)(53936002)(9686003)(186003)(26005)(66946007)(8676002)(305945005)(7736002)(4326008)(256004)(55016002)(14444005)(52536014)(71200400001)(64756008)(66556008)(76116006)(66446008)(91956017)(66476007)(74316002)(71190400001)(6916009)(14454004)(86362001)(5660300002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0801MB1695; H:VI1PR0801MB2127.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info-Original: xs2tlOr49CmSxbE3EtnEbHTYv4vYuv5VpvF68I5FGkk4ZtTehKP2GPBlPvjyDXHd++SR57QYlS8BKal054E2xsZMOahhAoqoZQAjVD3siGAnAAZdEesYS/OSgyLKRJ9NwpQL+TsZ7eB5/DrYxlCZnHTsTZlhbTY/71SGUzvU+HYs3lI7acgXzLDtbrOqkDDhaxUmuKfNk5vR098q5IhCpWbhda4UdUZmQ4nV75VdIUn6IPSLr2P3TuGcooq21RNPtbvgaFEhywdb1tZAgHPNrDTFj3mZKDDndV10NkQY58RonJpfV1LfSyco+uWdeA84SWA7ZuWasLH04lopgkKtOJotpknHckOVGvzRo7TLZYKpz3Y3fIcBV2aJWgOqJ2/fmMlCkNoYFRMP8O3wI1GFesUgJquWsFtuUNFphFd0tXk= MIME-Version: 1.0 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; X-MS-Exchange-Transport-CrossTenantHeadersStripped: VE1EUR03FT013.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: a6221f05-ff5b-401d-d181-08d709f1d7a8 Hi, I've backported PR89222 to GCC7 and GCC8 branches so it's now fixed on all active branches. Wilco [ARM] Fix PR89222 The GCC optimizer can generate symbols with non-zero offset from simple if-statements. Bit zero is used for the Arm/Thumb state bit, so relocations with offsets fail if it changes bit zero and the relocation forces bit zero to true. The fix is to disable offsets on function pointer symbols. gcc/ PR target/89222 * config/arm/arm.md (movsi): Use targetm.cannot_force_const_mem to decide when to split off a non-zero offset from a symbol. * config/arm/arm.c (arm_cannot_force_const_mem): Disallow offsets in function symbols. testsuite/ PR target/89222 * gcc.target/arm/pr89222.c: Add new test. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index f07f4cc47b6cfcea8f44960bf4760ea9a46b8f87..69b74a237a5f10b4137aa995ad43b77d6ecd04db 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -8940,11 +8940,16 @@ static bool arm_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) { rtx base, offset; + split_const (x, &base, &offset); - if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P) + if (SYMBOL_REF_P (base)) { - split_const (x, &base, &offset); - if (GET_CODE (base) == SYMBOL_REF + /* Function symbols cannot have an offset due to the Thumb bit. */ + if ((SYMBOL_REF_FLAGS (base) & SYMBOL_FLAG_FUNCTION) + && INTVAL (offset) != 0) + return true; + + if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P && !offset_within_block_p (base, INTVAL (offset))) return true; } diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index aa759624f8f617576773aa75fd6239d6e06e8a13..88110cb732b52866d4fdcad70fd5a202aa62bd03 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -5981,53 +5981,29 @@ (define_expand "movsi" } } - if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P) + split_const (operands[1], &base, &offset); + if (INTVAL (offset) != 0 + && targetm.cannot_force_const_mem (SImode, operands[1])) { - split_const (operands[1], &base, &offset); - if (GET_CODE (base) == SYMBOL_REF - && !offset_within_block_p (base, INTVAL (offset))) - { - tmp = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0]; - emit_move_insn (tmp, base); - emit_insn (gen_addsi3 (operands[0], tmp, offset)); - DONE; - } + tmp = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0]; + emit_move_insn (tmp, base); + emit_insn (gen_addsi3 (operands[0], tmp, offset)); + DONE; } + tmp = can_create_pseudo_p () ? NULL_RTX : operands[0]; + /* Recognize the case where operand[1] is a reference to thread-local - data and load its address to a register. */ + data and load its address to a register. Offsets have been split off + already. */ if (arm_tls_referenced_p (operands[1])) - { - rtx tmp = operands[1]; - rtx addend = NULL; - - if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS) - { - addend = XEXP (XEXP (tmp, 0), 1); - tmp = XEXP (XEXP (tmp, 0), 0); - } - - gcc_assert (GET_CODE (tmp) == SYMBOL_REF); - gcc_assert (SYMBOL_REF_TLS_MODEL (tmp) != 0); - - tmp = legitimize_tls_address (tmp, - !can_create_pseudo_p () ? operands[0] : 0); - if (addend) - { - tmp = gen_rtx_PLUS (SImode, tmp, addend); - tmp = force_operand (tmp, operands[0]); - } - operands[1] = tmp; - } + operands[1] = legitimize_tls_address (operands[1], tmp); else if (flag_pic && (CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1]) || label_mentioned_p (operands[1]))) - operands[1] = legitimize_pic_address (operands[1], SImode, - (!can_create_pseudo_p () - ? operands[0] - : NULL_RTX), NULL_RTX, - false /*compute_now*/); + operands[1] = + legitimize_pic_address (operands[1], SImode, tmp); } " ) diff --git a/gcc/testsuite/gcc.target/arm/pr89222.c b/gcc/testsuite/gcc.target/arm/pr89222.c new file mode 100644 index 0000000000000000000000000000000000000000..d26d7df17544db8426331e67b9a36d749ec6c6d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr89222.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void g (void); + +void f1 (int x) +{ + if (x != (int) g + 3) + return; + g(); +} + +void (*a2)(void); + +void f2 (void) +{ + a2 = &g + 3; +} + +typedef void (*__sighandler_t)(int); +void handler (int); + +void f3 (int x) +{ + __sighandler_t h = &handler; + if (h != (__sighandler_t) 2 && h != (__sighandler_t) 1) + h (x); +} + +/* { dg-final { scan-assembler-times {add(?:s)?\tr[0-9]+, r[0-9]+, #3} 2 } } */ +/* { dg-final { scan-assembler-not {.word\tg\+3} } } */ +/* { dg-final { scan-assembler-not {.word\thandler-1} } } */