diff options
author | Bernd Schmidt <bernds@gcc.gnu.org> | 2016-04-29 08:59:09 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2016-04-29 08:59:09 +0000 |
commit | 849b265de120169d2171806568ae1b977ec96193 (patch) | |
tree | 60f090609b425a9db96f82080a5d8874885d6a81 | |
parent | 1390536b5144f4bfc41d17eb4644276090bbd546 (diff) | |
download | gcc-849b265de120169d2171806568ae1b977ec96193.zip gcc-849b265de120169d2171806568ae1b977ec96193.tar.gz gcc-849b265de120169d2171806568ae1b977ec96193.tar.bz2 |
avr-related reload fix from Senthil Kumar Selvaraj
PR target/60040
* reload1.c (reload): Call finish_spills before
restarting reload loop. Skip select_reload_regs
if update_eliminables_and_spill returns true.
testsuite/
PR target/60040
* gcc.target/avr/pr60040-1.c: New.
* gcc.target/avr/pr60040-2.c: New.
From-SVN: r235625
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/reload1.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/avr/pr60040-1.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/avr/pr60040-2.c | 112 |
5 files changed, 164 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a92fd76..0ed967c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-04-29 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> + + PR target/60040 + * reload1.c (reload): Call finish_spills before + restarting reload loop. Skip select_reload_regs + if update_eliminables_and_spill returns true. + 2016-04-29 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc.h (UNSIGNED_INT12, UNSIGNED_INT16): Define. diff --git a/gcc/reload1.c b/gcc/reload1.c index c2800f8..d6fcece 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -981,7 +981,8 @@ reload (rtx_insn *first, int global) /* If we allocated another stack slot, redo elimination bookkeeping. */ if (something_was_spilled || starting_frame_size != get_frame_size ()) { - update_eliminables_and_spill (); + if (update_eliminables_and_spill ()) + finish_spills (global); continue; } @@ -1021,10 +1022,12 @@ reload (rtx_insn *first, int global) did_spill = 1; something_changed = 1; } - - select_reload_regs (); - if (failure) - goto failed; + else + { + select_reload_regs (); + if (failure) + goto failed; + } if (insns_need_reload != 0 || did_spill) something_changed |= finish_spills (global); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 860e343..e6850db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-04-29 Sebastian Huber <sebastian.huber@embedded-brains.de> + Matthijs Kooijman <matthijs@stdin.nl> + Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> + + PR target/60040 + * gcc.target/avr/pr60040-1.c: New. + * gcc.target/avr/pr60040-2.c: New. + 2016-04-29 Richard Biener <rguenther@suse.de> * gcc.dg/tree-ssa/pr18589-10.c: Adjust. diff --git a/gcc/testsuite/gcc.target/avr/pr60040-1.c b/gcc/testsuite/gcc.target/avr/pr60040-1.c new file mode 100644 index 0000000..4fe296b --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr60040-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-Os" } */ + +float dhistory[10]; +float test; + +float getSlope(float history[]) { + float sumx = 0; + float sumy = 0; + float sumxy = 0; + float sumxsq = 0; + float rate = 0; + int n = 10; + + int i; + for (i=1; i< 11; i++) { + sumx = sumx + i; + sumy = sumy + history[i-1]; + sumy = sumy + history[i-1]; + sumxsq = sumxsq + (i*i); + } + + rate = sumy+sumx+sumxsq; + return rate; +} + +void loop() { + test = getSlope(dhistory); +} diff --git a/gcc/testsuite/gcc.target/avr/pr60040-2.c b/gcc/testsuite/gcc.target/avr/pr60040-2.c new file mode 100644 index 0000000..c40d49f --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr60040-2.c @@ -0,0 +1,112 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef unsigned char __uint8_t; +typedef short unsigned int __uint16_t; +typedef long unsigned int __uint32_t; +typedef __uint8_t uint8_t ; +typedef __uint16_t uint16_t ; +typedef __uint32_t uint32_t ; +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; +typedef enum rtems_blkdev_request_op { + RTEMS_BLKDEV_REQ_READ, +} rtems_fdisk_segment_desc; +typedef struct rtems_fdisk_driver_handlers +{ + int (*blank) (const rtems_fdisk_segment_desc* sd, + uint32_t device, + uint32_t segment, + uint32_t offset, + uint32_t size); +} rtems_fdisk_driver_handlers; +typedef struct rtems_fdisk_page_desc +{ + uint16_t flags; + uint32_t block; +} rtems_fdisk_page_desc; +typedef struct rtems_fdisk_segment_ctl +{ + rtems_fdisk_page_desc* page_descriptors; + uint32_t pages_active; +} rtems_fdisk_segment_ctl; +typedef struct rtems_fdisk_segment_ctl_queue +{ +} rtems_fdisk_segment_ctl_queue; +typedef struct rtems_fdisk_device_ctl +{ + uint32_t flags; + uint8_t* copy_buffer; +} rtems_flashdisk; + +extern void rtems_fdisk_error (const char *, ...); +extern int rtems_fdisk_seg_write(const rtems_flashdisk*, + rtems_fdisk_segment_ctl*, + uint32_t, + const rtems_fdisk_page_desc* page_desc, + uint32_t); + +void rtems_fdisk_printf (const rtems_flashdisk* fd, const char *format, ...) +{ + { + va_list args; + __builtin_va_start(args,format); + } +} +static int +rtems_fdisk_seg_blank_check (const rtems_flashdisk* fd, + rtems_fdisk_segment_ctl* sc, + uint32_t offset, + uint32_t size) +{ + uint32_t device; + uint32_t segment; + const rtems_fdisk_segment_desc* sd; + const rtems_fdisk_driver_handlers* ops; + return ops->blank (sd, device, segment, offset, size); +} +static int +rtems_fdisk_seg_write_page_desc (const rtems_flashdisk* fd, + rtems_fdisk_segment_ctl* sc, + uint32_t page, + const rtems_fdisk_page_desc* page_desc) +{ + uint32_t offset = page * sizeof (rtems_fdisk_page_desc); + if ((fd->flags & (1 << 3))) + { + int ret = rtems_fdisk_seg_blank_check (fd, sc, + offset, + sizeof (rtems_fdisk_page_desc)); + } + return rtems_fdisk_seg_write (fd, sc, offset, + page_desc, sizeof (rtems_fdisk_page_desc)); +} +void +rtems_fdisk_recycle_segment (rtems_flashdisk* fd, + rtems_fdisk_segment_ctl* ssc, + rtems_fdisk_segment_ctl* dsc, + uint32_t *pages) +{ + int ret; + uint32_t spage; + uint32_t used = 0; + uint32_t active = 0; + { + rtems_fdisk_page_desc* spd = &ssc->page_descriptors[spage]; + { + rtems_fdisk_page_desc* dpd; + uint32_t dpage; + dpd = &dsc->page_descriptors[dpage]; + *dpd = *spd; + ret = rtems_fdisk_seg_write_page_desc (fd, + dsc, + dpage, dpd); + } + } + rtems_fdisk_printf (fd, "ssc end: %d-%d: p=%ld, a=%ld, u=%ld", + pages, active, used); + { + rtems_fdisk_error ("compacting: ssc pages not 0: %d", + ssc->pages_active); + } +} |