diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-12 02:01:20 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-12 02:01:20 +0000 |
commit | 66047dae3ebb518e713a5303e47eb3550e5c7488 (patch) | |
tree | e8b9bae5cae7343939f054de23fbc2a285da7d57 | |
parent | 9e3516ceffed404286df5c7c23ae4c2e600fd78e (diff) |
PR 14204
* tree-ssa.c (warn_uninit): Don't warn for hard register variables.
* gcc.dg/uninit-H.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/tree-ssa-20020619-branch@79365 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.tree-ssa | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-H.c | 19 | ||||
-rw-r--r-- | gcc/tree-ssa.c | 35 |
3 files changed, 46 insertions, 13 deletions
diff --git a/gcc/ChangeLog.tree-ssa b/gcc/ChangeLog.tree-ssa index 97f7a172bab..b25553af1f3 100644 --- a/gcc/ChangeLog.tree-ssa +++ b/gcc/ChangeLog.tree-ssa @@ -1,3 +1,8 @@ +2004-03-11 Richard Henderson <rth@redhat.com> + + PR 14204 + * tree-ssa.c (warn_uninit): Don't warn for hard register variables. + 2004-03-10 Richard Henderson <rth@redhat.com> * tree-simple.c (get_base_var, get_base_decl): Remove. diff --git a/gcc/testsuite/gcc.dg/uninit-H.c b/gcc/testsuite/gcc.dg/uninit-H.c new file mode 100644 index 00000000000..30f58308886 --- /dev/null +++ b/gcc/testsuite/gcc.dg/uninit-H.c @@ -0,0 +1,19 @@ +/* PR 14204 */ +/* { dg-do compile } */ +/* { dg-options "-O -Wall -Werror" } */ + +#if defined __alpha__ +# define ASM __asm__("$30") +#elif defined __i386__ +# define ASM __asm__("esp") +#elif defined __powerpc__ +# define ASM __asm__("r1") +#else +# define ASM +#endif + +void *load_PCB (void) +{ + register void *sp ASM; + return sp; /* { dg-bogus "uninitialized" } */ +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index cf48ea87c8f..2497c7838f7 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -4090,19 +4090,28 @@ warn_uninit (tree t, const char *msgid, location_t *locus) tree var = SSA_NAME_VAR (t); tree def = SSA_NAME_DEF_STMT (t); - /* Default uses (indicated by an empty definition statement), are - uninitialized. Except for PARMs of course, which are always - initialized. TREE_NO_WARNING either means we already warned, - or the front end wishes to suppress the warning. */ - if (IS_EMPTY_STMT (def) - && TREE_CODE (var) != PARM_DECL - && !TREE_NO_WARNING (var)) - { - if (!locus) - locus = &DECL_SOURCE_LOCATION (var); - warning (msgid, locus, var); - TREE_NO_WARNING (var) = 1; - } + /* Default uses (indicated by an empty definition statement), + are uninitialized. */ + if (!IS_EMPTY_STMT (def)) + return; + + /* Except for PARMs of course, which are always initialized. */ + if (TREE_CODE (var) == PARM_DECL) + return; + + /* Hard register variables get their initial value from the ether. */ + if (DECL_HARD_REGISTER (var)) + return; + + /* TREE_NO_WARNING either means we already warned, or the front end + wishes to suppress the warning. */ + if (TREE_NO_WARNING (var)) + return; + + if (!locus) + locus = &DECL_SOURCE_LOCATION (var); + warning (msgid, locus, var); + TREE_NO_WARNING (var) = 1; } /* Called via walk_tree, look for SSA_NAMEs that have empty definitions |