diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ab6dd74e1defd617c4afb0c776517bc4eaf333c1..c552233cdd04de3d8ad9b5e8332a3af21f0750e6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-04-22  Roger Sayle  <roger@eyesopen.com>
+
+	* alias.c (mark_constant_function):  Check for constancy and
+	purity even of void functions.  Update both the function decl
+	and the cgraph RTL info with the results.
+
 2003-04-22  Roger Sayle  <roger@eyesopen.com>
 
 	* real.c (do_add): Change to return a bool indicating that the
diff --git a/gcc/alias.c b/gcc/alias.c
index 49b53c9b5d79c1845855f25d32f290aa2152b2c7..4cd51e994f590119632a845d212e79a087c4cd38 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2642,7 +2642,7 @@ nonlocal_set_p (x)
   return for_each_rtx (&x, nonlocal_set_p_1, NULL);
 }
 
-/* Mark the function if it is constant.  */
+/* Mark the function if it is pure or constant.  */
 
 void
 mark_constant_function ()
@@ -2653,7 +2653,6 @@ mark_constant_function ()
   if (TREE_READONLY (current_function_decl)
       || DECL_IS_PURE (current_function_decl)
       || TREE_THIS_VOLATILE (current_function_decl)
-      || TYPE_MODE (TREE_TYPE (current_function_decl)) == VOIDmode
       || current_function_has_nonlocal_goto
       || !(*targetm.binds_local_p) (current_function_decl))
     return;
@@ -2688,9 +2687,15 @@ mark_constant_function ()
   if (insn)
     ;
   else if (nonlocal_memory_referenced)
-    cgraph_rtl_info (current_function_decl)->pure_function = 1;
+    {
+      cgraph_rtl_info (current_function_decl)->pure_function = 1;
+      DECL_IS_PURE (current_function_decl) = 1;
+    }
   else
-    cgraph_rtl_info (current_function_decl)->const_function = 1;
+    {
+      cgraph_rtl_info (current_function_decl)->const_function = 1;
+      TREE_READONLY (current_function_decl) = 1;
+    }
 }