cfgexpand.c (expand_call_stmt): Rematerialize the original function type if this...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 14 Apr 2011 21:56:34 +0000 (21:56 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 14 Apr 2011 21:56:34 +0000 (21:56 +0000)
* cfgexpand.c (expand_call_stmt): Rematerialize the original function
type if this is not a builtin function.

From-SVN: r172459

gcc/ChangeLog
gcc/cfgexpand.c

index a8b773f2dbe1098ca5a7671c9b193d7cf137b0f4..7808f4cf13c4a6d38e55fc356805471aaaf0383c 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cfgexpand.c (expand_call_stmt): Rematerialize the original function
+       type if this is not a builtin function.
+
 2011-04-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/48605
index d84c57eb7f9fc7427f6600fb5417c132f1767b33..45a638356b1f10abaccc441ce08f8fd7ba4c37a2 100644 (file)
@@ -1837,11 +1837,9 @@ expand_gimple_cond (basic_block bb, gimple stmt)
 static void
 expand_call_stmt (gimple stmt)
 {
-  tree exp;
-  tree lhs = gimple_call_lhs (stmt);
-  size_t i;
+  tree exp, decl, lhs = gimple_call_lhs (stmt);
   bool builtin_p;
-  tree decl;
+  size_t i;
 
   exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
 
@@ -1849,6 +1847,13 @@ expand_call_stmt (gimple stmt)
   decl = gimple_call_fndecl (stmt);
   builtin_p = decl && DECL_BUILT_IN (decl);
 
+  /* If this is not a builtin function, the function type through which the
+     call is made may be different from the type of the function.  */
+  if (!builtin_p)
+    CALL_EXPR_FN (exp)
+      = fold_build1 (NOP_EXPR, build_pointer_type (gimple_call_fntype (stmt)),
+                    CALL_EXPR_FN (exp));
+
   TREE_TYPE (exp) = gimple_call_return_type (stmt);
   CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt);