diff mbox

[3/5] Fix ICE in tree-chkp-opt.c (PR tree-optimization/79631).

Message ID 84e861ef8f06f875dce32ad3d665b45626d7497c.1488881229.git.mliska@suse.cz
State New
Headers show

Commit Message

Martin Liška March 2, 2017, 5:15 p.m. UTC
gcc/ChangeLog:

2017-03-06  Martin Liska  <mliska@suse.cz>

	PR tree-optimization/79631
	* tree-chkp-opt.c (chkp_is_constant_addr): Call
	tree_int_cst_sign_bit just for INTEGER constants.

gcc/testsuite/ChangeLog:

2017-03-06  Martin Liska  <mliska@suse.cz>

	PR tree-optimization/79631
	* gcc.target/i386/mpx/pr79631.c: New test.
---
 gcc/testsuite/gcc.target/i386/mpx/pr79631.c | 15 +++++++++++++++
 gcc/tree-chkp-opt.c                         |  3 ++-
 2 files changed, 17 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/mpx/pr79631.c

Comments

Martin Liška March 9, 2017, 9:36 a.m. UTC | #1
PING^1:

On 03/02/2017 06:15 PM, marxin wrote:
> gcc/ChangeLog:
> 
> 2017-03-06  Martin Liska  <mliska@suse.cz>
> 
> 	PR tree-optimization/79631
> 	* tree-chkp-opt.c (chkp_is_constant_addr): Call
> 	tree_int_cst_sign_bit just for INTEGER constants.
> 
> gcc/testsuite/ChangeLog:
> 
> 2017-03-06  Martin Liska  <mliska@suse.cz>
> 
> 	PR tree-optimization/79631
> 	* gcc.target/i386/mpx/pr79631.c: New test.
> ---
>  gcc/testsuite/gcc.target/i386/mpx/pr79631.c | 15 +++++++++++++++
>  gcc/tree-chkp-opt.c                         |  3 ++-
>  2 files changed, 17 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/mpx/pr79631.c
> 
> diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr79631.c b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
> new file mode 100644
> index 00000000000..075d46b835f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile { target { ! x32 } } } */
> +/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
> +
> +typedef struct { int _mp_size; } mpz_t[1];
> +int a, b;
> +void fn1()
> +{
> +  mpz_t c[1][b];
> +  for (;;) {
> +      int d = 0 >= 0 ? 0 == 0 ? c[0][0]->_mp_size ? -1 : 0 : 0 : 0,
> +	  e = 0 >= 0 ? 0 == 0 ? c[1][1]->_mp_size ? -1 : 0 : 0 : 0;
> +      if (d != e)
> +	a++;
> +  }
> +}
> diff --git a/gcc/tree-chkp-opt.c b/gcc/tree-chkp-opt.c
> index ebe05459773..286f7853921 100644
> --- a/gcc/tree-chkp-opt.c
> +++ b/gcc/tree-chkp-opt.c
> @@ -241,7 +241,8 @@ chkp_is_constant_addr (const address_t &addr, int *sign)
>      return false;
>    else if (integer_zerop (addr.pol[0].cst))
>      *sign = 0;
> -  else if  (tree_int_cst_sign_bit (addr.pol[0].cst))
> +  else if (TREE_CODE (addr.pol[0].cst) == INTEGER_CST
> +	   && tree_int_cst_sign_bit (addr.pol[0].cst))
>      *sign = -1;
>    else
>      *sign = 1;
>
Richard Biener March 9, 2017, 10:04 a.m. UTC | #2
On Thu, Mar 2, 2017 at 6:15 PM, marxin <mliska@suse.cz> wrote:
> gcc/ChangeLog:
>
> 2017-03-06  Martin Liska  <mliska@suse.cz>
>
>         PR tree-optimization/79631
>         * tree-chkp-opt.c (chkp_is_constant_addr): Call
>         tree_int_cst_sign_bit just for INTEGER constants.
>
> gcc/testsuite/ChangeLog:
>
> 2017-03-06  Martin Liska  <mliska@suse.cz>
>
>         PR tree-optimization/79631
>         * gcc.target/i386/mpx/pr79631.c: New test.
> ---
>  gcc/testsuite/gcc.target/i386/mpx/pr79631.c | 15 +++++++++++++++
>  gcc/tree-chkp-opt.c                         |  3 ++-
>  2 files changed, 17 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/mpx/pr79631.c
>
> diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr79631.c b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
> new file mode 100644
> index 00000000000..075d46b835f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile { target { ! x32 } } } */
> +/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
> +
> +typedef struct { int _mp_size; } mpz_t[1];
> +int a, b;
> +void fn1()
> +{
> +  mpz_t c[1][b];
> +  for (;;) {
> +      int d = 0 >= 0 ? 0 == 0 ? c[0][0]->_mp_size ? -1 : 0 : 0 : 0,
> +         e = 0 >= 0 ? 0 == 0 ? c[1][1]->_mp_size ? -1 : 0 : 0 : 0;
> +      if (d != e)
> +       a++;
> +  }
> +}
> diff --git a/gcc/tree-chkp-opt.c b/gcc/tree-chkp-opt.c
> index ebe05459773..286f7853921 100644
> --- a/gcc/tree-chkp-opt.c
> +++ b/gcc/tree-chkp-opt.c
> @@ -241,7 +241,8 @@ chkp_is_constant_addr (const address_t &addr, int *sign)
>      return false;
>    else if (integer_zerop (addr.pol[0].cst))
>      *sign = 0;
> -  else if  (tree_int_cst_sign_bit (addr.pol[0].cst))
> +  else if (TREE_CODE (addr.pol[0].cst) == INTEGER_CST
> +          && tree_int_cst_sign_bit (addr.pol[0].cst))
>      *sign = -1;
>    else
>      *sign = 1;

It looks like it assumes sign == 1 else and thus there likely should be

  else if (TREE_CODE (addr.pol[0].cst) != INTEGER_CST)
    return false;
  else if (integer_zerop ...)

to handle &foo I guess.

Ok with that change.

Richard.

> --
> 2.11.1
>
>
Martin Liška March 9, 2017, 10:12 a.m. UTC | #3
On 03/09/2017 11:04 AM, Richard Biener wrote:
> On Thu, Mar 2, 2017 at 6:15 PM, marxin <mliska@suse.cz> wrote:
>> gcc/ChangeLog:
>>
>> 2017-03-06  Martin Liska  <mliska@suse.cz>
>>
>>         PR tree-optimization/79631
>>         * tree-chkp-opt.c (chkp_is_constant_addr): Call
>>         tree_int_cst_sign_bit just for INTEGER constants.
>>
>> gcc/testsuite/ChangeLog:
>>
>> 2017-03-06  Martin Liska  <mliska@suse.cz>
>>
>>         PR tree-optimization/79631
>>         * gcc.target/i386/mpx/pr79631.c: New test.
>> ---
>>  gcc/testsuite/gcc.target/i386/mpx/pr79631.c | 15 +++++++++++++++
>>  gcc/tree-chkp-opt.c                         |  3 ++-
>>  2 files changed, 17 insertions(+), 1 deletion(-)
>>  create mode 100644 gcc/testsuite/gcc.target/i386/mpx/pr79631.c
>>
>> diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr79631.c b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
>> new file mode 100644
>> index 00000000000..075d46b835f
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
>> @@ -0,0 +1,15 @@
>> +/* { dg-do compile { target { ! x32 } } } */
>> +/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
>> +
>> +typedef struct { int _mp_size; } mpz_t[1];
>> +int a, b;
>> +void fn1()
>> +{
>> +  mpz_t c[1][b];
>> +  for (;;) {
>> +      int d = 0 >= 0 ? 0 == 0 ? c[0][0]->_mp_size ? -1 : 0 : 0 : 0,
>> +         e = 0 >= 0 ? 0 == 0 ? c[1][1]->_mp_size ? -1 : 0 : 0 : 0;
>> +      if (d != e)
>> +       a++;
>> +  }
>> +}
>> diff --git a/gcc/tree-chkp-opt.c b/gcc/tree-chkp-opt.c
>> index ebe05459773..286f7853921 100644
>> --- a/gcc/tree-chkp-opt.c
>> +++ b/gcc/tree-chkp-opt.c
>> @@ -241,7 +241,8 @@ chkp_is_constant_addr (const address_t &addr, int *sign)
>>      return false;
>>    else if (integer_zerop (addr.pol[0].cst))
>>      *sign = 0;
>> -  else if  (tree_int_cst_sign_bit (addr.pol[0].cst))
>> +  else if (TREE_CODE (addr.pol[0].cst) == INTEGER_CST
>> +          && tree_int_cst_sign_bit (addr.pol[0].cst))
>>      *sign = -1;
>>    else
>>      *sign = 1;
> 
> It looks like it assumes sign == 1 else and thus there likely should be

Yep, nice note.
Thanks for review.

Martin

> 
>   else if (TREE_CODE (addr.pol[0].cst) != INTEGER_CST)
>     return false;
>   else if (integer_zerop ...)
> 
> to handle &foo I guess.
> 
> Ok with that change.
> 
> Richard.
> 
>> --
>> 2.11.1
>>
>>
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr79631.c b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
new file mode 100644
index 00000000000..075d46b835f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mpx/pr79631.c
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { ! x32 } } } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
+
+typedef struct { int _mp_size; } mpz_t[1];
+int a, b;
+void fn1()
+{
+  mpz_t c[1][b];
+  for (;;) {
+      int d = 0 >= 0 ? 0 == 0 ? c[0][0]->_mp_size ? -1 : 0 : 0 : 0,
+	  e = 0 >= 0 ? 0 == 0 ? c[1][1]->_mp_size ? -1 : 0 : 0 : 0;
+      if (d != e)
+	a++;
+  }
+}
diff --git a/gcc/tree-chkp-opt.c b/gcc/tree-chkp-opt.c
index ebe05459773..286f7853921 100644
--- a/gcc/tree-chkp-opt.c
+++ b/gcc/tree-chkp-opt.c
@@ -241,7 +241,8 @@  chkp_is_constant_addr (const address_t &addr, int *sign)
     return false;
   else if (integer_zerop (addr.pol[0].cst))
     *sign = 0;
-  else if  (tree_int_cst_sign_bit (addr.pol[0].cst))
+  else if (TREE_CODE (addr.pol[0].cst) == INTEGER_CST
+	   && tree_int_cst_sign_bit (addr.pol[0].cst))
     *sign = -1;
   else
     *sign = 1;