summaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2016-06-21 10:52:57 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2016-06-21 10:52:57 +0000
commit6380a82ebec199fcd27f320c1f7115293781386b (patch)
tree0f7a959861ab11b1c518ef5f522bb31a65930958 /gcc/cse.c
parente9305990d98af36affb5ee11d9060915f1f3890c (diff)
downloadgcc-6380a82ebec199fcd27f320c1f7115293781386b.tar.gz
cse.c (canon_asm_operands): New function extracted from...
* 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
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 3b4cc96ce05..c14f29ddf73 100644
--- 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;
}
+/* 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);