From patchwork Tue Jun 10 09:23:57 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 357806 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 215F3140087 for ; Tue, 10 Jun 2014 19:24:09 +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:content-type; q= dns; s=default; b=vPTubjAwdpdDSvCbbbpE45KV3S9u+1ZPtFWWd3/BmWpATl JkMt0qaeN6Vv1MOZ3UqzRunoOID1uaFNuaarYKlT2CfUMzkg0BinMAcFDZ30kqO5 mDzLDQgEEupmHMPRNroKKmotv4A1f5/i2E91Sgnkd1nNqBbVsfaOC93i9W6Uc= 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:content-type; s= default; bh=1Esl8MMGX72cGEF7h4HiPGCetK4=; b=FFNS76EbI/bFu7wcXxCJ ka1ayb2jgBO00QG7PDctrdBGbyMnttHtbas+wTS1bSMwDmEZIK+KUYheXau0pU1c wEwhfsoxPhv9+xRtUspTtk/Npm6lPwf1yvvOEzbIH1Xg50Pw1eeOc4t0AGdI8sIO Fe1OvZi4kGfy0ZpTzt9fMVI= Received: (qmail 756 invoked by alias); 10 Jun 2014 09:24:03 -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 730 invoked by uid 89); 10 Jun 2014 09:24:01 -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-f43.google.com Received: from mail-la0-f43.google.com (HELO mail-la0-f43.google.com) (209.85.215.43) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 10 Jun 2014 09:24:00 +0000 Received: by mail-la0-f43.google.com with SMTP id mc6so3827864lab.30 for ; Tue, 10 Jun 2014 02:23:57 -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 :content-type; bh=JPAZj/DTizyDe/rQh4CbPTy6H88Lgt0EZfDCcLKC8r4=; b=gvXo9gxD8zxKx/UYxDrlfh/09npQUHz/sU8JOurBHLmRck3CaTQVhOQOGmtx0UX46d Gd4IA3kU19CPnYWnV9KGQ/T+v8fpiLMcD7qpN1S+TZw3gOJKmNt3VaW+Luq8TEx32tvq GTpXVxKgIXUhVZhrcaS1z16uTXEUdD5lMAG7SPX1BhVDbCeN9VX5klJNPgkGmhmbERr3 ztkg4x9bJcUjupviV1jWR1rJ2MnLmvFFlZk5Sv6bxsAIoVZXTqj0Lv/sgOs/9SEXSDfy Dg+fGIQSAg12AAY7V6RCP3RcDtfW5LWxLljRTzvOaCDY+up22uUZwo+FcKHwYjLLuC0j KY2g== X-Gm-Message-State: ALoCoQn5bZfJywmecIqFOypdfUzw0CS3bvfGoQqLl7sJ/C/P6aQnl4NO2BOmcF8x05JzwUCwzBRB MIME-Version: 1.0 X-Received: by 10.152.121.39 with SMTP id lh7mr21108887lab.7.1402392237295; Tue, 10 Jun 2014 02:23:57 -0700 (PDT) Received: by 10.112.13.36 with HTTP; Tue, 10 Jun 2014 02:23:57 -0700 (PDT) Date: Tue, 10 Jun 2014 17:23:57 +0800 Message-ID: Subject: [PATCH, loop2_invariant, 2/2] Change heuristics for identical invariants From: Zhenqiang Chen To: "gcc-patches@gcc.gnu.org" X-IsSubscribed: yes Hi, When analysing logs of loop2-invariant of eembc, I found the same invariant occurred lots of times in a loop. But it was not selected since its cost was not high and register pressure was high. Logs show performance improvement by giving them higher priority to move. The patch changes the heuristics to move identical invariants: * add a new member eqno, which records the number of invariants eqto the inv. * set its cost to: inv->cost * inv->eqno; * compare with spill_cost if register pressure is high. Bootstrap and no make check regression on X86-64. Bootstrap and no make check regression on X86-64 with flag_ira_loop_pressure = true. OK for trunk? Thanks! -Zhenqiang ChangeLog: 2014-06-10 Zhenqiang Chen * loop-invariant.c (struct invariant): Add a new member: eqno; (find_identical_invariants): Update eqno; (create_new_invariant): Init eqno; (get_inv_cost): Compute comp_cost wiht eqno; (gain_for_invariant): Take spill cost into account. return; @@ -513,7 +517,12 @@ find_identical_invariants (invariant_htab_type eq, struct invariant *inv) mode = GET_MODE (expr); if (mode == VOIDmode) mode = GET_MODE (SET_DEST (set)); - inv->eqto = find_or_insert_inv (eq, expr, mode, inv)->invno; + + tmp = find_or_insert_inv (eq, expr, mode, inv); + inv->eqto = tmp->invno; + + if (tmp->invno != inv->invno && inv->always_executed) + tmp->eqno++; if (dump_file && inv->eqto != inv->invno) fprintf (dump_file, @@ -725,6 +734,10 @@ create_new_invariant (struct def *def, rtx insn, bitmap depends_on, inv->invno = invariants.length (); inv->eqto = ~0u; + + /* Itself. */ + inv->eqno = 1; + if (def) def->invno = inv->invno; invariants.safe_push (inv); @@ -1107,7 +1120,7 @@ get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed, if (!inv->cheap_address || inv->def->n_addr_uses < inv->def->n_uses) - (*comp_cost) += inv->cost; + (*comp_cost) += inv->cost * inv->eqno; #ifdef STACK_REGS { @@ -1243,7 +1256,13 @@ gain_for_invariant (struct invariant *inv, unsigned *regs_needed, + IRA_LOOP_RESERVED_REGS - ira_class_hard_regs_num[cl]; if (size_cost > 0) - return -1; + { + int spill_cost = target_spill_cost [speed] * (int) regs_needed[cl]; + if (comp_cost <= spill_cost) + return -1; + + return 2; + } else size_cost = 0; } diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 92388f5..c43206a 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -104,6 +104,9 @@ struct invariant /* The number of the invariant with the same value. */ unsigned eqto; + /* The number of invariants which eqto this. */ + unsigned eqno; + /* If we moved the invariant out of the loop, the register that contains its value. */ rtx reg; @@ -498,6 +501,7 @@ find_identical_invariants (invariant_htab_type eq, struct invariant *inv) struct invariant *dep; rtx expr, set; enum machine_mode mode; + struct invariant *tmp; if (inv->eqto != ~0u)