On Fri, May 15, 2015 at 11:43 AM, Ilya Enkovich <enkovich....@gmail.com> wrote: > Hi, > > This patch fixes misuse of abnormal bounds copy to avoid coalescing issue. > Bootstrapped and regtested for x86_64-unknown-linux-gnu. Applied to trunk. > Is it OK for gcc-5?
Hum. I'm not sure how you can assert the value is defined by a gimple-assign. (what about PHIs?) also see below > Thanks, > Ilya > -- > gcc/ > > 2015-05-15 Ilya Enkovich <enkovich....@gmail.com> > > PR middle-end/66134 > * tree-chkp.c (chkp_get_orginal_bounds_for_abnormal_copy): New. > (chkp_maybe_copy_and_register_bounds): Don't copy abnormal copy. > > gcc/testsuite/ > > 2015-05-15 Ilya Enkovich <enkovich....@gmail.com> > > PR middle-end/66134 > * gcc.target/i386/mpx/pr66134.c: New test. > > > diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr66134.c > b/gcc/testsuite/gcc.target/i386/mpx/pr66134.c > new file mode 100755 > index 0000000..3889674 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/mpx/pr66134.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fcheck-pointer-bounds -mmpx -fno-tree-ccp" } */ > + > +extern int vfork (void) __attribute__ ((__nothrow__ , __leaf__)); > +void test1 (void); > +void test2 (void); > +void test3 (int *); > + > +void test (int *p) > +{ > + test1 (); > + p++; > + test2 (); > + p++; > + vfork (); > + test3 (p); > +} > diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c > index 288470b..17a52bc 100644 > --- a/gcc/tree-chkp.c > +++ b/gcc/tree-chkp.c > @@ -1097,7 +1097,20 @@ chkp_get_bounds_var (tree ptr_var) > return bnd_var; > } > > +/* If BND is an abnormal bounds copy, return a copied value. > + Otherwise return BND. */ > +static tree > +chkp_get_orginal_bounds_for_abnormal_copy (tree bnd) > +{ > + if (bitmap_bit_p (chkp_abnormal_copies, SSA_NAME_VERSION (bnd))) > + { > + gimple bnd_def = SSA_NAME_DEF_STMT (bnd); > + gcc_checking_assert (gimple_code (bnd_def) == GIMPLE_ASSIGN); > + bnd = gimple_assign_rhs1 (bnd_def); > + } > > + return bnd; > +} > > /* Register bounds BND for object PTR in global bounds table. > A copy of bounds may be created for abnormal ssa names. > @@ -1141,11 +1154,7 @@ chkp_maybe_copy_and_register_bounds (tree ptr, tree > bnd) > /* For abnormal copies we may just find original > bounds and use them. */ > if (!abnormal_ptr && !SSA_NAME_IS_DEFAULT_DEF (bnd)) > - { > - gimple bnd_def = SSA_NAME_DEF_STMT (bnd); > - gcc_checking_assert (gimple_code (bnd_def) == GIMPLE_ASSIGN); > - bnd = gimple_assign_rhs1 (bnd_def); > - } > + bnd = chkp_get_orginal_bounds_for_abnormal_copy (bnd); > /* For undefined values we usually use none bounds > value but in case of abnormal edge it may cause > coalescing failures. Use default definition of > @@ -1177,6 +1186,7 @@ chkp_maybe_copy_and_register_bounds (tree ptr, tree bnd) > copy = make_temp_ssa_name (pointer_bounds_type_node, > gimple_build_nop (), Just pass NULL here to avoid creating a garbage NOP stmt. > CHKP_BOUND_TMP_NAME); > + bnd = chkp_get_orginal_bounds_for_abnormal_copy (bnd); > assign = gimple_build_assign (copy, bnd); > > if (dump_file && (dump_flags & TDF_DETAILS))