From patchwork Thu Apr 25 15:43:30 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 239554 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 7EF302C0100 for ; Fri, 26 Apr 2013 01:43:43 +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:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=Kpoicp6XnFgVgGzNQ TDw5G352ARcpNeHz2iiaqah15DzKbd0vELNWRW79yxdhb7eSPeIFh/CPsnlOmmPc c/tHajRno/cMPeCp0eHVaKK6HZKfBScMFcoozEgGRxrCQJBwx82qVMU1DHZdWhfk PUjXXdz7J2TwA+NfgDu4H9dEpg= 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:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=default; bh=D66c7SQng7HUfLCE6GbCUi3 /6to=; b=PKBy8YDm9tw2HIXrhKL4yGzwCMB/FdIO5rAJdihzRoT5Odv2mP0/xEG PXoFCpoEp1tFIoXclZSg7pC/GAtIhGzzXPsBNAEYVm+Y1VrlCpnaXq7YhY0ZwXDh VQtJaAl5qm+O99mcPk1E5fij4SKFJmjytI15DKZoWhduoFoaQVRA= Received: (qmail 22538 invoked by alias); 25 Apr 2013 15:43:36 -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 22529 invoked by uid 89); 25 Apr 2013 15:43:36 -0000 X-Spam-SWARE-Status: No, score=-6.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_HOSTKARMA_W, RCVD_IN_HOSTKARMA_WL, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS, TW_RV autolearn=ham version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Thu, 25 Apr 2013 15:43:35 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFhYwC007869 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Apr 2013 11:43:34 -0400 Received: from redhat.com (ovpn-116-41.ams2.redhat.com [10.36.116.41]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFhUSA005846 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 25 Apr 2013 11:43:32 -0400 Date: Thu, 25 Apr 2013 17:43:30 +0200 From: Marek Polacek To: Jakub Jelinek Cc: Richard Biener , GCC Patches Subject: Re: [PATCH] Fix folding of logb (-Inf) (PR tree-optimization/57066) Message-ID: <20130425154330.GQ13346@redhat.com> References: <20130425132350.GM13346@redhat.com> <20130425151630.GO13346@redhat.com> <20130425152448.GP13346@redhat.com> <20130425153129.GH28963@tucnak.redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20130425153129.GH28963@tucnak.redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Apr 25, 2013 at 05:31:29PM +0200, Jakub Jelinek wrote: > > + /* For logb(-Inf) we have to return +Inf. */ > > + if (value->cl == rvc_inf && !tree_expr_nonnegative_p (arg)) > > Why not > if (value->cl == rvc_inf && value->sign) > or > if (real_isinf (value) && real_isneg (value)) > instead? That's better, yeah. I was searching for something that tells me whether *tree* is negative, and not REAL_VALUE_TYPE. I like the second variant more. Thanks. Ok for trunk/4.8/4.7? 2013-04-25 Marek Polacek * builtins.c (fold_builtin_logb): Return +Inf for -Inf. * gcc.dg/torture/builtin-logb-1.c: Adjust testcase. Marek --- gcc/builtins.c.mp 2013-04-25 12:52:37.463451032 +0200 +++ gcc/builtins.c 2013-04-25 17:37:50.846784390 +0200 @@ -9698,7 +9698,16 @@ fold_builtin_logb (location_t loc, tree case rvc_inf: /* If arg is Inf or NaN and we're logb, return it. */ if (TREE_CODE (rettype) == REAL_TYPE) - return fold_convert_loc (loc, rettype, arg); + { + /* For logb(-Inf) we have to return +Inf. */ + if (real_isinf (value) && real_isneg (value)) + { + REAL_VALUE_TYPE tem; + real_inf (&tem); + return build_real (rettype, tem); + } + return fold_convert_loc (loc, rettype, arg); + } /* Fall through... */ case rvc_zero: /* Zero may set errno and/or raise an exception for logb, also --- gcc/testsuite/gcc.dg/torture/builtin-logb-1.c.mp 2013-04-25 13:23:18.408224450 +0200 +++ gcc/testsuite/gcc.dg/torture/builtin-logb-1.c 2013-04-25 17:22:42.459765203 +0200 @@ -48,25 +48,25 @@ extern void link_error(int); /* Test if FUNCRES(FUNC(NEG FUNCARG(ARGARG))) is false. Check the sign as well. */ #ifndef __SPU__ -#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES) do { \ +#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES,NEG2) do { \ if (!__builtin_##FUNCRES##f(__builtin_##FUNC(NEG __builtin_##FUNCARG##f(ARGARG))) \ - || CKSGN_F(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG)), NEG __builtin_##FUNCARG##f(ARGARG))) \ + || CKSGN_F(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG)), NEG2 __builtin_##FUNCARG##f(ARGARG))) \ link_error(__LINE__); \ if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG))) \ - || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG __builtin_##FUNCARG(ARGARG))) \ + || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG2 __builtin_##FUNCARG(ARGARG))) \ link_error(__LINE__); \ if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG))) \ - || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG __builtin_##FUNCARG##l(ARGARG))) \ + || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG2 __builtin_##FUNCARG##l(ARGARG))) \ link_error(__LINE__); \ } while (0) #else -#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES) do { \ +#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES,NEG2) do { \ /* SPU single-precision floating point format does not support Inf or Nan. */ \ if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG))) \ - || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG __builtin_##FUNCARG(ARGARG))) \ + || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG2 __builtin_##FUNCARG(ARGARG))) \ link_error(__LINE__); \ if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG))) \ - || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG __builtin_##FUNCARG##l(ARGARG))) \ + || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG2 __builtin_##FUNCARG##l(ARGARG))) \ link_error(__LINE__); \ } while (0) #endif @@ -173,15 +173,15 @@ foo(void) /* Test for f(+-Inf) -> +-Inf and f(+-NaN) -> +-NaN, regardless of the radix. */ - TESTIT3 (logb, ,inf, , isinf); - TESTIT3 (logb, - ,inf, , isinf); - TESTIT3 (logb, ,nan, "", isnan); - TESTIT3 (logb, - ,nan, "", isnan); - - TESTIT3 (significand, ,inf, , isinf); - TESTIT3 (significand, - ,inf, , isinf); - TESTIT3 (significand, ,nan, "", isnan); - TESTIT3 (significand, - ,nan, "", isnan); + TESTIT3 (logb, ,inf, , isinf, ); + TESTIT3 (logb, - ,inf, , isinf, ); + TESTIT3 (logb, ,nan, "", isnan, ); + TESTIT3 (logb, - ,nan, "", isnan, -); + + TESTIT3 (significand, ,inf, , isinf, ); + TESTIT3 (significand, - ,inf, , isinf, -); + TESTIT3 (significand, ,nan, "", isnan, ); + TESTIT3 (significand, - ,nan, "", isnan, -); } int main()