tree-cfg.h (should_remove_lhs_p): New predicate.
authorMarek Polacek <polacek@redhat.com>
Tue, 24 May 2016 13:34:37 +0000 (13:34 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 24 May 2016 13:34:37 +0000 (13:34 +0000)
* tree-cfg.h (should_remove_lhs_p): New predicate.
* cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Use it.
* gimplify.c (gimplify_modify_expr): Likewise.
* tree-cfg.c (verify_gimple_call): Likewise.
* tree-cfgcleanup.c (fixup_noreturn_call): Likewise.
* gimple-fold.c: Include "tree-cfg.h".
(gimple_fold_call): Use should_remove_lhs_p.

From-SVN: r236637

gcc/ChangeLog
gcc/cgraph.c
gcc/gimple-fold.c
gcc/gimplify.c
gcc/tree-cfg.c
gcc/tree-cfg.h
gcc/tree-cfgcleanup.c

index cd557fbdffa12c822a78b3090750f292583f42a5..8a1e9da14992b8c7b2d741dae0b730edc57670a9 100644 (file)
@@ -1,3 +1,13 @@
+2016-05-24  Marek Polacek  <polacek@redhat.com>
+
+       * tree-cfg.h (should_remove_lhs_p): New predicate.
+       * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Use it.
+       * gimplify.c (gimplify_modify_expr): Likewise.
+       * tree-cfg.c (verify_gimple_call): Likewise.
+       * tree-cfgcleanup.c (fixup_noreturn_call): Likewise.
+       * gimple-fold.c: Include "tree-cfg.h".
+       (gimple_fold_call): Use should_remove_lhs_p.
+
 2016-05-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71253
index cf9192f2a1bf85f1c60c3d12d5900226c3207af6..1a4f665293d4fcde6ce7f6e05b07895f0f82f8dc 100644 (file)
@@ -1513,10 +1513,7 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
     }
 
   /* If the call becomes noreturn, remove the LHS if possible.  */
-  if (lhs
-      && (gimple_call_flags (new_stmt) & ECF_NORETURN)
-      && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
-      && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))
+  if (gimple_call_noreturn_p (new_stmt) && should_remove_lhs_p (lhs))
     {
       if (TREE_CODE (lhs) == SSA_NAME)
        {
index 83b7150998861fe916312578b42d5420a54ca4b2..d6657e9079958cc0ebcda332673f7493275042ec 100644 (file)
@@ -54,6 +54,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "optabs-query.h"
 #include "omp-low.h"
 #include "ipa-chkp.h"
+#include "tree-cfg.h"
 
 
 /* Return true when DECL can be referenced from current unit.
@@ -3052,12 +3053,9 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
                          == void_type_node))
                    gimple_call_set_fntype (stmt, TREE_TYPE (fndecl));
                  /* If the call becomes noreturn, remove the lhs.  */
-                 if (lhs
-                     && (gimple_call_flags (stmt) & ECF_NORETURN)
+                 if (gimple_call_noreturn_p (stmt)
                      && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (stmt)))
-                         || ((TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))
-                              == INTEGER_CST)
-                             && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))))
+                         || should_remove_lhs_p (lhs)))
                    {
                      if (TREE_CODE (lhs) == SSA_NAME)
                        {
index 6473544251c9e5276754eb6b7c39b7ed354b994e..e702bc4563ae14c3a415fd68cde3b952186d070d 100644 (file)
@@ -4873,9 +4873,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
            }
        }
       notice_special_calls (call_stmt);
-      if (!gimple_call_noreturn_p (call_stmt)
-         || TREE_ADDRESSABLE (TREE_TYPE (*to_p))
-         || TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (*to_p))) != INTEGER_CST)
+      if (!gimple_call_noreturn_p (call_stmt) || !should_remove_lhs_p (*to_p))
        gimple_call_set_lhs (call_stmt, *to_p);
       else if (TREE_CODE (*to_p) == SSA_NAME)
        /* The above is somewhat premature, avoid ICEing later for a
index 7c2ee78bdfbdebb85e4ed8eec12d8bcafc77d352..82f0da6c5815e490eba18c37a90c031e0511a1b5 100644 (file)
@@ -3385,11 +3385,9 @@ verify_gimple_call (gcall *stmt)
       return true;
     }
 
-  if (lhs
-      && gimple_call_ctrl_altering_p (stmt)
+  if (gimple_call_ctrl_altering_p (stmt)
       && gimple_call_noreturn_p (stmt)
-      && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
-      && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))
+      && should_remove_lhs_p (lhs))
     {
       error ("LHS in noreturn call");
       return true;
index 802e29250a34a394d2fa61d0bebc5ec57b0a7403..3e2a1ee98da4b133a3a4391b61ad00440f618a53 100644 (file)
@@ -108,4 +108,14 @@ extern bool gimple_find_sub_bbs (gimple_seq, gimple_stmt_iterator *);
 extern bool extract_true_false_controlled_edges (basic_block, basic_block,
                                                 edge *, edge *);
 
+/* Return true if the LHS of a call should be removed.  */
+
+inline bool
+should_remove_lhs_p (tree lhs)
+{
+  return (lhs
+         && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
+         && !TREE_ADDRESSABLE (TREE_TYPE (lhs)));
+}
+
 #endif /* _TREE_CFG_H  */
index 46d0fa3ee0dd8f52f0185e98e8c0df2392a125bf..4134c383dd999d5f6581fe2ee2263d3dba908d21 100644 (file)
@@ -604,8 +604,7 @@ fixup_noreturn_call (gimple *stmt)
      temporaries of variable-sized types is not supported.  Also don't
      do this with TREE_ADDRESSABLE types, as assign_temp will abort.  */
   tree lhs = gimple_call_lhs (stmt);
-  if (lhs && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
-      && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))
+  if (should_remove_lhs_p (lhs))
     {
       gimple_call_set_lhs (stmt, NULL_TREE);