re PR other/53595 (Code size increase of +10% between two 4.7.1 snapshot)
authorGeorg-Johann Lay <avr@gjlay.de>
Thu, 28 Jun 2012 13:53:51 +0000 (13:53 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Thu, 28 Jun 2012 13:53:51 +0000 (13:53 +0000)
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
gcc/config/avr/avr-protos.h
gcc/config/avr/avr.c
gcc/config/avr/avr.h

index 76e8913d6ae35cf790d340b5c6c375ba53d05ad8..04a35102a38b12155c6fb95e759163c0fd512081 100644 (file)
@@ -1,3 +1,11 @@
+2012-06-28  Georg-Johann Lay  <avr@gjlay.de>
+
+       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  <rguenther@suse.de>
 
        PR middle-end/53790
index fa1462ce886ea7167f4d88f8bc66b0aa0b4a0e77..7b9b05effa60ddc81a708712c6a0aa5acaccd8c4 100644 (file)
@@ -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);
index 8199d2e4f9024e2853924cce336a49d7305a7354..68048b603e86b661774c10f1564611243fcb7cbf 100644 (file)
@@ -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
index 54c127469e1c9b6759089798821779da557ab544..48fd49544f8c1727dc65d7fa17447b96c7930fc5 100644 (file)
@@ -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