aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2009-08-23 14:14:26 +0200
committerUros Bizjak <uros@gcc.gnu.org>2009-08-23 14:14:26 +0200
commitfe62197bedacea53202fd27fbc3e69c577eac692 (patch)
tree8c745f6a7ed37db1f270bfdaf83380706b6a6937
parent8c40d061eca6c784a919c666e363cac4116874cc (diff)
downloadgcc-fe62197bedacea53202fd27fbc3e69c577eac692.zip
gcc-fe62197bedacea53202fd27fbc3e69c577eac692.tar.gz
gcc-fe62197bedacea53202fd27fbc3e69c577eac692.tar.bz2
re PR target/40718 (Invalid code produced with -foptimize-sibling-calls)
PR target/40718 * config/i386/i386.c (*call_pop_1): Disable for sibling calls. (*call_value_pop_1): Ditto. (*sibcall_pop_1): New insn pattern. (*sibcall_value_pop_1): Ditto. From-SVN: r151029
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/config/i386/i386.md26
2 files changed, 17 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index defd6b7..10333a9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,7 +2,9 @@
PR target/40718
* config/i386/i386.c (*call_pop_1): Disable for sibling calls.
+ (*call_value_pop_1): Ditto.
(*sibcall_pop_1): New insn pattern.
+ (*sibcall_value_pop_1): Ditto.
2009-08-23 Alan Modra <amodra@bigpond.net.au>
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 3be44d3..0735d5e 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -22095,22 +22095,26 @@
(match_operand:SI 2 "" "")))
(set (reg:SI SP_REG) (plus:SI (reg:SI SP_REG)
(match_operand:SI 3 "immediate_operand" "i")))]
- "!TARGET_64BIT"
+ "!SIBLING_CALL_P (insn) && !TARGET_64BIT"
{
if (constant_call_address_operand (operands[1], Pmode))
- {
- if (SIBLING_CALL_P (insn))
- return "jmp\t%P1";
- else
- return "call\t%P1";
- }
- if (SIBLING_CALL_P (insn))
- return "jmp\t%A1";
- else
- return "call\t%A1";
+ return "call\t%P1";
+ return "call\t%A1";
}
[(set_attr "type" "callv")])
+(define_insn "*sibcall_value_pop_1"
+ [(set (match_operand 0 "" "")
+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "s,U"))
+ (match_operand:SI 2 "" "")))
+ (set (reg:SI SP_REG) (plus:SI (reg:SI SP_REG)
+ (match_operand:SI 3 "immediate_operand" "i,i")))]
+ "SIBLING_CALL_P (insn) && !TARGET_64BIT"
+ "@
+ jmp\t%P1
+ jmp\t%A1"
+ [(set_attr "type" "callv")])
+
(define_insn "*call_value_0"
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))