re PR middle-end/64922 (runtime error: member call on misaligned address for type...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 4 Feb 2015 20:28:49 +0000 (21:28 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 4 Feb 2015 20:28:49 +0000 (20:28 +0000)
PR middle-end/64922
* gimple.c: Include gimple-ssa.h.
(maybe_remove_unused_call_args): New function.
* gimple.h (maybe_remove_unused_call_args): Declare.
* cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Use it.
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Likewise.
* gimple-fold.c (gimple_fold_call): Likewise.

From-SVN: r220417

gcc/ChangeLog
gcc/cgraph.c
gcc/gimple-fold.c
gcc/gimple.c
gcc/gimple.h
gcc/tree-ssa-pre.c

index f724d54539bec2bbf006a39c8cc7b8fd4f8d0702..755ff3e53773a439d13fbc65714a49b48dc573f4 100644 (file)
@@ -1,3 +1,13 @@
+2015-02-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/64922
+       * gimple.c: Include gimple-ssa.h.
+       (maybe_remove_unused_call_args): New function.
+       * gimple.h (maybe_remove_unused_call_args): Declare.
+       * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Use it.
+       * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Likewise.
+       * gimple-fold.c (gimple_fold_call): Likewise.
+
 2015-02-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR rtl-optimization/64905
index 89d0d2feb9fdfa823f13b5a1a7fbae23c87499cd..8ea8ae937142a6b439cfde9b7ded2ceee390a7ec 100644 (file)
@@ -1324,7 +1324,8 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
                     (int64_t)e->count);
          gcc_assert (e2->speculative);
          push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
-         new_stmt = gimple_ic (e->call_stmt, dyn_cast<cgraph_node *> (ref->referred),
+         new_stmt = gimple_ic (e->call_stmt,
+                               dyn_cast<cgraph_node *> (ref->referred),
                                e->count || e2->count
                                ?  RDIV (e->count * REG_BR_PROB_BASE,
                                         e->count + e2->count)
@@ -1464,6 +1465,9 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
       update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
     }
 
+  maybe_remove_unused_call_args (DECL_STRUCT_FUNCTION (e->caller->decl),
+                                new_stmt);
+
   e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt, false);
 
   if (symtab->dump_file)
index 3015901d8c1f1fb73db12396bab4081e7335c508..f89220c5a68a89576f586de581797b61df3814f1 100644 (file)
@@ -3120,6 +3120,7 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
                        }
                      gimple_call_set_lhs (stmt, NULL_TREE);
                    }
+                 maybe_remove_unused_call_args (cfun, stmt);
                }
              else
                {
index caa1cbd2d0923fa352df612acff09b1f8d9deac9..a5c1192f776f22ac3ae302cb56ad955d2fd1f63f 100644 (file)
@@ -67,6 +67,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "lto-streamer.h"
 #include "cgraph.h"
+#include "gimple-ssa.h"
 
 
 /* All the tuples have their operand vector (if present) at the very bottom
@@ -2950,3 +2951,20 @@ gimple_seq_discard (gimple_seq seq)
       ggc_free (stmt);
     }
 }
+
+/* See if STMT now calls function that takes no parameters and if so, drop
+   call arguments.  This is used when devirtualization machinery redirects
+   to __builtiln_unreacahble or __cxa_pure_virutal.  */
+
+void
+maybe_remove_unused_call_args (struct function *fn, gimple stmt)
+{
+  tree decl = gimple_call_fndecl (stmt);
+  if (TYPE_ARG_TYPES (TREE_TYPE (decl))
+      && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
+      && gimple_call_num_args (stmt))
+    {
+      gimple_set_num_ops (stmt, 3);
+      update_stmt_fn (fn, stmt);
+    }
+}
index 769bad01181253ec794da89100c428db45c1a19a..5503625c9f1788816a4f63dabe0cc5ed3e698bca 100644 (file)
@@ -1404,6 +1404,7 @@ extern void sort_case_labels (vec<tree>);
 extern void preprocess_case_label_vec_for_gimple (vec<tree>, tree, tree *);
 extern void gimple_seq_set_location (gimple_seq, location_t);
 extern void gimple_seq_discard (gimple_seq);
+extern void maybe_remove_unused_call_args (struct function *, gimple);
 
 /* Formal (expression) temporary table handling: multiple occurrences of
    the same scalar expression are evaluated into the same temporary.  */
index 32cd74dd3bbbd5031a80254750dc8f6d7226619c..83b48df8b4e390833912ae53e0b1354d18d7bcfe 100644 (file)
@@ -4406,6 +4406,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
                                       cgraph_node::get (fn)->name ());
                    }
                  gimple_call_set_fndecl (call_stmt, fn);
+                 maybe_remove_unused_call_args (cfun, call_stmt);
                  gimple_set_modified (stmt, true);
                }
            }