Patchwork Make host_integerp pure and inline tree_low_cst

mail settings
Submitter Jakub Jelinek
Date Aug. 17, 2010, 5:18 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/61942/
State New
Headers show


Jakub Jelinek - Aug. 17, 2010, 5:18 p.m.

In many places we call host_integerp and if it succeeds, call
tree_low_cst, which again calls host_integerp.
The following patch makes host_integerp pure when not doing
tree checking (otherwise it can fail if t's type is error_mark_node
or some other non-type) and inlines tree_low_cst in that case too.
Tested with both --disable-checking and --enable-checking=release.
With the former obviously .text section shrunk, with release checking
it grew tiny bit:
			[1]	[2]	.text size
cc1plus -m64 before	281	269	0x730a3c
cc1plus -m64 after	417	7	0x73143c
cc1plus -m32 before	274	275	0x6c7ca0
cc1plus -m32 after	411	10	0x6c7f10

[1] number of call host_integerp insns
[2] number of call tree_low_cst insns

As can be seen from the numbers, in more than half of the cases
gcc actually has been able to optimize that gcc_assert from the inline
tree_low_cst away.

Ok for trunk?

2010-08-17  Jakub Jelinek  <>

	* tree.h (host_integerp): Add ATTRIBUTE_PURE when not
	(tree_low_cst): Add inline version for !ENABLE_TREE_CHECKING
	and GCC >= 4.3.

Richard Henderson - Aug. 17, 2010, 5:24 p.m.
On 08/17/2010 10:18 AM, Jakub Jelinek wrote:
> 	* tree.h (host_integerp): Add ATTRIBUTE_PURE when not
> 	(tree_low_cst): Add inline version for !ENABLE_TREE_CHECKING
> 	and GCC >= 4.3.




--- gcc/tree.h.jj	2010-08-16 19:24:24.000000000 +0200
+++ gcc/tree.h	2010-08-17 16:14:59.000000000 +0200
@@ -4099,8 +4099,20 @@  extern int attribute_list_contained (con
 extern int tree_int_cst_equal (const_tree, const_tree);
 extern int tree_int_cst_lt (const_tree, const_tree);
 extern int tree_int_cst_compare (const_tree, const_tree);
-extern int host_integerp (const_tree, int);
+extern int host_integerp (const_tree, int)
+  ATTRIBUTE_PURE /* host_integerp is pure only when checking is disabled.  */
+  ;
 extern HOST_WIDE_INT tree_low_cst (const_tree, int);
+#if !defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 4003)
+extern inline __attribute__ ((__gnu_inline__)) HOST_WIDE_INT
+tree_low_cst (const_tree t, int pos)
+  gcc_assert (host_integerp (t, pos));
+  return TREE_INT_CST_LOW (t);
 extern int tree_int_cst_msb (const_tree);
 extern int tree_int_cst_sgn (const_tree);
 extern int tree_int_cst_sign_bit (const_tree);