diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-21 10:52:57 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-21 10:52:57 +0000 |
commit | c0ac34cfccf4cb6795001a2e2b8249b9cc0f5912 (patch) | |
tree | 0f7a959861ab11b1c518ef5f522bb31a65930958 | |
parent | b1d666b956ed884bd2481f7722a56fa1b446964d (diff) | |
download | gcc-c0ac34cfccf4cb6795001a2e2b8249b9cc0f5912.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237642 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cse.c | 30 |
2 files changed, 25 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7112623940c..954ca4be321 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 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); |