diff -Nru gcc-4.0.3-old/gcc/tree-dfa.c gcc-4.0.3/gcc/tree-dfa.c
--- gcc-4.0.3-old/gcc/tree-dfa.c	2006-03-14 03:13:30.000000000 +0100
+++ gcc-4.0.3/gcc/tree-dfa.c	2006-03-14 03:16:56.000000000 +0100
@@ -898,10 +898,18 @@
       if (is_global_var (var))
 	mark_call_clobbered (var);
 
+
       /* Scan DECL_INITIAL for pointer variables as they may contain
-	 address arithmetic referencing the address of other
-	 variables.  */
-      if (DECL_INITIAL (var))
+         address arithmetic referencing the address of other
+         variables.  */
+      if (DECL_INITIAL (var)
+      /* Initializers of external variables are not useful to the
+         optimizers.  */
+        && !DECL_EXTERNAL (var)
+        /* It's not necessary to walk the initial value of non-constant
+           variables because it cannot be propagated by the
+           optimizers.  */
+        && (TREE_CONSTANT (var) || TREE_READONLY (var)))
       	walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
     }
 }
