From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 51556 invoked by alias); 31 May 2017 09:00:47 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 51405 invoked by uid 89); 31 May 2017 09:00:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 31 May 2017 09:00:43 +0000 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9B4ED80F7B; Wed, 31 May 2017 09:00:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9B4ED80F7B Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jakub@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9B4ED80F7B Received: from tucnak.zalov.cz (unknown [10.36.118.76]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2C7DA17497; Wed, 31 May 2017 09:00:44 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id v4V90g4v017238; Wed, 31 May 2017 11:00:42 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id v4V90f64017237; Wed, 31 May 2017 11:00:41 +0200 Date: Wed, 31 May 2017 09:08:00 -0000 From: Jakub Jelinek To: Georg-Johann Lay Cc: Jeff Law , gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Optimize divmod expansion (PR middle-end/79665) Message-ID: <20170531090041.GR24023@tucnak> Reply-To: Jakub Jelinek References: <20170222214046.GA1849@tucnak> <99048e22-aedc-df95-f1fe-dc1eaffd58b1@gjlay.de> <20170531081554.GP24023@tucnak> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.1 (2016-10-04) X-IsSubscribed: yes X-SW-Source: 2017-05/txt/msg02325.txt.bz2 On Wed, May 31, 2017 at 10:48:07AM +0200, Georg-Johann Lay wrote: > > > because divmod in not a single_set: > > > (gdb) p seq > > > $10 = (const rtx_insn *) 0x7ffff730d500 > > > (gdb) pr > > > warning: Expression is not an assignment (and might have no effect) > > > (insn 14 13 0 (parallel [ > > > (set (reg:HI 52) > > > (div:HI (reg:HI 47) > > > (reg:HI 54))) > > > (set (reg:HI 53) > > > (mod:HI (reg:HI 47) > > > (reg:HI 54))) > > > (clobber (reg:QI 21 r21)) > > > (clobber (reg:HI 22 r22)) > > > (clobber (reg:HI 24 r24)) > > > (clobber (reg:HI 26 r26)) > > > ]) "scale.c":7 -1 > > > (nil)) > > > (gdb) > > > > > > Hence the divmod appears to be much less expensive than the unsigned > > > variant that computed the costs for mult_highpart. > > > > Then you should fix the cost computation - be able to use a target hook > > on insns that are not a single set or something similar. > > Are you saying that cost computation in GCC is fundamentally flawed > for anything that it not a single_set? The division/modulo optimization I've added as well as many other spots in GCC rely on reasonable cost, just grep e.g. all places that call seq_cost. So, if it returns something that is a very wrong estimate, it won't affect just that single optimization, but all others. Therefore, you should fix the cost computation, rather than disabling all the places that use the costs. Many targets have instructions with multiple sets, so I'm surprised assuming cost of 1 for them doesn't break many more things. I think either we should have a separate target hook for multiple sets instructions, or just call the targetm.rtx_costs on the PARALLEL in that case and see if the targets compute something reasonable for it, otherwise either use the cost of the first set, or maximum of all sets (that might be best) or something similar. Jakub