summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-21 10:52:57 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-21 10:52:57 +0000
commitc0ac34cfccf4cb6795001a2e2b8249b9cc0f5912 (patch)
tree0f7a959861ab11b1c518ef5f522bb31a65930958
parentb1d666b956ed884bd2481f7722a56fa1b446964d (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cse.c30
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);