cse.c (canon_asm_operands): New function extracted from...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 21 Jun 2016 10:52:57 +0000 (10:52 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 21 Jun 2016 10:52:57 +0000 (10:52 +0000)
* cse.c (canon_asm_operands): New function extracted from...
(canonicalize_insn): ...here.  Call it to canonicalize an ASM_OPERANDS
either standalone or member of a PARALLEL.

From-SVN: r237642

gcc/ChangeLog
gcc/cse.c

index 7112623..954ca4b 100644 (file)
@@ -1,3 +1,9 @@
+2016-06-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cse.c (canon_asm_operands): New function extracted from...
+       (canonicalize_insn): ...here.  Call it to canonicalize an ASM_OPERANDS
+       either standalone or member of a PARALLEL.
+
 2016-06-21  Georg-Johann Lay  <avr@gjlay.de>
 
        PR target/30417
index 3b4cc96..c14f29d 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4298,6 +4298,22 @@ find_sets_in_insn (rtx_insn *insn, struct set **psets)
   return n_sets;
 }
 \f
+/* Subroutine of canonicalize_insn.  X is an ASM_OPERANDS in INSN.  */
+
+static void
+canon_asm_operands (rtx x, rtx_insn *insn)
+{
+  for (int i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
+    {
+      rtx input = ASM_OPERANDS_INPUT (x, i);
+      if (!(REG_P (input) && HARD_REGISTER_P (input)))
+       {
+         input = canon_reg (input, insn);
+         validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
+       }
+    }
+}
+
 /* Where possible, substitute every register reference in the N_SETS
    number of SETS in INSN with the canonical register.
 
@@ -4361,17 +4377,7 @@ canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
     /* Canonicalize a USE of a pseudo register or memory location.  */
     canon_reg (x, insn);
   else if (GET_CODE (x) == ASM_OPERANDS)
-    {
-      for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
-       {
-         rtx input = ASM_OPERANDS_INPUT (x, i);
-         if (!(REG_P (input) && REGNO (input) < FIRST_PSEUDO_REGISTER))
-           {
-             input = canon_reg (input, insn);
-             validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
-           }
-       }
-    }
+    canon_asm_operands (x, insn);
   else if (GET_CODE (x) == CALL)
     {
       canon_reg (x, insn);
@@ -4400,6 +4406,8 @@ canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
                   && ! (REG_P (XEXP (y, 0))
                         && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
            canon_reg (y, insn);
+         else if (GET_CODE (y) == ASM_OPERANDS)
+           canon_asm_operands (y, insn);
          else if (GET_CODE (y) == CALL)
            {
              canon_reg (y, insn);