Add some transitive closure
authorburley <burley@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 May 1999 22:33:09 +0000 (22:33 +0000)
committerburley <burley@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 May 1999 22:33:09 +0000 (22:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26850 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/varasm.c

index 40d12c7..8e7cc8e 100644 (file)
@@ -1,3 +1,8 @@
+Mon May 10 01:28:10 1999  Craig Burley  <craig@jcb-sc.com>
+
+       From Fri May 7  9:31:41 1999 Donn Terry (donn@interix.com):
+       * varasm.c (mark_constant_pool): Add some transitive closure.
+
 Sun May  9 22:51:04 1999  Craig Burley  <craig@jcb-sc.com>
 
        Fix gcc.dg/990506-0.c:
index 84746f6..e4eef2d 100644 (file)
@@ -3718,6 +3718,33 @@ mark_constant_pool ()
        insn = XEXP (insn, 1))
     if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
       mark_constants (PATTERN (insn));
+
+  /* It's possible that the only reference to a symbol is in a symbol
+     that's in the constant pool.  This happens in Fortran under some
+     situations.  (When the constant contains the address of another
+     constant, and only the first is used directly in an insn.) 
+     This is potentially suboptimal if there's ever a possibility of
+     backwards (in pool order) 2'd level references.  However, it's
+     not clear that 2'd level references can happen. */
+  for (pool = first_pool; pool; pool = pool->next)
+    {
+      struct pool_sym *sym;
+      char *label;
+
+      /* skip unmarked entries; no insn refers to them. */
+      if (!pool->mark)
+         continue;
+
+      label = XSTR (pool->constant, 0);
+
+      /* Be sure the symbol's value is marked. */
+      for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; 
+           sym = sym->next)
+         if (sym->label == label)
+           sym->pool->mark = 1;
+      /* If we didn't find it, there's something truly wrong here, but it
+        will be announced by the assembler. */
+    }
 }
 
 static void