diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 74fad5bc6cf4210747e8613848d5d0d662e0bcb4..79f01d31b0053166a08d916164f3ce3cbb8a1a2a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -15,6 +15,8 @@
 
 2003-06-15  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+	* gencheck.c (main): Avoid generating duplicate macros.
+
 	* Makefile.in (stagefeedback-start): Use $(SUBDIRS) instead of
 	knowing names of language subdirectories.
 
diff --git a/gcc/gencheck.c b/gcc/gencheck.c
index fd037bdd7f57896f703f1de94efa77dcc010b3f2..aedd4965530d013c9d3726cd3d784d4de09f7bad 100644
--- a/gcc/gencheck.c
+++ b/gcc/gencheck.c
@@ -44,7 +44,7 @@ usage (void)
 int
 main (int argc, char **argv ATTRIBUTE_UNUSED)
 {
-  int i;
+  int i, j;
 
   switch (argc)
     {
@@ -60,10 +60,18 @@ main (int argc, char **argv ATTRIBUTE_UNUSED)
   puts ("#ifndef GCC_TREE_CHECK_H");
   puts ("#define GCC_TREE_CHECK_H\n");
 
+  /* Print macros for checks based on each of the tree code names.  However,
+     since we include the tree nodes from all languages, we must check
+     for duplicate names to avoid defining the same macro twice.  */
   for (i = 0; tree_codes[i]; i++)
     {
-      printf ("#define %s_CHECK(t)\tTREE_CHECK (t, %s)\n",
-	      tree_codes[i], tree_codes[i]);
+      for (j = 0; j < i; j++)
+	if (strcmp (tree_codes[i], tree_codes[j]) == 0)
+	  break;
+
+      if (i == j)
+	printf ("#define %s_CHECK(t)\tTREE_CHECK (t, %s)\n",
+		tree_codes[i], tree_codes[i]);
     }
 
   puts ("\n#endif /* GCC_TREE_CHECK_H */");