OSDN Git Service

* calls.c (expand_call): When modes of target and valreg match, force
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Apr 2003 21:47:42 +0000 (21:47 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Apr 2003 21:47:42 +0000 (21:47 +0000)
sibcall failure when target is a MEM.

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

gcc/ChangeLog
gcc/calls.c

index 2b65a5c..589009a 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-29  Olivier Hainque <hainque@act-europe.fr>
+
+       * calls.c (expand_call): When modes of target and valreg match, force
+       sibcall failure when target is a MEM.
+
 2003-04-29  Geoffrey Keating  <geoffk@apple.com>
 
        * doc/invoke.texi (Overall Options): Mention -x objective-c-header.
 2003-04-29  Geoffrey Keating  <geoffk@apple.com>
 
        * doc/invoke.texi (Overall Options): Mention -x objective-c-header.
index bd889e1..135f949 100644 (file)
@@ -3279,6 +3279,12 @@ expand_call (exp, target, ignore)
             If they refer to the same register, this move will be a no-op,
             except when function inlining is being done.  */
          emit_move_insn (target, valreg);
             If they refer to the same register, this move will be a no-op,
             except when function inlining is being done.  */
          emit_move_insn (target, valreg);
+
+         /* If we are setting a MEM, this code must be executed.  Since it is
+            emitted after the call insn, sibcall optimization cannot be
+            performed in that case.  */
+         if (GET_CODE (target) == MEM)
+           sibcall_failure = 1;
        }
       else if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
        {
        }
       else if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
        {