diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2016-06-21 10:52:57 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2016-06-21 10:52:57 +0000 |
commit | 6380a82ebec199fcd27f320c1f7115293781386b (patch) | |
tree | 0f7a959861ab11b1c518ef5f522bb31a65930958 /gcc/cse.c | |
parent | e9305990d98af36affb5ee11d9060915f1f3890c (diff) | |
download | gcc-6380a82ebec199fcd27f320c1f7115293781386b.zip gcc-6380a82ebec199fcd27f320c1f7115293781386b.tar.gz gcc-6380a82ebec199fcd27f320c1f7115293781386b.tar.bz2 |
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.c | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -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); |