diff options
author | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-17 09:07:31 +0000 |
---|---|---|
committer | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-17 09:07:31 +0000 |
commit | 1a665a74387cd9365548afcd47cdb0756af87cab (patch) | |
tree | 281a1a220070390be3fb15977c0425a4318f99c9 /gcc | |
parent | d7a25e7413231bfc5e6bce49a803344138c44073 (diff) | |
download | ppe42-gcc-1a665a74387cd9365548afcd47cdb0756af87cab.tar.gz ppe42-gcc-1a665a74387cd9365548afcd47cdb0756af87cab.zip |
gcc:
2008-07-17 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/36753
* fwprop.c (use_killed_between): Don't shortcut
single-definition global registers.
gcc/testsuite:
2008-07-17 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/36753
* gcc.target/i386/pr36753.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137913 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fwprop.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr36753.c | 31 |
4 files changed, 49 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 322e47d8399..7933b10d60c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-07-17 Paolo Bonzini <bonzini@gnu.org> + + PR rtl-optimization/36753 + * fwprop.c (use_killed_between): Don't shortcut + single-definition global registers. + 2008-07-16 Jan Hubicka <jh@suse.cz> * cgraph.h (varpool_empty_needed_queue): Declare. diff --git a/gcc/fwprop.c b/gcc/fwprop.c index e6700019644..fbe432974f4 100644 --- a/gcc/fwprop.c +++ b/gcc/fwprop.c @@ -527,10 +527,15 @@ use_killed_between (struct df_ref *use, rtx def_insn, rtx target_insn) return true; /* Check if the reg in USE has only one definition. We already - know that this definition reaches use, or we wouldn't be here. */ + know that this definition reaches use, or we wouldn't be here. + However, this is invalid for hard registers because if they are + live at the beginning of the function it does not mean that we + have an uninitialized access. */ regno = DF_REF_REGNO (use); def = DF_REG_DEF_CHAIN (regno); - if (def && (def->next_reg == NULL)) + if (def + && def->next_reg == NULL + && regno >= FIRST_PSEUDO_REGISTER) return false; /* Check locally if we are in the same basic block. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54da1a1b18d..ec7dc0540d8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-07-17 Paolo Bonzini <bonzini@gnu.org> + + PR rtl-optimization/36753 + * gcc.target/i386/pr36753.c: New. + 2008-07-17 Tobias Burnus <burnus@net-b.de> PR fortran/36825 diff --git a/gcc/testsuite/gcc.target/i386/pr36753.c b/gcc/testsuite/gcc.target/i386/pr36753.c new file mode 100644 index 00000000000..2d43d42a021 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr36753.c @@ -0,0 +1,31 @@ +/* { dg-options "-O2" } */ +/* { dg-do run } */ + +#if defined __i386__ +#define REG "edi" +#else +#define REG "r14" +#endif + +register unsigned long *ds asm(REG); + +extern void abort (void); + +__attribute__ ((noinline)) void +test (void) +{ + *++ds = 31337; +} + +int +main () +{ + unsigned long stack[2]; + stack[0] = 0; + stack[1] = 0; + ds = stack; + test (); + if (ds != stack + 1 || *ds != 31337) + abort (); + return 0; +} |