From patchwork Mon Dec 5 22:46:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Botcazou X-Patchwork-Id: 86647 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1732335qgi; Mon, 5 Dec 2016 14:46:32 -0800 (PST) X-Received: by 10.99.55.30 with SMTP id e30mr105867034pga.75.1480977992884; Mon, 05 Dec 2016 14:46:32 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id p70si16227962pfd.221.2016.12.05.14.46.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 05 Dec 2016 14:46:32 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-443533-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-443533-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-443533-patch=linaro.org@gcc.gnu.org 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:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=n/6nbK+yHFLZrKJW BYbG/OcbZ6hrJ+sVoHOdxthKv/rufvJB6ns5LTeSPjHIT/ZXsY1/pBeb5XWb2z2e ESN0zBZIOsBHrZU7Qbx7DnN7GNdwZHQZNmh/l44smsIe/PNqPaxQaJR2hU+92GTD Td8AiKO3XSMhY/q2QWwVWy0hwA4= 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:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=Ut5Y/rUAl7mhgtrYRXMmwW aZ0fs=; b=ZKfPvN07uq9PxQUt+NmZ2/rfUxi0NQtlRhPzjvMJa+v8xWHHPHiL4K hxBq/igqEyA0x6RpCu+RiA9Xu6GLYMlJXvn6P+7zZh2pjsq1Pbf+2pNKVF69E7/y UZ0uvERljOwLYEMomlBIY7dXaK8YOKuJvUfDXdKaYSmwZJkjLnUxo= Received: (qmail 100784 invoked by alias); 5 Dec 2016 22:46:21 -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 100137 invoked by uid 89); 5 Dec 2016 22:46:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=treatment X-HELO: smtp.eu.adacore.com Received: from mel.act-europe.fr (HELO smtp.eu.adacore.com) (194.98.77.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 05 Dec 2016 22:46:06 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 0F604812E2 for ; Mon, 5 Dec 2016 23:46:04 +0100 (CET) Received: from smtp.eu.adacore.com ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nphkhFdO0SLw for ; Mon, 5 Dec 2016 23:46:03 +0100 (CET) Received: from polaris.localnet (bon31-6-88-161-99-133.fbx.proxad.net [88.161.99.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.eu.adacore.com (Postfix) with ESMTPSA id DD3FF812EC for ; Mon, 5 Dec 2016 23:46:03 +0100 (CET) From: Eric Botcazou To: gcc-patches@gcc.gnu.org Subject: [patch] Fix PR middle-end/78642 Date: Mon, 05 Dec 2016 23:46:03 +0100 Message-ID: <1685148.FU8hdjfjAj@polaris> User-Agent: KMail/4.14.10 (Linux/3.16.7-48-desktop; KDE/4.14.9; x86_64; ; ) MIME-Version: 1.0 Hi, this fixes the regressions introduced on SPARC by the newly reenabled RTL sharing verification. They come from the special treatment for CLOBBERs: case CLOBBER: /* Share clobbers of hard registers (like cc0), but do not share pseudo reg clobbers or clobbers of hard registers that originated as pseudos. This is needed to allow safe register renaming. */ if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER && ORIGINAL_REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 0))) return; in verify_rtx_sharing, copy_rtx_if_shared_1 and copy_insn_1. The problem is that the property ORIGINAL_REGNO == REGNO is not invariant for hard registers, because e.g. the leaf register optimization can change the REGNO. Therefore the attached patch only checks what's documented in the comment. Tested on x86-64/Linux and SPARC/Solaris, OK for the mainline? 2016-12-05 Eric Botcazou PR middle-end/78642 * emit-rtl.c (verify_rtx_sharing) : Relax condition. (copy_rtx_if_shared_1) : Likewise. (copy_insn_1) : Likewise. -- Eric Botcazou Index: emit-rtl.c =================================================================== --- emit-rtl.c (revision 243245) +++ emit-rtl.c (working copy) @@ -2718,8 +2718,9 @@ verify_rtx_sharing (rtx orig, rtx insn) /* Share clobbers of hard registers (like cc0), but do not share pseudo reg clobbers or clobbers of hard registers that originated as pseudos. This is needed to allow safe register renaming. */ - if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER - && ORIGINAL_REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 0))) + if (REG_P (XEXP (x, 0)) + && HARD_REGISTER_NUM_P (REGNO (XEXP (x, 0))) + && HARD_REGISTER_NUM_P (ORIGINAL_REGNO (XEXP (x, 0)))) return; break; @@ -2970,8 +2971,9 @@ repeat: /* Share clobbers of hard registers (like cc0), but do not share pseudo reg clobbers or clobbers of hard registers that originated as pseudos. This is needed to allow safe register renaming. */ - if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER - && ORIGINAL_REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 0))) + if (REG_P (XEXP (x, 0)) + && HARD_REGISTER_NUM_P (REGNO (XEXP (x, 0))) + && HARD_REGISTER_NUM_P (ORIGINAL_REGNO (XEXP (x, 0)))) return; break; @@ -5521,8 +5523,9 @@ copy_insn_1 (rtx orig) /* Share clobbers of hard registers (like cc0), but do not share pseudo reg clobbers or clobbers of hard registers that originated as pseudos. This is needed to allow safe register renaming. */ - if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER - && ORIGINAL_REGNO (XEXP (orig, 0)) == REGNO (XEXP (orig, 0))) + if (REG_P (XEXP (orig, 0)) + && HARD_REGISTER_NUM_P (REGNO (XEXP (orig, 0))) + && HARD_REGISTER_NUM_P (ORIGINAL_REGNO (XEXP (orig, 0)))) return orig; break;