* flow.c (mark_used_regs): Improve handling of ASMs.
authorJeffrey A Law <law@cygnus.com>
Sat, 27 Mar 1999 15:18:32 +0000 (15:18 +0000)
committerJeff Law <law@gcc.gnu.org>
Sat, 27 Mar 1999 15:18:32 +0000 (08:18 -0700)
From-SVN: r26014

gcc/ChangeLog
gcc/flow.c

index 0a7843bd6a136fd5539d7046f270322b0808a3f7..a7e32fa1725b24ca7b8eb6671c39e36a6e36ac02 100644 (file)
@@ -1,3 +1,7 @@
+Sat Mar 27 16:13:50 1999  Jeffrey A Law  (law@cygnus.com)
+
+       * flow.c (mark_used_regs): Improve handling of ASMs.
+
 1999-03-26 Zack Weinberg  <zack@rabi.columbia.edu>
 
        * Makefile.in (xcpp, cppspec.o): New targets.
index f60daa48eed8b4c6a2e52f09ae1368429fcf4630..3c3c0904633509463b0d8db07819e3b89fb5b126 100644 (file)
@@ -242,7 +242,12 @@ static int loop_depth;
 static int cc0_live;
 
 /* During propagate_block, this contains a list of all the MEMs we are
-   tracking for dead store elimination.  */
+   tracking for dead store elimination. 
+
+   ?!? Note we leak memory by not free-ing items on this list.  We need to
+   write some generic routines to operate on memory lists since cse, gcse,
+   loop, sched, flow and possibly other passes all need to do basically the
+   same operations on these lists.  */
 
 static rtx mem_set_list;
 
@@ -3593,7 +3598,6 @@ mark_used_regs (needed, live, x, final, insn)
     case PC:
     case ADDR_VEC:
     case ADDR_DIFF_VEC:
-    case ASM_INPUT:
       return;
 
 #ifdef HAVE_cc0
@@ -3908,6 +3912,44 @@ mark_used_regs (needed, live, x, final, insn)
          SET_REGNO_REG_SET (live, i);
       break;
 
+    case ASM_OPERANDS:
+    case UNSPEC_VOLATILE:
+    case TRAP_IF:
+    case ASM_INPUT:
+      {
+       /* Traditional and volatile asm instructions must be considered to use
+          and clobber all hard registers, all pseudo-registers and all of
+          memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
+
+          Consider for instance a volatile asm that changes the fpu rounding
+          mode.  An insn should not be moved across this even if it only uses
+          pseudo-regs because it might give an incorrectly rounded result. 
+
+          ?!? Unfortunately, marking all hard registers as live causes massive
+          problems for the register allocator and marking all pseudos as live
+          creates mountains of uninitialized variable warnings.
+
+          So for now, just clear the memory set list and mark any regs
+          we can find in ASM_OPERANDS as used.  */
+       if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
+         mem_set_list = NULL_RTX;
+
+        /* For all ASM_OPERANDS, we must traverse the vector of input operands.
+          We can not just fall through here since then we would be confused
+          by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
+          traditional asms unlike their normal usage.  */
+       if (code == ASM_OPERANDS)
+         {
+           int j;
+
+           for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
+             mark_used_regs (needed, live, ASM_OPERANDS_INPUT (x, j),
+                             final, insn);
+         }
+       break;
+      }
+
+
     default:
       break;
     }