From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31499 invoked by alias); 30 Jul 2010 12:06:27 -0000 Received: (qmail 31460 invoked by uid 22791); 30 Jul 2010 12:06:22 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from lo.gmane.org (HELO lo.gmane.org) (80.91.229.12) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 30 Jul 2010 12:06:05 +0000 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1OeoLg-0005pX-6i for gcc-patches@gcc.gnu.org; Fri, 30 Jul 2010 14:06:00 +0200 Received: from s209p8.home.99maxprogres.cz ([85.93.118.17]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 30 Jul 2010 14:06:00 +0200 Received: from bonzini by s209p8.home.99maxprogres.cz with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 30 Jul 2010 14:06:00 +0200 To: gcc-patches@gcc.gnu.org From: Paolo Bonzini Subject: Re: [PATCH][RFC] Bit CCP and pointer alignment propagation Date: Fri, 30 Jul 2010 12:39:00 -0000 Message-ID: <4C52C01E.4010202@gnu.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: gcc-patches@gcc.gnu.org User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100621 Fedora/3.0.5-1.fc13 Lightning/1.0b2pre Thunderbird/3.0.5 In-Reply-To: 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: 2010-07/txt/msg02324.txt.bz2 > + CONSTANT -> V_i has been found to hold a constant > + value C. "Some bits of V_i have been found to..." Or just remove/rewrite the head comment and move that comment here: > + /* Possible lattice values. */ > + typedef enum > + { > + UNINITIALIZED, > + UNDEFINED, > + CONSTANT, > + VARYING > + } ccp_lattice_t; > + val.bit_lattice_val > + = double_int_and > + (double_int_ior (r1val.bit_lattice_val, > + r2val.bit_lattice_val), > + double_int_and (double_int_ior (r1val.value, > + r1val.bit_lattice_val), > + double_int_ior (r2val.value, > + r2val.bit_lattice_val))); > + if (!double_int_minus_one_p (val.bit_lattice_val)) > + val.lattice_val = CONSTANT; In other places of this function you just set it to CONSTANT without the if. You can just set the lattice_val to CONSTANT here: > + bit_prop_value_t val = { VARYING, { -1, -1 }, { 0, 0 } }; and change it to VARYING ("if minus one then VARYING") at the end of the function. If no computation is done in the function, the bit_lattice_val will stay -1. > + case LSHIFT_EXPR: > + case RSHIFT_EXPR: > + if (r2val.lattice_val == CONSTANT > + && double_int_zero_p (r2val.bit_lattice_val)) Even if some bits are varying, the result will have at least r2val.value & ~r2val.bit_lattice_val bits shifted in. So you can do something like if (r2val.lattice_val != CONSTANT) break; if (double_int_zero_p (r2val.bit_lattice_val)) { in_mask = r1val.bit_lattice_val; in_value = r1val.value; } else { in_mask = double_int_minus_one; in_value = double_int_minus_one; } shift = r2val.value & ~r2val.bit_lattice_val; if (SHIFT_COUNT_TRUNCATED) shift &= GETMODE_BITSIZE (TYPE_MODE (type)) - 1; val.lattice_val = CONSTANT; val.bit_lattice_val = double_int_lshift (in_mask, shift, TYPE_PRECISION (type), false); val.value = double_int_lshift (in_value, shift, TYPE_PRECISION (type), false); > + else if (shift < 0) > + { > + val.lattice_val = CONSTANT; > + val.bit_lattice_val > + = double_int_rshift (r1val.bit_lattice_val, > + -shift, TYPE_PRECISION (type), true); > + val.value = double_int_rshift (r1val.value, shift, > + TYPE_PRECISION (type), true); > + } Here shifted in bits are varying for signed types (unless the sign bit is constant, but that's not handled here either). > + unsigned r1ctz = 0, r2ctz = 0; > + while (r1ctz < HOST_BITS_PER_WIDE_INT > + && !(r1val.bit_lattice_val.low & (1 << r1ctz)) > + && !(r1val.value.low & (1 << r1ctz))) > + r1ctz++; > + while (r2ctz < HOST_BITS_PER_WIDE_INT > + && !(r2val.bit_lattice_val.low & (1 << r2ctz)) > + && !(r2val.value.low & (1 << r2ctz))) > + r2ctz++; This is just a ctz on (v | m), no? This makes it easier to track high bits as well. I'm sure that you can optimize the addition, I'll think about it. Paolo From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31501 invoked by alias); 30 Jul 2010 12:06:28 -0000 Received: (qmail 31458 invoked by uid 22791); 30 Jul 2010 12:06:22 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mail-bw0-f47.google.com (HELO mail-bw0-f47.google.com) (209.85.214.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 30 Jul 2010 12:05:58 +0000 Received: by bwz10 with SMTP id 10so892841bwz.20 for ; Fri, 30 Jul 2010 05:05:56 -0700 (PDT) Received: by 10.204.45.207 with SMTP id g15mr1166990bkf.14.1280491556151; Fri, 30 Jul 2010 05:05:56 -0700 (PDT) Received: from yakj.usersys.redhat.com (s209p8.home.99maxprogres.cz [85.93.118.17]) by mx.google.com with ESMTPS id y27sm1483592bkw.2.2010.07.30.05.05.55 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 30 Jul 2010 05:05:55 -0700 (PDT) Message-ID: <4C52C01E.4010202@gnu.org> Date: Fri, 30 Jul 2010 12:54:00 -0000 From: Paolo Bonzini User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100621 Fedora/3.0.5-1.fc13 Lightning/1.0b2pre Thunderbird/3.0.5 MIME-Version: 1.0 Newsgroups: gmane.comp.gcc.patches To: Richard Guenther CC: gcc-patches@gcc.gnu.org Subject: Re: [PATCH][RFC] Bit CCP and pointer alignment propagation References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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: 2010-07/txt/msg02325.txt.bz2 Message-ID: <20100730125400.rf-ME5MYTAEXPOLBp-v800HvQByf-PYyIsZqfUa4XMA@z> > + CONSTANT -> V_i has been found to hold a constant > + value C. "Some bits of V_i have been found to..." Or just remove/rewrite the head comment and move that comment here: > + /* Possible lattice values. */ > + typedef enum > + { > + UNINITIALIZED, > + UNDEFINED, > + CONSTANT, > + VARYING > + } ccp_lattice_t; > + val.bit_lattice_val > + = double_int_and > + (double_int_ior (r1val.bit_lattice_val, > + r2val.bit_lattice_val), > + double_int_and (double_int_ior (r1val.value, > + r1val.bit_lattice_val), > + double_int_ior (r2val.value, > + r2val.bit_lattice_val))); > + if (!double_int_minus_one_p (val.bit_lattice_val)) > + val.lattice_val = CONSTANT; In other places of this function you just set it to CONSTANT without the if. You can just set the lattice_val to CONSTANT here: > + bit_prop_value_t val = { VARYING, { -1, -1 }, { 0, 0 } }; and change it to VARYING ("if minus one then VARYING") at the end of the function. If no computation is done in the function, the bit_lattice_val will stay -1. > + case LSHIFT_EXPR: > + case RSHIFT_EXPR: > + if (r2val.lattice_val == CONSTANT > + && double_int_zero_p (r2val.bit_lattice_val)) Even if some bits are varying, the result will have at least r2val.value & ~r2val.bit_lattice_val bits shifted in. So you can do something like if (r2val.lattice_val != CONSTANT) break; if (double_int_zero_p (r2val.bit_lattice_val)) { in_mask = r1val.bit_lattice_val; in_value = r1val.value; } else { in_mask = double_int_minus_one; in_value = double_int_minus_one; } shift = r2val.value & ~r2val.bit_lattice_val; if (SHIFT_COUNT_TRUNCATED) shift &= GETMODE_BITSIZE (TYPE_MODE (type)) - 1; val.lattice_val = CONSTANT; val.bit_lattice_val = double_int_lshift (in_mask, shift, TYPE_PRECISION (type), false); val.value = double_int_lshift (in_value, shift, TYPE_PRECISION (type), false); > + else if (shift < 0) > + { > + val.lattice_val = CONSTANT; > + val.bit_lattice_val > + = double_int_rshift (r1val.bit_lattice_val, > + -shift, TYPE_PRECISION (type), true); > + val.value = double_int_rshift (r1val.value, shift, > + TYPE_PRECISION (type), true); > + } Here shifted in bits are varying for signed types (unless the sign bit is constant, but that's not handled here either). > + unsigned r1ctz = 0, r2ctz = 0; > + while (r1ctz < HOST_BITS_PER_WIDE_INT > + && !(r1val.bit_lattice_val.low & (1 << r1ctz)) > + && !(r1val.value.low & (1 << r1ctz))) > + r1ctz++; > + while (r2ctz < HOST_BITS_PER_WIDE_INT > + && !(r2val.bit_lattice_val.low & (1 << r2ctz)) > + && !(r2val.value.low & (1 << r2ctz))) > + r2ctz++; This is just a ctz on (v | m), no? This makes it easier to track high bits as well. I'm sure that you can optimize the addition, I'll think about it. Paolo