diff mbox

[i386,Pointer,Bounds,Checker,17/x] Pointer bounds constants support

Message ID 20140530130556.GC45878@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich June 2, 2014, 10:25 a.m. UTC
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.enkovich@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.

Comments

Jeff Law June 4, 2014, 6:58 a.m. UTC | #1
On 06/02/14 04:25, Ilya Enkovich wrote:
> 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.enkovich@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.

[ ... ]

>
> @@ -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);
I'm pretty sure GET_CLASS_NARROWEST_MODE should be taking a class, not a 
mode as its argument.  So something is clearly wrong here...


jeff
Ilya Enkovich June 6, 2014, 9:11 a.m. UTC | #2
2014-06-04 10:58 GMT+04:00 Jeff Law <law@redhat.com>:
> On 06/02/14 04:25, Ilya Enkovich wrote:
>>
>> 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.enkovich@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.
>
>
> [ ... ]
>
>
>>
>> @@ -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);
>
> I'm pretty sure GET_CLASS_NARROWEST_MODE should be taking a class, not a
> mode as its argument.  So something is clearly wrong here...

MODE_POINTER_BOUNDS is a class. Modes in this class are BND32mode and BND64mode.

Ilya
>
>
> jeff
Jeff Law June 17, 2014, 9:38 p.m. UTC | #3
On 06/06/14 03:11, Ilya Enkovich wrote:
> 2014-06-04 10:58 GMT+04:00 Jeff Law <law@redhat.com>:
>> On 06/02/14 04:25, Ilya Enkovich wrote:
>>>
>>> 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.enkovich@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.
>>
>>
>> [ ... ]
>>
>>
>>>
>>> @@ -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);
>>
>> I'm pretty sure GET_CLASS_NARROWEST_MODE should be taking a class, not a
>> mode as its argument.  So something is clearly wrong here...
>
> MODE_POINTER_BOUNDS is a class. Modes in this class are BND32mode and BND64mode.
Bah.  You're right.  Approved.

jeff
diff mbox

Patch

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