Commit d9aa82f1 by Richard Sandiford Committed by Richard Sandiford

aarch-common.c: Include rtl-iter.h.

gcc/
	* config/arm/aarch-common.c: Include rtl-iter.h.
	(search_term, arm_find_sub_rtx_with_search_term): Delete.
	(arm_find_sub_rtx_with_code): Use FOR_EACH_SUBRTX_VAR.
	(arm_get_set_operands): Pass the insn pattern rather than the
	insn itself.
	(arm_no_early_store_addr_dep): Likewise.

From-SVN: r217253
parent d1b0433b
2014-11-08 Richard Sandiford <richard.sandiford@arm.com>
* config/arm/aarch-common.c: Include rtl-iter.h.
(search_term, arm_find_sub_rtx_with_search_term): Delete.
(arm_find_sub_rtx_with_code): Use FOR_EACH_SUBRTX_VAR.
(arm_get_set_operands): Pass the insn pattern rather than the
insn itself.
(arm_no_early_store_addr_dep): Likewise.
2014-11-08 Eric Botcazou <ebotcazou@adacore.com> 2014-11-08 Eric Botcazou <ebotcazou@adacore.com>
* config/arm/arm.c (arm_set_return_address): Mark the store as frame * config/arm/arm.c (arm_set_return_address): Mark the store as frame
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "tree.h" #include "tree.h"
#include "c-family/c-common.h" #include "c-family/c-common.h"
#include "rtl.h" #include "rtl.h"
#include "rtl-iter.h"
/* In ARMv8-A there's a general expectation that AESE/AESMC /* In ARMv8-A there's a general expectation that AESE/AESMC
and AESD/AESIMC sequences of the form: and AESD/AESIMC sequences of the form:
...@@ -68,13 +69,6 @@ aarch_crypto_can_dual_issue (rtx_insn *producer_insn, rtx_insn *consumer_insn) ...@@ -68,13 +69,6 @@ aarch_crypto_can_dual_issue (rtx_insn *producer_insn, rtx_insn *consumer_insn)
return 0; return 0;
} }
typedef struct
{
rtx_code search_code;
rtx search_result;
bool find_any_shift;
} search_term;
/* Return TRUE if X is either an arithmetic shift left, or /* Return TRUE if X is either an arithmetic shift left, or
is a multiplication by a power of two. */ is a multiplication by a power of two. */
bool bool
...@@ -96,68 +90,32 @@ static rtx_code shift_rtx_codes[] = ...@@ -96,68 +90,32 @@ static rtx_code shift_rtx_codes[] =
{ ASHIFT, ROTATE, ASHIFTRT, LSHIFTRT, { ASHIFT, ROTATE, ASHIFTRT, LSHIFTRT,
ROTATERT, ZERO_EXTEND, SIGN_EXTEND }; ROTATERT, ZERO_EXTEND, SIGN_EXTEND };
/* Callback function for arm_find_sub_rtx_with_code. /* Traverse PATTERN looking for a sub-rtx with RTX_CODE CODE.
DATA is safe to treat as a SEARCH_TERM, ST. This will If FIND_ANY_SHIFT then we are interested in anything which can
hold a SEARCH_CODE. PATTERN is checked to see if it is an reasonably be described as a SHIFT RTX. */
RTX with that code. If it is, write SEARCH_RESULT in ST
and return 1. Otherwise, or if we have been passed a NULL_RTX
return 0. If ST.FIND_ANY_SHIFT then we are interested in
anything which can reasonably be described as a SHIFT RTX. */
static int
arm_find_sub_rtx_with_search_term (rtx *pattern, void *data)
{
search_term *st = (search_term *) data;
rtx_code pattern_code;
int found = 0;
gcc_assert (pattern);
gcc_assert (st);
/* Poorly formed patterns can really ruin our day. */
if (*pattern == NULL_RTX)
return 0;
pattern_code = GET_CODE (*pattern);
if (st->find_any_shift)
{
unsigned i = 0;
/* Left shifts might have been canonicalized to a MULT of some
power of two. Make sure we catch them. */
if (arm_rtx_shift_left_p (*pattern))
found = 1;
else
for (i = 0; i < ARRAY_SIZE (shift_rtx_codes); i++)
if (pattern_code == shift_rtx_codes[i])
found = 1;
}
if (pattern_code == st->search_code)
found = 1;
if (found)
st->search_result = *pattern;
return found;
}
/* Traverse PATTERN looking for a sub-rtx with RTX_CODE CODE. */
static rtx static rtx
arm_find_sub_rtx_with_code (rtx pattern, rtx_code code, bool find_any_shift) arm_find_sub_rtx_with_code (rtx pattern, rtx_code code, bool find_any_shift)
{ {
search_term st; subrtx_var_iterator::array_type array;
int result = 0; FOR_EACH_SUBRTX_VAR (iter, array, pattern, NONCONST)
{
gcc_assert (pattern != NULL_RTX); rtx x = *iter;
st.search_code = code; if (find_any_shift)
st.search_result = NULL_RTX; {
st.find_any_shift = find_any_shift; /* Left shifts might have been canonicalized to a MULT of some
result = for_each_rtx (&pattern, arm_find_sub_rtx_with_search_term, &st); power of two. Make sure we catch them. */
if (result) if (arm_rtx_shift_left_p (x))
return st.search_result; return x;
else else
return NULL_RTX; for (unsigned int i = 0; i < ARRAY_SIZE (shift_rtx_codes); i++)
if (GET_CODE (x) == shift_rtx_codes[i])
return x;
}
if (GET_CODE (x) == code)
return x;
}
return NULL_RTX;
} }
/* Traverse PATTERN looking for any sub-rtx which looks like a shift. */ /* Traverse PATTERN looking for any sub-rtx which looks like a shift. */
...@@ -180,8 +138,10 @@ static int ...@@ -180,8 +138,10 @@ static int
arm_get_set_operands (rtx producer, rtx consumer, arm_get_set_operands (rtx producer, rtx consumer,
rtx *set_source, rtx *set_destination) rtx *set_source, rtx *set_destination)
{ {
rtx set_producer = arm_find_sub_rtx_with_code (producer, SET, false); rtx set_producer = arm_find_sub_rtx_with_code (PATTERN (producer),
rtx set_consumer = arm_find_sub_rtx_with_code (consumer, SET, false); SET, false);
rtx set_consumer = arm_find_sub_rtx_with_code (PATTERN (consumer),
SET, false);
if (set_producer && set_consumer) if (set_producer && set_consumer)
{ {
...@@ -353,8 +313,8 @@ arm_no_early_mul_dep (rtx producer, rtx consumer) ...@@ -353,8 +313,8 @@ arm_no_early_mul_dep (rtx producer, rtx consumer)
int int
arm_no_early_store_addr_dep (rtx producer, rtx consumer) arm_no_early_store_addr_dep (rtx producer, rtx consumer)
{ {
rtx value = arm_find_sub_rtx_with_code (producer, SET, false); rtx value = arm_find_sub_rtx_with_code (PATTERN (producer), SET, false);
rtx addr = arm_find_sub_rtx_with_code (consumer, SET, false); rtx addr = arm_find_sub_rtx_with_code (PATTERN (consumer), SET, false);
if (value) if (value)
value = SET_DEST (value); value = SET_DEST (value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment