From b04ffa565302de59ad22d8211925f78c52b042e5 Mon Sep 17 00:00:00 2001 From: Georg-Johann Lay Date: Thu, 28 Jun 2012 13:53:51 +0000 Subject: [PATCH] re PR other/53595 (Code size increase of +10% between two 4.7.1 snapshot) PR 53595 * config/avr/avr.c (avr_hard_regno_call_part_clobbered): New. * config/avr/avr-protos.h (avr_hard_regno_call_part_clobbered): New. * config/avr/avr.h (HARD_REGNO_CALL_PART_CLOBBERED): Forward to avr_hard_regno_call_part_clobbered. From-SVN: r189049 --- gcc/ChangeLog | 8 ++++++++ gcc/config/avr/avr-protos.h | 1 + gcc/config/avr/avr.c | 22 ++++++++++++++++++++++ gcc/config/avr/avr.h | 6 ++---- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 76e8913d6ae3..04a35102a38b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-06-28 Georg-Johann Lay + + PR 53595 + * config/avr/avr.c (avr_hard_regno_call_part_clobbered): New. + * config/avr/avr-protos.h (avr_hard_regno_call_part_clobbered): New. + * config/avr/avr.h (HARD_REGNO_CALL_PART_CLOBBERED): Forward to + avr_hard_regno_call_part_clobbered. + 2012-06-28 Richard Guenther PR middle-end/53790 diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index fa1462ce886e..7b9b05effa60 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -47,6 +47,7 @@ extern void init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, #endif /* TREE_CODE */ #ifdef RTX_CODE +extern int avr_hard_regno_call_part_clobbered (unsigned, enum machine_mode); extern const char *output_movqi (rtx insn, rtx operands[], int *l); extern const char *output_movhi (rtx insn, rtx operands[], int *l); extern const char *output_movsisf (rtx insn, rtx operands[], int *l); diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 8199d2e4f902..68048b603e86 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -8856,6 +8856,28 @@ avr_hard_regno_mode_ok (int regno, enum machine_mode mode) } +/* Implement `HARD_REGNO_CALL_PART_CLOBBERED'. */ + +int +avr_hard_regno_call_part_clobbered (unsigned regno, enum machine_mode mode) +{ + /* FIXME: This hook gets called with MODE:REGNO combinations that don't + represent valid hard registers like, e.g. HI:29. Returning TRUE + for such registers can lead to performance degradation as mentioned + in PR53595. Thus, report invalid hard registers as FALSE. */ + + if (!avr_hard_regno_mode_ok (regno, mode)) + return 0; + + /* Return true if any of the following boundaries is crossed: + 17/18, 27/28 and 29/30. */ + + return ((regno < 18 && regno + GET_MODE_SIZE (mode) > 18) + || (regno < REG_Y && regno + GET_MODE_SIZE (mode) > REG_Y) + || (regno < REG_Z && regno + GET_MODE_SIZE (mode) > REG_Z)); +} + + /* Implement `MODE_CODE_BASE_REG_CLASS'. */ enum reg_class diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 54c127469e1c..48fd49544f8c 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -402,10 +402,8 @@ enum reg_class { #define REGNO_OK_FOR_INDEX_P(NUM) 0 -#define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \ - (((REGNO) < 18 && (REGNO) + GET_MODE_SIZE (MODE) > 18) \ - || ((REGNO) < REG_Y && (REGNO) + GET_MODE_SIZE (MODE) > REG_Y) \ - || ((REGNO) < REG_Z && (REGNO) + GET_MODE_SIZE (MODE) > REG_Z)) +#define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \ + avr_hard_regno_call_part_clobbered (REGNO, MODE) #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true