summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/arm/arm.c5
-rw-r--r--gcc/config/s390/predicates.md3
-rw-r--r--gcc/lra.c5
-rw-r--r--gcc/postreload.c6
-rw-r--r--gcc/recog.c11
-rw-r--r--gcc/recog.h1
-rw-r--r--gcc/reg-stack.c6
-rw-r--r--gcc/regcprop.c12
-rw-r--r--gcc/regrename.c4
-rw-r--r--gcc/sel-sched.c4
11 files changed, 39 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f944f765491..5de3d9f58b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2014-10-22 Richard Sandiford <richard.sandiford@arm.com>
+
+ * recog.h (extract_constrain_insn): Declare.
+ * recog.c (extract_constrain_insn): New function.
+ * lra.c (check_rtl): Use it.
+ * postreload.c (reload_cse_simplify_operands): Likewise.
+ * reg-stack.c (check_asm_stack_operands): Likewise.
+ (subst_asm_stack_regs): Likewise.
+ * regcprop.c (copyprop_hardreg_forward_1): Likewise.
+ * regrename.c (build_def_use): Likewise.
+ * sel-sched.c (get_reg_class): Likewise.
+ * config/arm/arm.c (note_invalid_constants): Likewise.
+ * config/s390/predicates.md (execute_operation): Likewise.
+
2014-10-22 Jakub Jelinek <jakub@redhat.com>
Yury Gribov <y.gribov@samsung.com>
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 1ee0eb355c3..40473d00660 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -17027,10 +17027,7 @@ note_invalid_constants (rtx_insn *insn, HOST_WIDE_INT address, int do_pushes)
{
int opno;
- extract_insn (insn);
-
- if (!constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
if (recog_data.n_alternatives == 0)
return;
diff --git a/gcc/config/s390/predicates.md b/gcc/config/s390/predicates.md
index 883d5cc2d62..237cfa77533 100644
--- a/gcc/config/s390/predicates.md
+++ b/gcc/config/s390/predicates.md
@@ -406,8 +406,7 @@
if (icode < 0)
return false;
- extract_insn (insn);
- constrain_operands (1);
+ extract_constrain_insn (insn);
return which_alternative >= 0;
})
diff --git a/gcc/lra.c b/gcc/lra.c
index 6fb35a13fac..6326131d8c3 100644
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -1923,8 +1923,9 @@ check_rtl (bool final_p)
{
if (final_p)
{
- extract_insn (insn);
- lra_assert (constrain_operands (1));
+#ifdef ENABLED_CHECKING
+ extract_constrain_insn (insn);
+#endif
continue;
}
/* LRA code is based on assumption that all addresses can be
diff --git a/gcc/postreload.c b/gcc/postreload.c
index c9bb4ae3a35..f460bf3a3a4 100644
--- a/gcc/postreload.c
+++ b/gcc/postreload.c
@@ -405,15 +405,11 @@ reload_cse_simplify_operands (rtx_insn *insn, rtx testreg)
/* Array of alternatives, sorted in order of decreasing desirability. */
int *alternative_order;
- extract_insn (insn);
+ extract_constrain_insn (insn);
if (recog_data.n_alternatives == 0 || recog_data.n_operands == 0)
return 0;
- /* Figure out which alternative currently matches. */
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
-
alternative_reject = XALLOCAVEC (int, recog_data.n_alternatives);
alternative_nregs = XALLOCAVEC (int, recog_data.n_alternatives);
alternative_order = XALLOCAVEC (int, recog_data.n_alternatives);
diff --git a/gcc/recog.c b/gcc/recog.c
index 35cd22c56f7..199c7debbf8 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -2115,6 +2115,17 @@ extract_insn_cached (rtx_insn *insn)
recog_data.insn = insn;
}
+/* Do uncached extract_insn, constrain_operands and complain about failures.
+ This should be used when extracting a pre-existing constrained instruction
+ if the caller wants to know which alternative was chosen. */
+void
+extract_constrain_insn (rtx_insn *insn)
+{
+ extract_insn (insn);
+ if (!constrain_operands (reload_completed))
+ fatal_insn_not_found (insn);
+}
+
/* Do cached extract_insn, constrain_operands and complain about failures.
Used by insn_attrtab. */
void
diff --git a/gcc/recog.h b/gcc/recog.h
index df974a91579..d3619cbbe5a 100644
--- a/gcc/recog.h
+++ b/gcc/recog.h
@@ -134,6 +134,7 @@ extern void add_clobbers (rtx, int);
extern int added_clobbers_hard_reg_p (int);
extern void insn_extract (rtx_insn *);
extern void extract_insn (rtx_insn *);
+extern void extract_constrain_insn (rtx_insn *insn);
extern void extract_constrain_insn_cached (rtx_insn *);
extern void extract_insn_cached (rtx_insn *);
extern void preprocess_constraints (int, int, const char **,
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index 644ab71e867..88327ece0a1 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -474,8 +474,7 @@ check_asm_stack_operands (rtx_insn *insn)
/* Find out what the constraints require. If no constraint
alternative matches, this asm is malformed. */
- extract_insn (insn);
- constrain_operands (1);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
@@ -2021,8 +2020,7 @@ subst_asm_stack_regs (rtx_insn *insn, stack_ptr regstack)
/* Find out what the constraints required. If no constraint
alternative matches, that is a compiler bug: we should have caught
such an insn in check_asm_stack_operands. */
- extract_insn (insn);
- constrain_operands (1);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
const operand_alternative *op_alt = which_op_alt ();
diff --git a/gcc/regcprop.c b/gcc/regcprop.c
index 262de1be046..e935a357204 100644
--- a/gcc/regcprop.c
+++ b/gcc/regcprop.c
@@ -767,9 +767,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
}
set = single_set (insn);
- extract_insn (insn);
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
const operand_alternative *op_alt = which_op_alt ();
n_ops = recog_data.n_operands;
@@ -870,9 +868,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
}
/* We need to re-extract as validate_change clobbers
recog_data. */
- extract_insn (insn);
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
}
@@ -898,9 +894,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
}
/* We need to re-extract as validate_change clobbers
recog_data. */
- extract_insn (insn);
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
}
}
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 7b9ca45fd1b..26bc8606b27 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1569,9 +1569,7 @@ build_def_use (basic_block bb)
to be marked unrenamable or even cause us to abort the entire
basic block. */
- extract_insn (insn);
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
const operand_alternative *op_alt = which_op_alt ();
n_ops = recog_data.n_operands;
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 9b2be733279..377e1e9b5f6 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -998,9 +998,7 @@ get_reg_class (rtx_insn *insn)
{
int i, n_ops;
- extract_insn (insn);
- if (! constrain_operands (1))
- fatal_insn_not_found (insn);
+ extract_constrain_insn (insn);
preprocess_constraints (insn);
n_ops = recog_data.n_operands;