On Thu, Mar 2, 2017 at 6:15 PM, marxin <mli...@suse.cz> wrote: > gcc/ChangeLog: > > 2017-03-06 Martin Liska <mli...@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 <mli...@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 > >