From patchwork Thu Jul 3 05:31:28 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 366563 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 649051400DD for ; Thu, 3 Jul 2014 15:32:13 +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=QaU7rRKRuEDBMKmdxIF3P81nVQRnMzOqe2E4+f0+3I0 WxqOZqKu9PJySSa3sunQkOFXz5ZyjF+TSHpDzjbruHan0Bp4cEC1eNmvpA3DBYTr tZAKhj980SIgZQhMlx44S/blcQz0CjD9SiCFlF+hOIWru5tw4Fw2b1av8L+3VLI0 = 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=aqVxTf8oFGFziCz2RDTw5LWBFVE=; b=y6DyYdBDfJ/71mKgw e+v12pFIeextWRFg8HGLNOGlXM3zgeyZVGEwak5ueX+FNOTeXwqyrgpTxK6KXsgY o73FEtvPtVq4xt0SVM6qTZqjzC0/fWHgZDZKFnW0Lvo4S6vpJKeH7MrBz+28dCmv 81ftXIF4Emf/qbFaCn6wSbtF00= Received: (qmail 17280 invoked by alias); 3 Jul 2014 05:32:00 -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 17173 invoked by uid 89); 3 Jul 2014 05:31:50 -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-f48.google.com Received: from mail-la0-f48.google.com (HELO mail-la0-f48.google.com) (209.85.215.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 03 Jul 2014 05:31:32 +0000 Received: by mail-la0-f48.google.com with SMTP id el20so7615486lab.21 for ; Wed, 02 Jul 2014 22:31:28 -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=Axbdg+USXlzacPAuUkglnJm5a8qQRk5R5zwEM+b9oFE=; b=FKaozuddHpgTL92r45DdJvmNoT7Tf2CzNOsaXzbrHGZtuDfaPVx5rdjIqn6zI7lOQg DCS4grjtBiO439QlPRO2UKvGDfLfhXni6ftRewHEA32WvwhPe8KD+2Fc/+m9iUZs3Pfg ucYzi4YlAJCwyBVirBKp1wgrkzR19wYeGUKLRqgYAltUM6OTPgPLMhGa248WYwukMWuk THLFaB3zjFpyZxMPhIcLlVIT67kXq2QMjWimNf6BdFvN2hNutrgX5sOEWwAlk8JpPZfM cYLYIcO/6Pe6DHcg7gIMwtSSl0/v9DaTAyBo7CcrdZMtAQ46bpyQ/XhW7rPssBlyh7CQ 0btA== X-Gm-Message-State: ALoCoQnQwQjhonUJ9W3T75zeXtROLzuaWKL8q2V9nr38h7VKkDzeL5RPQrZz9KewSCrLoFBIk7oi MIME-Version: 1.0 X-Received: by 10.112.180.225 with SMTP id dr1mr1706543lbc.51.1404365488861; Wed, 02 Jul 2014 22:31:28 -0700 (PDT) Received: by 10.112.13.36 with HTTP; Wed, 2 Jul 2014 22:31:28 -0700 (PDT) Date: Thu, 3 Jul 2014 13:31:28 +0800 Message-ID: Subject: [Committed]: [PATCH, loop2_invariant, 2/2] Change heuristics for identical invariants From: Zhenqiang Chen To: Jeff Law Cc: Steven Bosscher , "gcc-patches@gcc.gnu.org" X-IsSubscribed: yes On 2 July 2014 03:54, Jeff Law wrote: > On 07/01/14 01:16, Zhenqiang Chen wrote: > >> >> ChangeLog: >> 2014-07-01 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; > > s/wiht/with/ > > Do you have a testcase for this? If at all possible I'd like to see some > kind of test to verify that this tracking results in better invariant > selection. Since the patch bases on the result of rtx_cost, it is hard to design a common test case. A testcase for ARM is added. > With some kind of test and the ChangeLog typo fixed, this is OK. Thanks. Updated and committed @r212256. ChangeLog: 2014-07-03 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 with eqno; testsuite/ChangeLog: 2014-07-03 Zhenqiang Chen * gcc.target/arm/identical-invariants.c: New test. + diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index d47d461..bd67eb9 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) 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, @@ -1136,7 +1149,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 { diff --git a/gcc/testsuite/gcc.target/arm/identical-invariants.c b/gcc/testsuite/gcc.target/arm/identical-invariants.c new file mode 100644 index 0000000..7762ce6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/identical-invariants.c @@ -0,0 +1,29 @@ +/* { dg-do compile { target { arm_thumb2_ok } } } */ +/* { dg-options "-O2 -fdump-rtl-loop2_invariant " } */ + +int t1, t2, t3, t4, t5, t6, t7, t8, t9, t10; +extern void foo2 (int *, int *, int *, int *, int *, int *); +extern int foo3 (int, int, int, int, int, int); +int foo (int a, int b, int c, int d) +{ + int i = a; + + for (; i > 0; i += b) + { + if (a > 0x1234567) + foo2 (&t1, &t2, &t3, &t4, &t5, &t6); + foo2 (&t1, &t2, &t3, &t4, &t5, &t6); + if (b > 0x1234567) + foo2 (&t7, &t2, &t8, &t4, &t5, &t6); + foo2 (&t1, &t2, &t3, &t4, &t5, &t6); + if (c > 0x1234567) + foo2 (&t1, &t9, &t10, &t4, &t5, &t6); + t2 = t5 - d; + } + + return foo3 (t1, t2, t3, t4, t5, t6); +} + +/* { dg-final { scan-rtl-dump "Decided to move invariant 0" "loop2_invariant" } } */ +/* { dg-final { cleanup-rtl-dump "loop2_invariant" } } */