diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2016-11-23 09:17:57 +0000 |
---|---|---|
committer | Georg-Johann Lay <gjl@gcc.gnu.org> | 2016-11-23 09:17:57 +0000 |
commit | a80504892ef9696ffe81248667798f1ac7d5a678 (patch) | |
tree | 66afdabf47c12c959edc128829079dd072feede8 /gcc | |
parent | ec1c569473de7c478653b6f518d8d8bba18e3f1b (diff) | |
download | gcc-a80504892ef9696ffe81248667798f1ac7d5a678.zip gcc-a80504892ef9696ffe81248667798f1ac7d5a678.tar.gz gcc-a80504892ef9696ffe81248667798f1ac7d5a678.tar.bz2 |
re PR target/60300 ([avr] Suboptimal stack pointer manipulation for frame setup)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 6 | ||||
-rw-r--r-- | gcc/config/avr/constraints.md | 4 |
3 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea39ef0..92abe52 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 7f3f93d..b6b1756 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -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; diff --git a/gcc/config/avr/constraints.md b/gcc/config/avr/constraints.md index 80cff0c..4836e3c 100644 --- a/gcc/config/avr/constraints.md +++ b/gcc/config/avr/constraints.md @@ -189,9 +189,9 @@ (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." |