From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8723 invoked by alias); 29 Jun 2011 17:36:37 -0000 Received: (qmail 8545 invoked by uid 22791); 29 Jun 2011 17:36:34 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-yx0-f175.google.com (HELO mail-yx0-f175.google.com) (209.85.213.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 29 Jun 2011 17:36:18 +0000 Received: by yxe1 with SMTP id 1so650010yxe.20 for ; Wed, 29 Jun 2011 10:36:17 -0700 (PDT) Received: by 10.236.161.197 with SMTP id w45mr1311989yhk.389.1309368977707; Wed, 29 Jun 2011 10:36:17 -0700 (PDT) Received: from napoca ([163.181.251.115]) by mx.google.com with ESMTPS id o47sm987158yhn.58.2011.06.29.10.36.15 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 29 Jun 2011 10:36:17 -0700 (PDT) Received: by napoca (sSMTP sendmail emulation); Wed, 29 Jun 2011 12:36:14 -0500 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: rguenther@suse.de, Sebastian Pop Subject: [PATCH 4/6] Fix computation of precision. Date: Wed, 29 Jun 2011 17:47:00 -0000 Message-Id: <1309368922-25238-5-git-send-email-sebpop@gmail.com> In-Reply-To: <1309368922-25238-1-git-send-email-sebpop@gmail.com> References: <1309368922-25238-1-git-send-email-sebpop@gmail.com> X-IsSubscribed: yes 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 X-SW-Source: 2011-06/txt/msg02267.txt.bz2 2011-06-29 Sebastian Pop * graphite-clast-to-gimple.c (precision_for_value): Removed. (precision_for_interval): Removed. (gcc_type_for_interval): Use mpz_sizeinbase. --- gcc/ChangeLog | 6 +++ gcc/graphite-clast-to-gimple.c | 77 +++++----------------------------------- 2 files changed, 15 insertions(+), 68 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 828559a..0616b10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2011-06-29 Sebastian Pop + * graphite-clast-to-gimple.c (precision_for_value): Removed. + (precision_for_interval): Removed. + (gcc_type_for_interval): Use mpz_sizeinbase. + +2011-06-29 Sebastian Pop + PR tree-optimization/47654 * graphite-blocking.c (pbb_strip_mine_time_depth): Do not return bool. (lst_do_strip_mine_loop): Return an int. diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c index 4a4c3d2..70031a0 100644 --- a/gcc/graphite-clast-to-gimple.c +++ b/gcc/graphite-clast-to-gimple.c @@ -379,72 +379,17 @@ clast_to_gcc_expression (tree type, struct clast_expr *e, return NULL_TREE; } -/* Return the precision needed to represent the value VAL. */ - -static int -precision_for_value (mpz_t val) -{ - mpz_t x, y, two; - int precision; - - mpz_init (x); - mpz_init (y); - mpz_init (two); - mpz_set_si (x, 2); - mpz_set (y, val); - mpz_set_si (two, 2); - precision = 1; - - if (mpz_sgn (y) < 0) - mpz_neg (y, y); - - while (mpz_cmp (y, x) >= 0) - { - mpz_mul (x, x, two); - precision++; - } - - mpz_clear (x); - mpz_clear (y); - mpz_clear (two); - - return precision; -} - -/* Return the precision needed to represent the values between LOW and - UP. */ - -static int -precision_for_interval (mpz_t low, mpz_t up) -{ - mpz_t diff; - int precision; - - gcc_assert (mpz_cmp (low, up) <= 0); - - mpz_init (diff); - mpz_sub (diff, up, low); - precision = precision_for_value (diff); - mpz_clear (diff); - - return precision; -} - -/* Return a type that could represent the integer value VAL. */ +/* Return a type that could represent the values between LOW and UP. + The value of LOW can be bigger than UP. */ static tree gcc_type_for_interval (mpz_t low, mpz_t up) { - bool unsigned_p = true; - int precision, prec_up, prec_int; + bool unsigned_p; tree type; enum machine_mode mode; - - gcc_assert (mpz_cmp (low, up) <= 0); - - prec_up = precision_for_value (up); - prec_int = precision_for_interval (low, up); - precision = MAX (prec_up, prec_int); + int precision = MAX (mpz_sizeinbase (low, 2), + mpz_sizeinbase (up, 2)); if (precision > BITS_PER_WORD) { @@ -452,14 +397,10 @@ gcc_type_for_interval (mpz_t low, mpz_t up) return integer_type_node; } - if (mpz_sgn (low) <= 0) - unsigned_p = false; - - else if (precision < BITS_PER_WORD) - { - unsigned_p = false; - precision++; - } + if (mpz_cmp (low, up) <= 0) + unsigned_p = (mpz_sgn (low) >= 0); + else + unsigned_p = (mpz_sgn (up) >= 0); mode = smallest_mode_for_size (precision, MODE_INT); precision = GET_MODE_PRECISION (mode); -- 1.7.4.1