aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>2016-03-01 09:19:14 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2016-03-01 09:19:14 +0000
commit772040f7967768f060d5a6c2e528ace2f1439ef3 (patch)
tree40fa4d5a3c60cf562ed26ab6cf2d20746bff3dbb /gcc
parent0f09ab882507915df439054da380d5d646181f7a (diff)
downloadgcc-772040f7967768f060d5a6c2e528ace2f1439ef3.zip
gcc-772040f7967768f060d5a6c2e528ace2f1439ef3.tar.gz
gcc-772040f7967768f060d5a6c2e528ace2f1439ef3.tar.bz2
gensupport: Fix define_subst operand renumbering.
When processing substitutions the operands are renumbered. To find a free operand number the array used_operands_numbers is used. Currently this array is used to assign new numbers before all the RTXes in the vector have been processed. I did run into problems with this for insns where a match_dup occurred in a later (use ...) operand referring to an earlier operand (e.g. s390.md "setmem_long"). The patch splits the loop doing the processing into two in order to have all the operand numbers collected already when assigning new numbers. gcc/ChangeLog: 2016-03-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * gensupport.c (process_substs_on_one_elem): Split loop to complete mark_operands_used_in_match_dup on all expressions in the vector first. (adjust_operands_numbers): Inline into process_substs_on_one_elem and remove function. From-SVN: r233841
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gensupport.c45
2 files changed, 28 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1461a95..b1bdd0d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-03-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ * gensupport.c (process_substs_on_one_elem): Split loop to
+ complete mark_operands_used_in_match_dup on all expressions in the
+ vector first.
+ (adjust_operands_numbers): Inline into process_substs_on_one_elem
+ and remove function.
+
2016-02-29 Eric Botcazou <ebotcazou@adacore.com>
PR target/69706
diff --git a/gcc/gensupport.c b/gcc/gensupport.c
index 8c5a1ab..de29579 100644
--- a/gcc/gensupport.c
+++ b/gcc/gensupport.c
@@ -126,7 +126,10 @@ static const char * duplicate_each_alternative (const char * str, int n_dup);
typedef const char * (*constraints_handler_t) (const char *, int);
static rtx alter_constraints (rtx, int, constraints_handler_t);
-static rtx adjust_operands_numbers (rtx);
+
+static void mark_operands_used_in_match_dup (rtx);
+static void renumerate_operands_in_pattern (rtx);
+
static rtx replace_duplicating_operands_in_pattern (rtx);
/* Make a version of gen_rtx_CONST_INT so that GEN_INT can be used in
@@ -1844,7 +1847,18 @@ process_substs_on_one_elem (struct queue_elem *elem,
subst_pattern = alter_constraints (subst_pattern, alternatives,
duplicate_each_alternative);
- subst_pattern = adjust_operands_numbers (subst_pattern);
+ mark_operands_used_in_match_dup (subst_pattern);
+ RTVEC_ELT (subst_pattern_vec, j) = subst_pattern;
+ }
+
+ for (j = 0; j < XVECLEN (subst_elem->data, 3); j++)
+ {
+ subst_pattern = RTVEC_ELT (subst_pattern_vec, j);
+
+ /* The number of MATCH_OPERANDs in the output pattern might
+ change. This routine assigns new numbers to the
+ MATCH_OPERAND expressions to avoid collisions. */
+ renumerate_operands_in_pattern (subst_pattern);
/* Substitute match_dup and match_op_dup in the new pattern and
duplicate constraints. */
@@ -1857,7 +1871,6 @@ process_substs_on_one_elem (struct queue_elem *elem,
if (GET_CODE (elem->data) == DEFINE_EXPAND)
remove_constraints (subst_pattern);
- RTVEC_ELT (subst_pattern_vec, j) = subst_pattern;
}
XVEC (elem->data, 1) = subst_pattern_vec;
@@ -1927,7 +1940,7 @@ mark_operands_from_match_dup (rtx pattern)
}
}
-/* This is a subroutine of adjust_operands_numbers.
+/* This is a subroutine of process_substs_on_one_elem.
It goes through all expressions in PATTERN and when MATCH_DUP is
met, all MATCH_OPERANDs inside it is marked as occupied. The
process of marking is done by routin mark_operands_from_match_dup. */
@@ -1973,10 +1986,9 @@ find_first_unused_number_of_operand ()
return MAX_OPERANDS;
}
-/* This is subroutine of adjust_operands_numbers.
- It visits all expressions in PATTERN and assigns not-occupied
- operand indexes to MATCH_OPERANDs and MATCH_OPERATORs of this
- PATTERN. */
+/* This is a subroutine of process_substs_on_one_elem. It visits all
+ expressions in PATTERN and assigns not-occupied operand indexes to
+ MATCH_OPERANDs and MATCH_OPERATORs of this PATTERN. */
static void
renumerate_operands_in_pattern (rtx pattern)
{
@@ -2011,23 +2023,6 @@ renumerate_operands_in_pattern (rtx pattern)
}
}
-/* If output pattern of define_subst contains MATCH_DUP, then this
- expression would be replaced with the pattern, matched with
- MATCH_OPERAND from input pattern. This pattern could contain any
- number of MATCH_OPERANDs, MATCH_OPERATORs etc., so it's possible
- that a MATCH_OPERAND from output_pattern (if any) would have the
- same number, as MATCH_OPERAND from copied pattern. To avoid such
- indexes overlapping, we assign new indexes to MATCH_OPERANDs,
- laying in the output pattern outside of MATCH_DUPs. */
-static rtx
-adjust_operands_numbers (rtx pattern)
-{
- mark_operands_used_in_match_dup (pattern);
-
- renumerate_operands_in_pattern (pattern);
-
- return pattern;
-}
/* Generate RTL expression
(match_dup OPNO)