re PR tree-optimization/39041 (ICE on valid during vrp2)
authorRichard Guenther <rguenther@suse.de>
Fri, 30 Jan 2009 22:09:15 +0000 (22:09 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 30 Jan 2009 22:09:15 +0000 (22:09 +0000)
2009-01-30  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/39041
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1):
Propagate variable indices only if the types match for this stmt.

* gcc.c-torture/compile/pr39041.c: New testcase.

From-SVN: r143808

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr39041.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index b3ae08395c67b57b227e733d826a40d31d828e8c..e871bd645cd0b4bc2c307291335029cd0da96026 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/39041
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1):
+       Propagate variable indices only if the types match for this stmt.
+
 2009-01-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/39013
index 67522c6d4cbf8d75c6549936789d4e41f89a08f3..02244e51b5dbd2d9be62a5dce62948aadf50e781 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/39041
+       * gcc.c-torture/compile/pr39041.c: New testcase.
+
 2009-01-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/39013
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39041.c b/gcc/testsuite/gcc.c-torture/compile/pr39041.c
new file mode 100644 (file)
index 0000000..cc58a8a
--- /dev/null
@@ -0,0 +1,28 @@
+int test_bit(int nr, void *addr)
+{
+  int *a = (int *)addr;
+  int mask;
+  a += nr;
+  mask = 1 << nr;
+  return mask & *a;
+}
+struct {
+    struct {
+       int disabled;
+    } *data[1];
+} trace;
+struct {
+    unsigned bits[1];
+} cpumask;
+void inc(int *);
+void dec(int *);
+int foo(void)
+{
+  int cpu;
+  for (cpu = 0; cpu < 1; cpu++) {
+      if (test_bit(cpu, cpumask.bits))
+       inc(&trace.data[cpu]->disabled);
+      if (!test_bit(cpu, cpumask.bits))
+       dec(&trace.data[cpu]->disabled);
+  }
+}
index 3826f1af598ce1cfa13d9e5e4b4ace9c3f80c30a..3a8126262c2ba777a19d6dba2698114a9d5045f1 100644 (file)
@@ -845,6 +845,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
      array elements, then the result is converted into the proper
      type for the arithmetic.  */
   if (TREE_CODE (rhs2) == SSA_NAME
+      && useless_type_conversion_p (TREE_TYPE (name), TREE_TYPE (def_rhs))
       /* Avoid problems with IVopts creating PLUS_EXPRs with a
         different type than their operands.  */
       && useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))