The following makes sure to preserve the call function type when
redirecting edges.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Ok for the branch?

Thanks,
Richard.

2013-05-21  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/57330
        * cgraph.c (cgraph_redirect_edge_call_stmt_to_callee): Properly
        preserve the call stmts fntype.

        * gcc.dg/torture/pr57330.c: New testcase.

Index: gcc/cgraph.c
===================================================================
*** gcc/cgraph.c        (revision 199137)
--- gcc/cgraph.c        (working copy)
*************** cgraph_redirect_edge_call_stmt_to_callee
*** 1068,1073 ****
--- 1068,1074 ----
        = gimple_call_copy_skip_args (e->call_stmt,
                                      e->callee->clone.combined_args_to_skip);
        gimple_call_set_fndecl (new_stmt, e->callee->symbol.decl);
+       gimple_call_set_fntype (new_stmt, gimple_call_fntype (e->call_stmt));
  
        if (gimple_vdef (new_stmt)
          && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
Index: gcc/testsuite/gcc.dg/torture/pr57330.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr57330.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr57330.c      (working copy)
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ 
+ void foo (int a)
+ {}
+ 
+ void *a;
+ void bar ()
+ {
+   void **( *b ) (  ) = (void**(*)()) foo;
+   a = b (0);
+ }

Reply via email to