]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/45307 (Stores expanding to no RTL not removed by tree optimizers...
authorJason Merrill <jason@redhat.com>
Thu, 19 Aug 2010 17:00:51 +0000 (13:00 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 19 Aug 2010 17:00:51 +0000 (13:00 -0400)
PR c++/45307
* gimplify.c (gimplify_init_constructor): Just return GS_UNHANDLED
if ctor is empty.
(gimplify_modify_expr_rhs): Adjust.

From-SVN: r163380

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/empty-2.C [new file with mode: 0644]

index 7588c98e86649d8ce5c1e3f0d839d0d906d7cdf5..f7461ba8907a77a4d9730e157eb2b798e926cd00 100644 (file)
@@ -1,3 +1,10 @@
+2010-08-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/45307
+       * gimplify.c (gimplify_init_constructor): Just return GS_UNHANDLED
+       if ctor is empty.
+       (gimplify_modify_expr_rhs): Adjust.
+
 2010-08-19  Nathan Froyd  <froydnj@codesourcery.com>
 
        * cfgloop.c (get_loop_body_in_bfs_order): Avoid redundant call to
index d93fd4a0ecfeeff61b47311ed0c09c6a034145d3..7667bb685b65fca85c06bb1897b4b2dca44a1c93 100644 (file)
@@ -1,5 +1,9 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/45307
+       * cp-gimplify.c (cp_gimplify_expr): Also remove assignment
+       of empty class CONSTRUCTOR.
+
        * except.c (pending_noexcept, pending_noexcept_checks): New.
        (perform_deferred_noexcept_checks): New.
        (maybe_noexcept_warning): Split from...
index abd5bf37b6e733e644f635585624ad794302a24d..e5a7f2659589504fff181f1c1372b09337437a6d 100644 (file)
@@ -575,15 +575,18 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
          TREE_OPERAND (*expr_p, 1) = build1 (VIEW_CONVERT_EXPR,
                                              TREE_TYPE (op0), op1);
 
-       else if ((is_gimple_lvalue (op1) || INDIRECT_REF_P (op1))
-                && !(TREE_CODE (op1) == CALL_EXPR
-                     && CALL_EXPR_RETURN_SLOT_OPT (op1))
+       else if ((is_gimple_lvalue (op1) || INDIRECT_REF_P (op1)
+                 || (TREE_CODE (op1) == CONSTRUCTOR
+                     && CONSTRUCTOR_NELTS (op1) == 0)
+                 || (TREE_CODE (op1) == CALL_EXPR
+                     && !CALL_EXPR_RETURN_SLOT_OPT (op1)))
                 && is_really_empty_class (TREE_TYPE (op0)))
          {
            /* Remove any copies of empty classes.  We check that the RHS
-              has a simple form so that TARGET_EXPRs and CONSTRUCTORs get
-              reduced properly, and we leave the return slot optimization
-              alone because it isn't a copy.
+              has a simple form so that TARGET_EXPRs and non-empty
+              CONSTRUCTORs get reduced properly, and we leave the return
+              slot optimization alone because it isn't a copy (FIXME so it
+              shouldn't be represented as one).
 
               Also drop volatile variables on the RHS to avoid infinite
               recursion from gimplify_expr trying to load the value.  */
index 8b97ee3d0e8e665d9a12a56bd594654c8a3104dc..7e33666dcebe7f0017ee816ed332c43f1f4d660b 100644 (file)
@@ -4237,6 +4237,10 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
          break;
 
        case CONSTRUCTOR:
+         /* If we already made some changes, let the front end have a
+            crack at this before we break it down.  */
+         if (ret != GS_UNHANDLED)
+           break;
          /* If we're initializing from a CONSTRUCTOR, break this into
             individual MODIFY_EXPRs.  */
          return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
index 304a8e89f224fa3cdbc09208dc0bc20714c2f1be..289a1246938ffbb15a77d8cb3cadb09b0592f9e5 100644 (file)
@@ -1,5 +1,7 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/tree-ssa/empty-2.C: New.
+
        * g++.dg/cpp0x/noexcept09.C: New.
 
 2010-08-19  Daniel Kraft  <d@domob.eu>
diff --git a/gcc/testsuite/g++.dg/tree-ssa/empty-2.C b/gcc/testsuite/g++.dg/tree-ssa/empty-2.C
new file mode 100644 (file)
index 0000000..728678a
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/45307
+// { dg-options -fdump-tree-gimple }
+
+struct fallible_t { };
+const fallible_t fallible = fallible_t();
+
+// { dg-final { scan-tree-dump-not "fallible" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }