aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-12 02:01:20 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-12 02:01:20 +0000
commit66047dae3ebb518e713a5303e47eb3550e5c7488 (patch)
treee8b9bae5cae7343939f054de23fbc2a285da7d57
parent9e3516ceffed404286df5c7c23ae4c2e600fd78e (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-ssa5
-rw-r--r--gcc/testsuite/gcc.dg/uninit-H.c19
-rw-r--r--gcc/tree-ssa.c35
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