diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ecb1e129983..c3b744628b24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-11-03 Harsha Jagasia + + PR tree-optimization/37684 + * gcc.dg/graphite/pr37684.c: New. + * graphite.c (exclude_component_ref): New. + (is_simple_operand): Call exclude_component_ref. + 2008-11-03 Sebastian Pop PR tree-optimization/36908 diff --git a/gcc/graphite.c b/gcc/graphite.c index a14dd141e3e4..90d823012022 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -864,6 +864,33 @@ loop_affine_expr (basic_block scop_entry, struct loop *loop, tree expr) || evolution_function_is_affine_multivariate_p (scev, n)); } +/* Return false if the tree_code of the operand OP or any of its operands + is component_ref. */ + +static bool +exclude_component_ref (tree op) +{ + int i; + int len; + + if (op) + { + if (TREE_CODE (op) == COMPONENT_REF) + return false; + else + { + len = TREE_OPERAND_LENGTH (op); + for (i = 0; i < len; ++i) + { + if (!exclude_component_ref (TREE_OPERAND (op, i))) + return false; + } + } + } + + return true; +} + /* Return true if the operand OP is simple. */ static bool @@ -879,7 +906,7 @@ is_simple_operand (loop_p loop, gimple stmt, tree op) && !stmt_simple_memref_p (loop, stmt, op))) return false; - return true; + return exclude_component_ref (op); } /* Return true only when STMT is simple enough for being handled by diff --git a/gcc/testsuite/gcc.dg/graphite/pr37684.c b/gcc/testsuite/gcc.dg/graphite/pr37684.c new file mode 100644 index 000000000000..35c32911c30b --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr37684.c @@ -0,0 +1,65 @@ +/* { dg-options "-O2 -floop-block -fdump-tree-graphite-all" } */ + +typedef struct _IO_FILE FILE; +struct _IO_marker { +}; +enum __codecvt_result +{ + __codecvt_noconv +}; +struct _IO_FILE { +}; +extern struct _IO_FILE *stderr; + +typedef + struct { + unsigned int avail_in; + unsigned int avail_out; + void *state; + void *(*bzalloc)(void *,int,int); + void *opaque; + } + bz_stream; +extern int BZ2_bzCompressInit ( + bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor + ); +typedef unsigned char Bool; +typedef int Int32; +typedef unsigned int UInt32; + +typedef + struct { + Int32 mode; + Int32 state; + UInt32* arr1; + UInt32* arr2; + UInt32* ftab; + Int32 nblock; + Int32 nblockMAX; + Bool inUse[256]; + Int32 blockNo; + } + EState; + +void prepare_new_block ( EState* s ) +{ + Int32 i; + for (i = 0; i < 256; i++) s->inUse[i] = ((Bool)0); + s->blockNo++; +} + +int BZ2_bzCompressInit + ( bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor ) +{ + EState* s; + s = (strm->bzalloc)(strm->opaque,(sizeof(EState)),1); + if (s->arr1 == ((void *)0) || s->arr2 == ((void *)0) || s->ftab == ((void *)0)) { + } + prepare_new_block ( s ); +}