This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Speed up get_ref_base_and_extent


> 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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]