From 669540aa7297bf95ccbf772890c14e726ab1f2ea Mon Sep 17 00:00:00 2001
From: Harsha Jagasia <harsha.jagasia@amd.com>
Date: Mon, 3 Nov 2008 16:43:02 +0000
Subject: [PATCH] re PR tree-optimization/37684 ([graphite] basic block
 containing VDEF of a scalar does not dominate basic block containing VUSE of
 the same scalar)

2008-11-03  Harsha Jagasia  <harsha.jagasia@amd.com>

	PR tree-optimization/37684
	* gcc.dg/graphite/pr37684.c: New.
	* graphite.c (exclude_component_ref): New.
	(is_simple_operand): Call exclude_component_ref.

From-SVN: r141551
---
 gcc/ChangeLog                           |  7 +++
 gcc/graphite.c                          | 29 ++++++++++-
 gcc/testsuite/gcc.dg/graphite/pr37684.c | 65 +++++++++++++++++++++++++
 3 files changed, 100 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/graphite/pr37684.c

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  <harsha.jagasia@amd.com>
+
+	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  <sebastian.pop@amd.com>
 
 	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 );
+}