From: Oleg Endo Date: Sat, 13 Feb 2016 08:48:50 +0000 (+0000) Subject: backport: re PR target/67260 ([sh] Register spill bug for sibcall+complex+softfloat) X-Git-Tag: releases/gcc-4.9.4~325 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce4db9c4c8a064035f31023f4906f01821d25f89;p=thirdparty%2Fgcc.git backport: re PR target/67260 ([sh] Register spill bug for sibcall+complex+softfloat) gcc/ Backport from mainline 2016-02-13 Oleg Endo PR target/67260 * config/sh/sh.md (sibcall_value_pcrel): Replace =&k scratch reg with fixed R1_REG scratch reg. gcc/testsuite/ Backport from mainline 2016-02-13 Oleg Endo PR target/67260 * gcc.target/sh/torture/pr67260.c: New. From-SVN: r233402 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 17c8a2485c7b..320a9e846fab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-02-13 Oleg Endo + + Backport from mainline + 2016-02-13 Oleg Endo + + PR target/67260 + * config/sh/sh.md (sibcall_value_pcrel): Replace =&k scratch reg with + fixed R1_REG scratch reg. + 2016-02-12 Richard Biener Backport from mainline diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 906abb773652..bbbf54733ce6 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -9605,12 +9605,16 @@ label: (const_string "single") (const_string "double"))) (set_attr "type" "jump_ind")]) +;; sibcall_value_pcrel used to have a =&k clobber for the scratch register +;; that it needs for the branch address. This causes troubles when there +;; is a big overlap of argument and return value registers. Hence, use a +;; fixed call clobbered register for the address. See also PR 67260. (define_insn_and_split "sibcall_value_pcrel" [(set (match_operand 0 "" "=rf") (call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "")) (match_operand 2 "" ""))) (use (reg:PSI FPSCR_REG)) - (clobber (match_scratch:SI 3 "=k")) + (clobber (reg:SI R1_REG)) (return)] "TARGET_SH2" "#" @@ -9620,6 +9624,8 @@ label: rtx lab = PATTERN (gen_call_site ()); rtx call_insn; + operands[3] = gen_rtx_REG (SImode, R1_REG); + emit_insn (gen_sym_label2reg (operands[3], operands[1], lab)); call_insn = emit_call_insn (gen_sibcall_valuei_pcrel (operands[0], operands[3], diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 835010156d56..8a19de5cc789 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-02-13 Oleg Endo + + Backport from mainline + 2016-02-13 Oleg Endo + + PR target/67260 + * gcc.target/sh/torture/pr67260.c: New. + 2016-02-12 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.target/sh/torture/pr67260.c b/gcc/testsuite/gcc.target/sh/torture/pr67260.c new file mode 100644 index 000000000000..a7b70f0c99da --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/torture/pr67260.c @@ -0,0 +1,12 @@ +/* { dg-additional-options "-std=gnu99 -fPIC" } */ +/* { dg-do compile } */ + +#pragma GCC visibility push(hidden) + +double _Complex foo (double _Complex arg); + +double _Complex +bar (double _Complex arg) +{ + return foo (arg); +}