re PR ada/37328 (ACATS la14021 ICE in gimple_assign_set_rhs1, at gimple.h:1747)
authorRichard Guenther <rguenther@suse.de>
Wed, 3 Sep 2008 11:35:18 +0000 (11:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 3 Sep 2008 11:35:18 +0000 (11:35 +0000)
2008-09-03  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/37328
* tree-sra.c (sra_build_assignment): Gimplify properly.
(generate_copy_inout): Take the correct stmt as definition,
remove bogus assert.

From-SVN: r139931

gcc/ChangeLog
gcc/tree-sra.c

index 0affc98aa587b34854ab5219549f8c2aec7f819d..5e491e9752f3042c4f94af93001180a98df3410a 100644 (file)
@@ -1,3 +1,10 @@
+2008-09-03  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/37328
+       * tree-sra.c (sra_build_assignment): Gimplify properly.
+       (generate_copy_inout): Take the correct stmt as definition,
+       remove bogus assert.
+
 2008-09-03  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * config/bfin/bfin.c (bfin_expand_prologue): Honour no_stack_limit
index ea351ea97661baff0ce53a30a9643c60ddce2546..01f90844bd0d2b7bd3348779b725cdc679816c26 100644 (file)
@@ -2144,7 +2144,7 @@ static gimple_seq
 sra_build_assignment (tree dst, tree src)
 {
   gimple stmt;
-  gimple_seq seq = NULL;
+  gimple_seq seq = NULL, seq2 = NULL;
   /* Turning BIT_FIELD_REFs into bit operations enables other passes
      to do a much better job at optimizing the code.
      From dst = BIT_FIELD_REF <var, sz, off> we produce
@@ -2308,6 +2308,8 @@ sra_build_assignment (tree dst, tree src)
           && !useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (src)))
     src = fold_convert (TREE_TYPE (dst), src);
 
+  src = force_gimple_operand (src, &seq2, false, NULL_TREE);
+  gimple_seq_add_seq (&seq, seq2);
   stmt = gimple_build_assign (dst, src);
   gimple_seq_add_stmt (&seq, stmt);
   return seq;
@@ -2597,8 +2599,7 @@ generate_copy_inout (struct sra_elt *elt, bool copy_out, tree expr,
 
       t = build2 (COMPLEX_EXPR, elt->type, r, i);
       tmp_seq = sra_build_bf_assignment (expr, t);
-      gcc_assert (gimple_seq_singleton_p (tmp_seq));
-      SSA_NAME_DEF_STMT (expr) = gimple_seq_first_stmt (tmp_seq);
+      SSA_NAME_DEF_STMT (expr) = gimple_seq_last_stmt (tmp_seq);
       gimple_seq_add_seq (seq_p, tmp_seq);
     }
   else if (elt->replacement)