OSDN Git Service

2005-08-11 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Aug 2005 08:59:22 +0000 (08:59 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Aug 2005 08:59:22 +0000 (08:59 +0000)
PR target/23289
* config/i386/i386.c (ix86_function_ok_for_sibcall): Handle
cases where we call to/from functions returning void.

* gcc.target/i386/tailcall-1.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102981 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/tailcall-1.c [new file with mode: 0644]

index 2c09505..a6715d0 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-11  Richard Guenther  <rguenther@suse.de>
+
+       PR target/23289
+       * config/i386/i386.c (ix86_function_ok_for_sibcall): Handle
+       cases where we call to/from functions returning void.
+
 2005-08-10  James A. Morrison  <phython@gcc.gnu.org>
 
        PR c++/23225
index 68589b2..3c62bf0 100644 (file)
@@ -1907,6 +1907,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
 {
   tree func;
   rtx a, b;
+  bool one_void, one_reg;
 
   /* If we are generating position-independent code, we cannot sibcall
      optimize any indirect call, or a direct call to a global function,
@@ -1929,11 +1930,18 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
      function that does or, conversely, from a function that does return
      a float to a function that doesn't; the necessary stack adjustment
      would not be executed.  This is also the place we notice
-     differences in the return value ABI.  */
+     differences in the return value ABI.  Note that it is ok for one
+     of the functions to have void return type as long as the return
+     value of the other is passed in a register.  */
   a = ix86_function_value (TREE_TYPE (exp), func, false);
   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
                           cfun->decl, false);
-  if (! rtx_equal_p (a, b))
+  one_void = (VOID_TYPE_P (TREE_TYPE (exp))
+             || VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))));
+  one_reg = ((REG_P (a) && !STACK_REG_P (a))
+            || (REG_P (b) && !STACK_REG_P (b)));
+  if (!(one_void && one_reg)
+      && !rtx_equal_p (a, b))
     return false;
 
   /* If this call is indirect, we'll need to be able to use a call-clobbered
index dd74474..8a29628 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-11  Richard Guenther  <rguenther@suse.de>
+
+       PR target/23289
+       * gcc.target/i386/tailcall-1.c: New testcase.
+
 2005-08-10  James A. Morrison  <phython@gc.gnu.org>
 
        * gcc.dg/vect/vect-67.c: Un-xfail.
diff --git a/gcc/testsuite/gcc.target/i386/tailcall-1.c b/gcc/testsuite/gcc.target/i386/tailcall-1.c
new file mode 100644 (file)
index 0000000..b916b6c
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef unsigned int Cardinal;
+typedef char *String;
+typedef struct _WidgetRec *Widget;
+
+typedef union _XEvent {
+        int type;
+ long pad[24];
+} XEvent;
+
+
+extern int SendMousePosition (Widget w, XEvent* event);
+
+
+void
+HandleIgnore(Widget w,
+      XEvent * event,
+      String * params ,
+      Cardinal *param_count )
+{
+
+    (void) SendMousePosition(w, event);
+}
+
+/* { dg-final { scan-assembler "jmp" } } */