From patchwork Mon Jun 23 02:53:27 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 362651 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5DBF714008D for ; Mon, 23 Jun 2014 12:53:42 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:cc:content-type; q=dns; s=default; b=JYfzb8binbT2mEEyM33dYR8wOVsSvRKchdtYXYoqvnJ AJavOuBWqP5obfaB/V2EPVamVkUyFPJJCkoGUbyNbiLp6R9qRp5H08NBIvzrZ7eC 4OowNhMxRJ5kti8+qmCkbIyUXbTUyDBPfsjupio4C4DOSYtw+x4lAv5KR38We/dc = 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 :mime-version:date:message-id:subject:from:to:cc:content-type; s=default; bh=qZVqFYDoxOzLP+KZxu4cNEoovFk=; b=eL6liosvawnaZxtoR 7iypZF13VVBEMCv6aLUn2j//nGRQivGGeD68FQCn6W7h7DqrLd1VaEiG1j8qH5a2 ug+96cph88xzgDL3cCtXhlU6msycWpzF6nD97wnFkrkeUzwzj4mj6yl0rzt0n61n TZAi6K82VcansWyn2XgAgzlpF8= Received: (qmail 18500 invoked by alias); 23 Jun 2014 02:53:34 -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 18487 invoked by uid 89); 23 Jun 2014 02:53:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-la0-f45.google.com Received: from mail-la0-f45.google.com (HELO mail-la0-f45.google.com) (209.85.215.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 23 Jun 2014 02:53:31 +0000 Received: by mail-la0-f45.google.com with SMTP id hr17so3721326lab.4 for ; Sun, 22 Jun 2014 19:53:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc :content-type; bh=RBi4Dn3F1/Op18dvlKUDlGci2IjIelm365/9EoZ0WY0=; b=QO+UGz1EaRwkUVf15zAXS3YF+y1dQp9TKVGpfcyk88+suXDcgTd9hRujrHkZb1j0v6 D2K5QcLOWtO+/r6mf4SS9pUFU6Nv//OQV86zfzdiOQ6KsAHjbhEj/PWLIT/jEKfGSI9M wLF0XE2XctXZ0wtVwGTrNN3sRXef6iV8CqJ0HS3He+yywYoJYsPDvRLiEppZ2SCrqnkd VO1bE2Cc4R5ng68RL04nYBgulxUIlw1X3jpjYjC3H6W+kERk6Wz77bnzIHjY4KFmqZi6 u5boJlUdkjsKHGSdCJYmw3NeTn8XL8Yc3W7FvLERElWNl6B/TfjCTay/0ln739yKX50b o14g== X-Gm-Message-State: ALoCoQk26vAktCFrdS0hRb6v7EgJiSS7+KEHo0l767mT1Cxc3da8cDRxlDj4B8OnvIWyxVkPIMtx MIME-Version: 1.0 X-Received: by 10.152.5.230 with SMTP id v6mr14830329lav.33.1403492007522; Sun, 22 Jun 2014 19:53:27 -0700 (PDT) Received: by 10.112.13.36 with HTTP; Sun, 22 Jun 2014 19:53:27 -0700 (PDT) Date: Mon, 23 Jun 2014 10:53:27 +0800 Message-ID: Subject: [Committed] [PATCH, loop2_invariant] Pre-check invariants From: Zhenqiang Chen To: Jeff Law Cc: Steven Bosscher , "gcc-patches@gcc.gnu.org" X-IsSubscribed: yes On 18 June 2014 05:32, Jeff Law wrote: > On 06/11/14 03:35, Zhenqiang Chen wrote: >> >> >> Thanks for the comments. df_live seams redundant. >> >> With flag_ira_loop_pressure, the pass will call df_analyze () at the >> beginning, which can make sure all the DF info are correct. >> >> Can we guarantee all DF_... correct without df_analyze ()? > > They should be fine in this context. > > > >> +/* Pre-check candidate DEST to skip the one which can not make a valid >> insn >> + during move_invariant_reg. SIMPlE is to skip HARD_REGISTER. */ > > s/SIMPlE/SIMPLE/ > > > >> + { >> + /* Multi definitions at this stage, most likely are due to >> + instruction constrain, which requires both read and >> write > > s/constrain/constraints/ > > Though that doesn't make sense. Constraints don't come into play until much > later in the pipeline. Certainly there's been code in the expanders and > elsewhere to try and make the code we generate more acceptable to 2-address > targets and that's probably what you're really running into. I think the > code is fine, but that you need to improve the comment. > > ISTM that if your primary focus is to filter out read/write operands, then > just say that and ignore the constraints or other mechanisms by which we got > a read/write pseudo. > > So I think with those two small comment changes, this patch is OK for the > trunk. Please post the final version for archival purposes before checking > it in. Thanks. Patch was installed @r211885 with the two comment changes and one more change to use FOR_EACH_INSN_INFO_DEF other than for (def_rec = DF_INSN_INFO_DEFS (insn_info); *def_rec; def_rec++) Bootstrap and no make check regression on X86-64. Index: gcc/loop-invariant.c =================================================================== --- gcc/loop-invariant.c (revision 211832) +++ gcc/loop-invariant.c (working copy) @@ -839,6 +839,39 @@ return true; } +/* Pre-check candidate DEST to skip the one which can not make a valid insn + during move_invariant_reg. SIMPLE is to skip HARD_REGISTER. */ +static bool +pre_check_invariant_p (bool simple, rtx dest) +{ + if (simple && REG_P (dest) && DF_REG_DEF_COUNT (REGNO (dest)) > 1) + { + df_ref use; + rtx ref; + unsigned int i = REGNO (dest); + struct df_insn_info *insn_info; + df_ref def_rec; + + for (use = DF_REG_USE_CHAIN (i); use; use = DF_REF_NEXT_REG (use)) + { + ref = DF_REF_INSN (use); + insn_info = DF_INSN_INFO_GET (ref); + + FOR_EACH_INSN_INFO_DEF (def_rec, insn_info) + if (DF_REF_REGNO (def_rec) == i) + { + /* Multi definitions at this stage, most likely are due to + instruction constraints, which requires both read and write + on the same register. Since move_invariant_reg is not + powerful enough to handle such cases, just ignore the INV + and leave the chance to others. */ + return false; + } + } + } + return true; +} + /* Finds invariant in INSN. ALWAYS_REACHED is true if the insn is always executed. ALWAYS_EXECUTED is true if the insn is always executed, unless the program ends due to a function call. */ @@ -868,7 +901,8 @@ || HARD_REGISTER_P (dest)) simple = false; - if (!may_assign_reg_p (SET_DEST (set)) + if (!may_assign_reg_p (dest) + || !pre_check_invariant_p (simple, dest) || !check_maybe_invariant (SET_SRC (set))) return;