Message ID | 0EFAB2BDD0F67E4FB6CCC8B9F87D756969ACB18D@IRSMSX101.ger.corp.intel.com |
---|---|
State | New |
Headers | show |
On 07/31/14 13:51, Zamyatin, Igor wrote: > Hi! > > This patch fixes endless compilation for the case of array notation for an array which is a structure member > > Ok for trunk/4.9 once testing finished? > > Thanks, > Igor > > Changelog: > > gcc/c-family: > > 2014-07-31 Igor Zamyatin <igor.zamyatin@intel.com> > > PR other/61962 > * array-notation-common.c (find_rank): Added handling for other > types of references. > > > gcc/testsuite: > > 2014-07-31 Igor Zamyatin <igor.zamyatin@intel.com> > > PR other/61962 > * c-c++-common/cilk-plus/AN/pr61962.c: New test. OK. Please install. Thanks, Jeff
On Thu, Jul 31, 2014 at 9:51 PM, Zamyatin, Igor <igor.zamyatin@intel.com> wrote: > Hi! > > This patch fixes endless compilation for the case of array notation for an array which is a structure member > > Ok for trunk/4.9 once testing finished? > > Thanks, > Igor > > Changelog: > > gcc/c-family: > > 2014-07-31 Igor Zamyatin <igor.zamyatin@intel.com> > > PR other/61962 > * array-notation-common.c (find_rank): Added handling for other > types of references. > > > gcc/testsuite: > > 2014-07-31 Igor Zamyatin <igor.zamyatin@intel.com> > > PR other/61962 > * c-c++-common/cilk-plus/AN/pr61962.c: New test. > > > > diff --git a/gcc/c-family/array-notation-common.c b/gcc/c-family/array-notation-common.c > index c010039..5db14c6 100644 > --- a/gcc/c-family/array-notation-common.c > +++ b/gcc/c-family/array-notation-common.c > @@ -221,7 +221,9 @@ find_rank (location_t loc, tree orig_expr, tree expr, bool ignore_builtin_fn, > current_rank++; > ii_tree = ARRAY_NOTATION_ARRAY (ii_tree); > } > - else if (TREE_CODE (ii_tree) == ARRAY_REF) > + else if (TREE_CODE (ii_tree) == ARRAY_REF > + || TREE_CODE (ii_tree) == INDIRECT_REF > + || TREE_CODE (ii_tree) == COMPONENT_REF) Maybe you want handled_component_p (ii_tree)? The above misses REALPART_EXPR, IMAGPART_EXRP, VIEW_CONVERT_EXPR and BIT_FIELD_REF. And I'm missing a else gcc_unreachable (); Richard. > ii_tree = TREE_OPERAND (ii_tree, 0); > else if (TREE_CODE (ii_tree) == PARM_DECL > || TREE_CODE (ii_tree) == VAR_DECL) > diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962. > new file mode 100644 > index 0000000..08d4fe2 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c > @@ -0,0 +1,14 @@ > +/* PR other/61962 */ > +/* { dg-do compile } */ > +/* { dg-options "-fcilkplus" } */ > + > +struct FloatStruct > +{ > + float *f; > +}; > + > +/* Either SRC or DST must be a struct, otherwise the bug does not occur. */ > +void f (struct FloatStruct* dst, float *src, unsigned int length) > +{ > + dst->f[0:length] = src[0:length]; > +}
> > diff --git a/gcc/c-family/array-notation-common.c > > b/gcc/c-family/array-notation-common.c > > index c010039..5db14c6 100644 > > --- a/gcc/c-family/array-notation-common.c > > +++ b/gcc/c-family/array-notation-common.c > > @@ -221,7 +221,9 @@ find_rank (location_t loc, tree orig_expr, tree expr, > bool ignore_builtin_fn, > > current_rank++; > > ii_tree = ARRAY_NOTATION_ARRAY (ii_tree); > > } > > - else if (TREE_CODE (ii_tree) == ARRAY_REF) > > + else if (TREE_CODE (ii_tree) == ARRAY_REF > > + || TREE_CODE (ii_tree) == INDIRECT_REF > > + || TREE_CODE (ii_tree) == COMPONENT_REF) > > Maybe you want handled_component_p (ii_tree)? The above misses > REALPART_EXPR, IMAGPART_EXRP, VIEW_CONVERT_EXPR and > BIT_FIELD_REF. > > And I'm missing a > > else > gcc_unreachable (); Thanks, will look at it. Igor > > Richard. > > > ii_tree = TREE_OPERAND (ii_tree, 0); > > else if (TREE_CODE (ii_tree) == PARM_DECL > > || TREE_CODE (ii_tree) == VAR_DECL) diff --git
diff --git a/gcc/c-family/array-notation-common.c b/gcc/c-family/array-notation-common.c index c010039..5db14c6 100644 --- a/gcc/c-family/array-notation-common.c +++ b/gcc/c-family/array-notation-common.c @@ -221,7 +221,9 @@ find_rank (location_t loc, tree orig_expr, tree expr, bool ignore_builtin_fn, current_rank++; ii_tree = ARRAY_NOTATION_ARRAY (ii_tree); } - else if (TREE_CODE (ii_tree) == ARRAY_REF) + else if (TREE_CODE (ii_tree) == ARRAY_REF + || TREE_CODE (ii_tree) == INDIRECT_REF + || TREE_CODE (ii_tree) == COMPONENT_REF) ii_tree = TREE_OPERAND (ii_tree, 0); else if (TREE_CODE (ii_tree) == PARM_DECL || TREE_CODE (ii_tree) == VAR_DECL) diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962. new file mode 100644 index 0000000..08d4fe2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c @@ -0,0 +1,14 @@ +/* PR other/61962 */ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +struct FloatStruct +{ + float *f; +}; + +/* Either SRC or DST must be a struct, otherwise the bug does not occur. */ +void f (struct FloatStruct* dst, float *src, unsigned int length) +{ + dst->f[0:length] = src[0:length]; +}