This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Speed up get_ref_base_and_extent
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: Richard Guenther <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 28 Mar 2007 21:47:24 +0200
- Subject: Re: [PATCH] Speed up get_ref_base_and_extent
- References: <Pine.LNX.4.64.0703271625540.19680@zhemvz.fhfr.qr>
> 2007-03-27 Richard Guenther <rguenther@suse.de>
>
> * tree-dfa.c (get_ref_base_and_extent): Replace bit_offset and
> computations with it with a HOST_WIDE_INT variable.
A little problematic for Ada because offsets can be negative (see
ada/utils.c:shift_unc_components_for_thin_pointers). Testcase attached.
OK to install?
2007-03-28 Eric Botcazou <ebotcazou@adacore.com>
* tree-dfa.c (get_ref_base_and_extent): Do not expect positive
offsets for BIT_FIELD_REF and COMPONENT_REF.
2007-03-28 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/thin_pointer.ad[sb]: New test.
--
Eric Botcazou
Index: tree-dfa.c
===================================================================
--- tree-dfa.c (revision 123309)
+++ tree-dfa.c (working copy)
@@ -896,7 +896,7 @@ get_ref_base_and_extent (tree exp, HOST_
switch (TREE_CODE (exp))
{
case BIT_FIELD_REF:
- bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 1);
+ bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 0);
break;
case COMPONENT_REF:
@@ -906,11 +906,11 @@ get_ref_base_and_extent (tree exp, HOST_
if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
{
- HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 1);
+ HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 0);
hthis_offset *= BITS_PER_UNIT;
bit_offset += hthis_offset;
- bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1);
+ bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
}
else
{
@@ -918,11 +918,8 @@ get_ref_base_and_extent (tree exp, HOST_
/* We need to adjust maxsize to the whole structure bitsize.
But we can subtract any constant offset seen sofar,
because that would get us out of the structure otherwise. */
- if (maxsize != -1
- && csize && host_integerp (csize, 1))
- {
- maxsize = (TREE_INT_CST_LOW (csize) - bit_offset);
- }
+ if (maxsize != -1 && csize && host_integerp (csize, 1))
+ maxsize = TREE_INT_CST_LOW (csize) - bit_offset;
else
maxsize = -1;
}
@@ -959,11 +956,8 @@ get_ref_base_and_extent (tree exp, HOST_
/* We need to adjust maxsize to the whole array bitsize.
But we can subtract any constant offset seen sofar,
because that would get us outside of the array otherwise. */
- if (maxsize != -1
- && asize && host_integerp (asize, 1))
- {
- maxsize = (TREE_INT_CST_LOW (asize) - bit_offset);
- }
+ if (maxsize != -1 && asize && host_integerp (asize, 1))
+ maxsize = TREE_INT_CST_LOW (asize) - bit_offset;
else
maxsize = -1;
with System;
package Thin_Pointer is
type Stream is array (Integer range <>) of Character;
type Stream_Ptr is access Stream;
for Stream_Ptr'Size use Standard'Address_Size;
type Buf is record
A : System.Address;
end record;
type Buf_Wrapper is record
B : Buf;
end record;
type Buf_Ptr is access Buf_Wrapper;
procedure Set_Buffer (AD : Buf_Ptr; Buffer : Stream_ptr);
end Thin_Pointer;
-- { dg-do compile }
-- { dg-options "-O" }
package body Thin_Pointer is
procedure Set_Buffer (AD : Buf_Ptr; Buffer : Stream_ptr) is
begin
AD.B.A := Buffer (Buffer'First)'Address;
end Set_Buffer;
end Thin_Pointer;