OSDN Git Service

PR inline-asm/4823
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Jun 2003 18:01:26 +0000 (18:01 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Jun 2003 18:01:26 +0000 (18:01 +0000)
        * reg-stack.c (any_malformed_asm): New.
        (check_asm_stack_operands): Set it.
        (convert_regs_1): Check it before aborting.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@67845 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reg-stack.c

index 034412d..d5f5386 100644 (file)
@@ -1,3 +1,10 @@
+2003-06-10  Richard Henderson  <rth@redhat.com>
+
+        PR inline-asm/4823
+        * reg-stack.c (any_malformed_asm): New.
+        (check_asm_stack_operands): Set it.
+        (convert_regs_1): Check it before aborting.
+
 2003-06-12  Aldy Hernandez  <aldyh@redhat.com>
 
         * config/rs6000/spe.md: Change all clobbers of the accumulator to sets.
index 75a59e6..6efea36 100644 (file)
@@ -591,6 +591,9 @@ get_true_reg (pat)
       }
 }
 \f
+/* Set if we find any malformed asms in a block.  */
+static bool any_malformed_asm;
+
 /* There are many rules that an asm statement for stack-like regs must
    follow.  Those rules are explained at the top of this file: the rule
    numbers below refer to that explanation.  */
@@ -772,6 +775,7 @@ check_asm_stack_operands (insn)
     {
       /* Avoid further trouble with this insn.  */
       PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
+      any_malformed_asm = true;
       return 0;
     }
 
@@ -2692,6 +2696,7 @@ convert_regs_1 (file, block)
   edge e, beste = NULL;
 
   inserted = 0;
+  any_malformed_asm = false;
 
   /* Find the edge we will copy stack from.  It should be the most frequent
      one as it will get cheapest after compensation code is generated,
@@ -2805,9 +2810,12 @@ convert_regs_1 (file, block)
        }
     }
 
-  /* Something failed if the stack lives don't match.  */
+  /* Something failed if the stack lives don't match.  If we had malformed
+     asms, we zapped the instruction itself, but that didn't produce the
+     same pattern of register kills as before.  */
   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
-  abort ();
+  if (!any_malformed_asm)
+    abort ();
  win:
   bi->stack_out = regstack;