From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5444 invoked by alias); 14 Jul 2014 20:11:14 -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 5431 invoked by uid 89); 14 Jul 2014 20:11:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wi0-f173.google.com Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com) (209.85.212.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 14 Jul 2014 20:11:10 +0000 Received: by mail-wi0-f173.google.com with SMTP id f8so2329169wiw.12 for ; Mon, 14 Jul 2014 13:11:06 -0700 (PDT) X-Received: by 10.180.106.66 with SMTP id gs2mr223442wib.5.1405368666640; Mon, 14 Jul 2014 13:11:06 -0700 (PDT) Received: from [10.0.0.2] (194-96-89-30.adsl.highway.telekom.at. [194.96.89.30]) by mx.google.com with ESMTPSA id ed15sm34861603wic.9.2014.07.14.13.11.05 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Jul 2014 13:11:05 -0700 (PDT) From: "Bernhard Reutner-Fischer" To: Kugan , Richard Biener CC: Jakub Jelinek , Date: Mon, 14 Jul 2014 20:11:00 -0000 Message-ID: <147367fe080.2763.0f39ed3bcad52ef2c88c90062b7714dc@gmail.com> In-Reply-To: <53C34734.2080103@linaro.org> References: <53A9658F.2070304@linaro.org> <53A966BF.30806@linaro.org> <20140624122101.GX31640@tucnak.redhat.com> <53AA8501.809@linaro.org> <20140625083618.GZ31640@tucnak.redhat.com> <53BA4458.30804@linaro.org> <53BFD000.1030909@linaro.org> <53C34734.2080103@linaro.org> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 AquaMail/1.4.0.30 (build: 2100451) Subject: Re: [PATCH 2/2] Enable elimination of zext/sext MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2014-07/txt/msg01010.txt.bz2 On 14 July 2014 04:58:17 Kugan wrote: > On 11/07/14 22:47, Richard Biener wrote: > > On Fri, Jul 11, 2014 at 1:52 PM, Kugan > > wrote: > >> Thanks foe the review and suggestions. > >> > >> On 10/07/14 22:15, Richard Biener wrote: > >>> On Mon, Jul 7, 2014 at 8:55 AM, Kugan > wrote: > >> > >> [...] > >> > >>>> > >>>> For -fwrapv, it is due to how PROMOTE_MODE is defined in arm back-end. > >>>> In the test-case, a function (which has signed char return type) returns > >>>> -1 in one of the paths. ARM PROMOTE_MODE changes that to 255 and relies > >>>> on zero/sign extension generated by RTL again for the correct value. I > >>>> saw some other targets also defining similar think. I am therefore > >>>> skipping removing zero/sign extension if the ssa variable can be set to > >>>> negative integer constants. > >>> > >>> Hm? I think you should rather check that you are removing a > >>> sign-/zero-extension - PROMOTE_MODE tells you if it will sign- or > >>> zero-extend. Definitely > >>> > >>> + /* In some architectures, negative integer constants are truncated and > >>> + sign changed with target defined PROMOTE_MODE macro. This will impact > >>> + the value range seen here and produce wrong code if zero/sign > extensions > >>> + are eliminated. Therefore, return false if this SSA can have negative > >>> + integers. */ > >>> + if (is_gimple_assign (stmt) > >>> + && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_unary)) > >>> + { > >>> + tree rhs1 = gimple_assign_rhs1 (stmt); > >>> + if (TREE_CODE (rhs1) == INTEGER_CST > >>> + && !TYPE_UNSIGNED (TREE_TYPE (ssa)) > >>> + && tree_int_cst_compare (rhs1, integer_zero_node) == -1) > >>> + return false; > >>> > >>> looks completely bogus ... (an unary op with a constant operand?) > >>> instead you want to do sth like > >> > >> I see that unary op with a constant operand is not possible in gimple. > >> What I wanted to check here is any sort of constant loads; but seems > >> that will not happen in gimple. Is PHI statements the only possible > >> statements where we will end up with such constants. > > > > No, in theory you can have > > > > ssa_1 = -1; > > > > but that's not unary but a GIMPLE_SINGLE_RHS and thus > > gimple_assign_rhs_code (stmt) == INTEGER_CST. > > > >>> mode = TYPE_MODE (TREE_TYPE (ssa)); > >>> rhs_uns = TYPE_UNSIGNED (TREE_TYPE (ssa)); > >>> PROMOTE_MODE (mode, rhs_uns, TREE_TYPE (ssa)); > >>> > >>> instead of initializing rhs_uns from ssas type. That is, if > >>> PROMOTE_MODE tells you to promote _not_ according to ssas sign then > >>> honor that. > >> > >> This is triggered in pr43017.c in function foo for arm-none-linux-gnueabi. > >> > >> where, the gimple statement that cause this looks like: > >> ..... > >> # _3 = PHI <_17(7), -1(2)> > >> bb43: > >> return _3; > >> > >> ARM PROMOTE_MODE changes the sign for integer constants only and hence > >> looking at the variable with PROMOTE_MODE is not changing the sign in > >> this case. > >> > >> #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \ > >> if (GET_MODE_CLASS (MODE) == MODE_INT \ > >> && GET_MODE_SIZE (MODE) < 4) \ > >> { \ > >> if (MODE == QImode) \ > >> UNSIGNEDP = 1; \ > >> else if (MODE == HImode) \ > >> UNSIGNEDP = 1; \ > >> (MODE) = SImode; \ > >> } > > > > Where does it only apply for "constants"? It applies to all QImode and > > HImode entities. > > oops, sorry. I don’t know what I was thinking or looking at when I wrote > that :( It indeed fixes my problems. Thanks for that. > > Here is the modified patch. Bootstrapped and regression tested for > 86_64-unknown-linux-gnu and arm-none-linux-gnueabi with no new regressions. > > > Is this OK? > > Thanks, > Kugan > > > gcc/ > > 2014-07-14 Kugan Vivekanandarajah > > * calls.c (precompute_arguments): Check is_promoted_for_type > and set the promoted mode. > (is_promoted_for_type): New function. Don't we name predicates more like promoted_for_type_p? Thanks, > (expand_expr_real_1): Check is_promoted_for_type > and set the promoted mode. > * expr.h (is_promoted_for_type): New function definition. > * cfgexpand.c (expand_gimple_stmt_1): Call emit_move_insn if > SUBREG is promoted with SRP_SIGNED_AND_UNSIGNED. > > > gcc/testsuite > 2014-07-14 Kugan Vivekanandarajah > > * gcc.dg/zero_sign_ext_test.c: New test. Sent with AquaMail for Android http://www.aqua-mail.com