OSDN Git Service

2010-01-04 Martin Jambor <mjambor@suse.cz>
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Jan 2010 18:25:14 +0000 (18:25 +0000)
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Jan 2010 18:25:14 +0000 (18:25 +0000)
PR tree-optimization/42398
* tree-sra.c (struct access): Removed flag grp_different_types.
(dump_access): Do not dump the removed flag.
(sort_and_splice_var_accesses): Do not set the removed flag.
(sra_modify_expr): Check for type compatibility directly.

* testsuite/gcc.c-torture/compile/pr42398.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155631 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr42398.c [new file with mode: 0644]
gcc/tree-sra.c

index a3ada17..e622c8f 100644 (file)
@@ -1,5 +1,13 @@
 2010-01-04  Martin Jambor  <mjambor@suse.cz>
 
+       PR tree-optimization/42398
+       * tree-sra.c (struct access): Removed flag grp_different_types.
+       (dump_access): Do not dump the removed flag.
+       (sort_and_splice_var_accesses): Do not set the removed flag.
+       (sra_modify_expr): Check for type compatibility directly.
+
+2010-01-04  Martin Jambor  <mjambor@suse.cz>
+
        PR tree-optimization/42366
        * ipa-cp.c (ipcp_init_stage): Always call ipa_compute_jump_functions on
        edges with variable number of parameters.
index aebd716..603f629 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-04  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/42398
+       * gcc.c-torture/compile/pr42398.c: New test.
+
 2010-01-04  Jason Merrill  <jason@redhat.com>
 
        PR c++/42555
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42398.c b/gcc/testsuite/gcc.c-torture/compile/pr42398.c
new file mode 100644 (file)
index 0000000..a33bebf
--- /dev/null
@@ -0,0 +1,6 @@
+int ptrace_setregs(void)
+{
+  union { unsigned int l; int t; } __gu_tmp;
+  __asm__ __volatile__("" : "=r" (__gu_tmp.l));
+  return __gu_tmp.t;
+}
index 65d270f..f451692 100644 (file)
@@ -199,10 +199,6 @@ struct access
      BIT_FIELD_REF?  */
   unsigned grp_partial_lhs : 1;
 
-  /* Does this group contain accesses to different types? (I.e. through a union
-     or a similar mechanism).  */
-  unsigned grp_different_types : 1;
-
   /* Set when a scalar replacement should be created for this variable.  We do
      the decision and creation at different places because create_tmp_var
      cannot be called from within FOR_EACH_REFERENCED_VAR. */
@@ -343,14 +339,12 @@ dump_access (FILE *f, struct access *access, bool grp)
     fprintf (f, ", grp_write = %d, grp_read = %d, grp_hint = %d, "
             "grp_covered = %d, grp_unscalarizable_region = %d, "
             "grp_unscalarized_data = %d, grp_partial_lhs = %d, "
-            "grp_different_types = %d, grp_to_be_replaced = %d, "
-            "grp_maybe_modified = %d, "
+            "grp_to_be_replaced = %d, grp_maybe_modified = %d, "
             "grp_not_necessarilly_dereferenced = %d\n",
             access->grp_write, access->grp_read, access->grp_hint,
             access->grp_covered, access->grp_unscalarizable_region,
             access->grp_unscalarized_data, access->grp_partial_lhs,
-            access->grp_different_types, access->grp_to_be_replaced,
-            access->grp_maybe_modified,
+            access->grp_to_be_replaced, access->grp_maybe_modified,
             access->grp_not_necessarilly_dereferenced);
   else
     fprintf (f, ", write = %d, grp_partial_lhs = %d\n", access->write,
@@ -1434,7 +1428,6 @@ sort_and_splice_var_accesses (tree var)
       bool grp_read = !access->write;
       bool multiple_reads = false;
       bool grp_partial_lhs = access->grp_partial_lhs;
-      bool grp_different_types = false;
       bool first_scalar = is_gimple_reg_type (access->type);
       bool unscalarizable_region = access->grp_unscalarizable_region;
 
@@ -1466,7 +1459,6 @@ sort_and_splice_var_accesses (tree var)
                grp_read = true;
            }
          grp_partial_lhs |= ac2->grp_partial_lhs;
-         grp_different_types |= !types_compatible_p (access->type, ac2->type);
          unscalarizable_region |= ac2->grp_unscalarizable_region;
          relink_to_new_repr (access, ac2);
 
@@ -1485,7 +1477,6 @@ sort_and_splice_var_accesses (tree var)
       access->grp_read = grp_read;
       access->grp_hint = multiple_reads;
       access->grp_partial_lhs = grp_partial_lhs;
-      access->grp_different_types = grp_different_types;
       access->grp_unscalarizable_region = unscalarizable_region;
       if (access->first_link)
        add_access_to_work_queue (access);
@@ -2141,11 +2132,9 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write,
 
          We also want to use this when accessing a complex or vector which can
          be accessed as a different type too, potentially creating a need for
-         type conversion  (see PR42196).  */
-      if (!is_gimple_reg_type (type)
-         || (access->grp_different_types
-             && (TREE_CODE (type) == COMPLEX_TYPE
-                 || TREE_CODE (type) == VECTOR_TYPE)))
+         type conversion (see PR42196) and when scalarized unions are involved
+         in assembler statements (see PR42398).  */
+      if (!useless_type_conversion_p (type, access->type))
        {
          tree ref = access->base;
          bool ok;
@@ -2176,10 +2165,7 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write,
            }
        }
       else
-       {
-         gcc_assert (useless_type_conversion_p (type, access->type));
-         *expr = repl;
-       }
+       *expr = repl;
       sra_stats.exprs++;
     }