re PR target/60300 ([avr] Suboptimal stack pointer manipulation for frame setup)
authorGeorg-Johann Lay <avr@gjlay.de>
Wed, 23 Nov 2016 09:17:57 +0000 (09:17 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Wed, 23 Nov 2016 09:17:57 +0000 (09:17 +0000)
gcc/
PR target/60300
* config/avr/constraints.md (Csp): Widen range to [-11..6].
* config/avr/avr.c (avr_prologue_setup_frame): Limit number
of RCALLs in prologue to 3.

From-SVN: r242741

gcc/ChangeLog
gcc/config/avr/avr.c
gcc/config/avr/constraints.md

index ea39ef0785fb609872e03ddd82c31210f58bbd2e..92abe5207286bd046c54cdcc6904c2d329573e14 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-23  Georg-Johann Lay  <avr@gjlay.de>
+
+       PR target/60300
+       * config/avr/constraints.md (Csp): Widen range to [-11..6].
+       * config/avr/avr.c (avr_prologue_setup_frame): Limit number
+       of RCALLs in prologue to 3.
+
 2016-11-22  Michael Collison  <michael.collison@arm.com>
 
        * config/aarch64/aarch64-protos.h
index 7f3f93d026ce5a9c42702fe1763326fb0275a231..b6b1756ca2e2ba244cd2309bb390669a6074f5d9 100644 (file)
@@ -1687,7 +1687,11 @@ avr_prologue_setup_frame (HOST_WIDE_INT size, HARD_REG_SET set)
           /* Stack adjustment by means of RCALL . and/or PUSH __TMP_REG__
              can only handle specific offsets.  */
 
-          if (avr_sp_immediate_operand (gen_int_mode (-size, HImode), HImode))
+          int n_rcall = size / (AVR_3_BYTE_PC ? 3 : 2);
+
+          if (avr_sp_immediate_operand (gen_int_mode (-size, HImode), HImode)
+              // Don't use more than 3 RCALLs.
+              && n_rcall <= 3)
             {
               rtx_insn *sp_plus_insns;
 
index 80cff0c60c347666c5ee2e12cab6866390c16ec3..4836e3cb8b781b80e647ac47cc69a154fa885e55 100644 (file)
        (match_test "avr_popcount_each_byte (op, 4, (1<<0) | (1<<8))")))
 
 (define_constraint "Csp"
-  "Integer constant in the range -6 @dots{} 6."
+  "Integer constant in the range -11 @dots{} 6."
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, -6, 6)")))
+       (match_test "IN_RANGE (ival, -11, 6)")))
 
 (define_constraint "Cxf"
   "32-bit integer constant where at least one nibble is 0xf."