Hi, This patch adds support for pointer bounds constants to be used as DECL_INITIAL for constant bounds (like zero bounds).
Bootstrapped and tested on linux-x86_64. Thanks, Ilya -- gcc/ 2014-05-30 Ilya Enkovich <ilya.enkov...@intel.com> * emit-rtl.c (immed_double_const): Support MODE_POINTER_BOUNDS. (init_emit_once): Build pointer bounds zero constants. * explow.c (trunc_int_for_mode): Likewise. * varpool.c (ctor_for_folding): Do not fold constant bounds vars. * varasm.c (output_constant_pool_2): Support MODE_POINTER_BOUNDS. * config/i386/i386.c (ix86_legitimate_constant_p): Mark bounds constant as not valid. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6a99b6b..888f5ad 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -12443,8 +12443,12 @@ darwin_local_data_pic (rtx disp) satisfies CONSTANT_P. */ static bool -ix86_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x) +ix86_legitimate_constant_p (enum machine_mode mode, rtx x) { + /* Pointer bounds constants are not valid. */ + if (POINTER_BOUNDS_MODE_P (mode)) + return false; + switch (GET_CODE (x)) { case CONST: diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 4736f8d..f9484d5 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -505,7 +505,8 @@ immed_double_const (HOST_WIDE_INT i0, HOST_WIDE_INT i1, enum machine_mode mode) || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT /* We can get a 0 for an error mark. */ || GET_MODE_CLASS (mode) == MODE_VECTOR_INT - || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT); + || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT + || GET_MODE_CLASS (mode) == MODE_POINTER_BOUNDS); if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) return gen_int_mode (i0, mode); @@ -5875,6 +5876,11 @@ init_emit_once (void) if (STORE_FLAG_VALUE == 1) const_tiny_rtx[1][(int) BImode] = const1_rtx; + for (mode = GET_CLASS_NARROWEST_MODE (MODE_POINTER_BOUNDS); + mode != VOIDmode; + mode = GET_MODE_WIDER_MODE (mode)) + const_tiny_rtx[0][mode] = immed_double_const (0, 0, mode); + pc_rtx = gen_rtx_fmt_ (PC, VOIDmode); ret_rtx = gen_rtx_fmt_ (RETURN, VOIDmode); simple_return_rtx = gen_rtx_fmt_ (SIMPLE_RETURN, VOIDmode); diff --git a/gcc/explow.c b/gcc/explow.c index 48e91a6..9661abb 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -53,7 +53,8 @@ trunc_int_for_mode (HOST_WIDE_INT c, enum machine_mode mode) int width = GET_MODE_PRECISION (mode); /* You want to truncate to a _what_? */ - gcc_assert (SCALAR_INT_MODE_P (mode)); + gcc_assert (SCALAR_INT_MODE_P (mode) + || POINTER_BOUNDS_MODE_P (mode)); /* Canonicalize BImode to 0 and STORE_FLAG_VALUE. */ if (mode == BImode) diff --git a/gcc/varasm.c b/gcc/varasm.c index af7fb4a..fcae2fa 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -3799,6 +3799,7 @@ output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align) case MODE_UFRACT: case MODE_ACCUM: case MODE_UACCUM: + case MODE_POINTER_BOUNDS: assemble_integer (x, GET_MODE_SIZE (mode), align, 1); break; diff --git a/gcc/varpool.c b/gcc/varpool.c index 0eeb2b6..321165d 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -257,6 +257,12 @@ ctor_for_folding (tree decl) && TREE_CODE (decl) != CONST_DECL) return error_mark_node; + /* Static constant bounds are created to be + used instead of constants and therefore + do not let folding it. */ + if (POINTER_BOUNDS_P (decl)) + return error_mark_node; + if (TREE_CODE (decl) == CONST_DECL || DECL_IN_CONSTANT_POOL (decl)) return DECL_INITIAL (decl);