Commit d677263e by Renlin Li

[PR83370][AARCH64]Use tighter register constraint for sibcall patterns.

In aarch64 backend, ip0/ip1 register will be used in the prologue/epilogue as
temporary register.

When the compiler is performing sibcall optimization. It has the chance to use
ip0/ip1 register for indirect function call to hold the address. However,
those two register might be clobbered by the epilogue code which makes the
last sibcall instruction invalid.

The patch here renames the register class CALLER_SAVE_REGS to TAILCALL_ADDR_REGS
to reflect its usage, and remove IP registers from this class.

gcc/

2018-02-01  Renlin Li  <renlin.li@arm.com>

	PR target/83370
	* config/aarch64/aarch64.c (aarch64_class_max_nregs): Handle
	TAILCALL_ADDR_REGS.
	(aarch64_register_move_cost): Likewise.
	* config/aarch64/aarch64.h (reg_class): Rename CALLER_SAVE_REGS to
	TAILCALL_ADDR_REGS.
	(REG_CLASS_NAMES): Likewise.
	(REG_CLASS_CONTENTS): Rename CALLER_SAVE_REGS to
	TAILCALL_ADDR_REGS. Remove IP registers.
	* config/aarch64/aarch64.md (Ucs): Update register constraint.

gcc/testsuite/

2018-02-01  Richard Sandiford  <richard.sandiford@linaro.org>

	PR target/83370
	* gcc.target/aarch64/pr83370.c: New.

From-SVN: r257294
parent dc3b4a20
2018-02-01 Renlin Li <renlin.li@arm.com>
PR target/83370
* config/aarch64/aarch64.c (aarch64_class_max_nregs): Handle
TAILCALL_ADDR_REGS.
(aarch64_register_move_cost): Likewise.
* config/aarch64/aarch64.h (reg_class): Rename CALLER_SAVE_REGS to
TAILCALL_ADDR_REGS.
(REG_CLASS_NAMES): Likewise.
(REG_CLASS_CONTENTS): Rename CALLER_SAVE_REGS to
TAILCALL_ADDR_REGS. Remove IP registers.
* config/aarch64/aarch64.md (Ucs): Update register constraint.
2018-02-01 Richard Biener <rguenther@suse.de> 2018-02-01 Richard Biener <rguenther@suse.de>
* domwalk.h (dom_walker::dom_walker): Add additional constructor * domwalk.h (dom_walker::dom_walker): Add additional constructor
......
...@@ -7523,7 +7523,7 @@ aarch64_class_max_nregs (reg_class_t regclass, machine_mode mode) ...@@ -7523,7 +7523,7 @@ aarch64_class_max_nregs (reg_class_t regclass, machine_mode mode)
unsigned int nregs; unsigned int nregs;
switch (regclass) switch (regclass)
{ {
case CALLER_SAVE_REGS: case TAILCALL_ADDR_REGS:
case POINTER_REGS: case POINTER_REGS:
case GENERAL_REGS: case GENERAL_REGS:
case ALL_REGS: case ALL_REGS:
...@@ -9687,10 +9687,10 @@ aarch64_register_move_cost (machine_mode mode, ...@@ -9687,10 +9687,10 @@ aarch64_register_move_cost (machine_mode mode,
= aarch64_tune_params.regmove_cost; = aarch64_tune_params.regmove_cost;
/* Caller save and pointer regs are equivalent to GENERAL_REGS. */ /* Caller save and pointer regs are equivalent to GENERAL_REGS. */
if (to == CALLER_SAVE_REGS || to == POINTER_REGS) if (to == TAILCALL_ADDR_REGS || to == POINTER_REGS)
to = GENERAL_REGS; to = GENERAL_REGS;
if (from == CALLER_SAVE_REGS || from == POINTER_REGS) if (from == TAILCALL_ADDR_REGS || from == POINTER_REGS)
from = GENERAL_REGS; from = GENERAL_REGS;
/* Moving between GPR and stack cost is the same as GP2GP. */ /* Moving between GPR and stack cost is the same as GP2GP. */
......
...@@ -507,7 +507,7 @@ extern unsigned aarch64_architecture_version; ...@@ -507,7 +507,7 @@ extern unsigned aarch64_architecture_version;
enum reg_class enum reg_class
{ {
NO_REGS, NO_REGS,
CALLER_SAVE_REGS, TAILCALL_ADDR_REGS,
GENERAL_REGS, GENERAL_REGS,
STACK_REG, STACK_REG,
POINTER_REGS, POINTER_REGS,
...@@ -526,7 +526,7 @@ enum reg_class ...@@ -526,7 +526,7 @@ enum reg_class
#define REG_CLASS_NAMES \ #define REG_CLASS_NAMES \
{ \ { \
"NO_REGS", \ "NO_REGS", \
"CALLER_SAVE_REGS", \ "TAILCALL_ADDR_REGS", \
"GENERAL_REGS", \ "GENERAL_REGS", \
"STACK_REG", \ "STACK_REG", \
"POINTER_REGS", \ "POINTER_REGS", \
...@@ -542,7 +542,7 @@ enum reg_class ...@@ -542,7 +542,7 @@ enum reg_class
#define REG_CLASS_CONTENTS \ #define REG_CLASS_CONTENTS \
{ \ { \
{ 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \ { 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \
{ 0x0007ffff, 0x00000000, 0x00000000 }, /* CALLER_SAVE_REGS */ \ { 0x0004ffff, 0x00000000, 0x00000000 }, /* TAILCALL_ADDR_REGS */\
{ 0x7fffffff, 0x00000000, 0x00000003 }, /* GENERAL_REGS */ \ { 0x7fffffff, 0x00000000, 0x00000003 }, /* GENERAL_REGS */ \
{ 0x80000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \ { 0x80000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \
{ 0xffffffff, 0x00000000, 0x00000003 }, /* POINTER_REGS */ \ { 0xffffffff, 0x00000000, 0x00000003 }, /* POINTER_REGS */ \
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
(define_register_constraint "k" "STACK_REG" (define_register_constraint "k" "STACK_REG"
"@internal The stack register.") "@internal The stack register.")
(define_register_constraint "Ucs" "CALLER_SAVE_REGS" (define_register_constraint "Ucs" "TAILCALL_ADDR_REGS"
"@internal The caller save registers.") "@internal Registers suitable for an indirect tail call")
(define_register_constraint "w" "FP_REGS" (define_register_constraint "w" "FP_REGS"
"Floating point and SIMD vector registers.") "Floating point and SIMD vector registers.")
......
2018-02-01 Richard Sandiford <richard.sandiford@linaro.org>
PR target/83370
* gcc.target/aarch64/pr83370.c: New.
2018-02-01 Richard Biener <rguenther@suse.de> 2018-02-01 Richard Biener <rguenther@suse.de>
* gcc.dg/graphite/pr35356-1.c: Adjust. * gcc.dg/graphite/pr35356-1.c: Adjust.
......
/* { dg-do run } */
/* { dg-options "-O2" } */
typedef void (*fun) (void);
void __attribute__ ((noipa))
f (fun x1)
{
register fun x2 asm ("x16");
int arr[5000];
int *volatile ptr = arr;
asm ("mov %0, %1" : "=r" (x2) : "r" (x1));
x2 ();
}
void g (void) {}
int
main (void)
{
f (g);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment