re PR target/23289 (tail call optimization not performed)
authorRichard Guenther <rguenther@suse.de>
Thu, 11 Aug 2005 08:59:22 +0000 (08:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 11 Aug 2005 08:59:22 +0000 (08:59 +0000)
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.

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

From-SVN: r102981

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

index 2c0950529ce2710dee035f36a4ae0df33cd18e36..a6715d0dbd38be0c183ce0fe620270649f439807 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 68589b28da9f0f6a7bd7bde97aaebebc84757fd2..3c62bf0c5542eff20449ae5ce8cc206a4c741b1c 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 dd74474cba405cd77f326c74c36a9f39a829e0c4..8a296288ab980b39733b856509222088a8a580f3 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" } } */