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
This commit is contained in:
Bernd Schmidt 2016-04-29 08:59:09 +00:00
parent 1390536b51
commit 849b265de1
5 changed files with 164 additions and 5 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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.

View File

@ -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);
}

View File

@ -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);
}
}