Commit a8dd1337 by Bernd Edlinger Committed by Bernd Edlinger

genattrtab.c (attr_rtx_1): Avoid allocating new rtx objects.

2016-11-15  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * genattrtab.c (attr_rtx_1): Avoid allocating new rtx objects.
        Clear ATTR_CURR_SIMPLIFIED_P for re-used binary rtx objects.
        Use DEF_ATTR_STRING for string arguments.  Use RTL_HASH for
        integer arguments.  Only set ATTR_PERMANENT_P on newly hashed
        rtx when all sub-rtx are also permanent.
        (attr_eq): Simplify.
        (attr_copy_rtx): Remove.
        (make_canonical, get_attr_value): Use attr_equal_p.
        (copy_boolean): Rehash NOT.
        (simplify_test_exp_in_temp,
        optimize_attrs): Remove call to attr_copy_rtx.
        (attr_alt_intersection, attr_alt_union,
        attr_alt_complement, mk_attr_alt): Rehash EQ_ATTR_ALT.
        (make_automaton_attrs): Use attr_eq.

From-SVN: r242460
parent 839984f4
2016-11-15 Bernd Edlinger <bernd.edlinger@hotmail.de>
* genattrtab.c (attr_rtx_1): Avoid allocating new rtx objects.
Clear ATTR_CURR_SIMPLIFIED_P for re-used binary rtx objects.
Use DEF_ATTR_STRING for string arguments. Use RTL_HASH for
integer arguments. Only set ATTR_PERMANENT_P on newly hashed
rtx when all sub-rtx are also permanent.
(attr_eq): Simplify.
(attr_copy_rtx): Remove.
(make_canonical, get_attr_value): Use attr_equal_p.
(copy_boolean): Rehash NOT.
(simplify_test_exp_in_temp,
optimize_attrs): Remove call to attr_copy_rtx.
(attr_alt_intersection, attr_alt_union,
attr_alt_complement, mk_attr_alt): Rehash EQ_ATTR_ALT.
(make_automaton_attrs): Use attr_eq.
2016-11-15 Matthias Klose <doko@ubuntu.com> 2016-11-15 Matthias Klose <doko@ubuntu.com>
* doc/install.texi: Remove references to java/libjava. * doc/install.texi: Remove references to java/libjava.
...@@ -386,6 +386,7 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -386,6 +386,7 @@ attr_rtx_1 (enum rtx_code code, va_list p)
unsigned int hashcode; unsigned int hashcode;
struct attr_hash *h; struct attr_hash *h;
struct obstack *old_obstack = rtl_obstack; struct obstack *old_obstack = rtl_obstack;
int permanent_p = 1;
/* For each of several cases, search the hash table for an existing entry. /* For each of several cases, search the hash table for an existing entry.
Use that entry if one is found; otherwise create a new RTL and add it Use that entry if one is found; otherwise create a new RTL and add it
...@@ -395,13 +396,8 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -395,13 +396,8 @@ attr_rtx_1 (enum rtx_code code, va_list p)
{ {
rtx arg0 = va_arg (p, rtx); rtx arg0 = va_arg (p, rtx);
/* A permanent object cannot point to impermanent ones. */
if (! ATTR_PERMANENT_P (arg0)) if (! ATTR_PERMANENT_P (arg0))
{ permanent_p = 0;
rt_val = rtx_alloc (code);
XEXP (rt_val, 0) = arg0;
return rt_val;
}
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0)); hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
...@@ -425,14 +421,8 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -425,14 +421,8 @@ attr_rtx_1 (enum rtx_code code, va_list p)
rtx arg0 = va_arg (p, rtx); rtx arg0 = va_arg (p, rtx);
rtx arg1 = va_arg (p, rtx); rtx arg1 = va_arg (p, rtx);
/* A permanent object cannot point to impermanent ones. */
if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1)) if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1))
{ permanent_p = 0;
rt_val = rtx_alloc (code);
XEXP (rt_val, 0) = arg0;
XEXP (rt_val, 1) = arg1;
return rt_val;
}
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1)); hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
...@@ -440,7 +430,10 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -440,7 +430,10 @@ attr_rtx_1 (enum rtx_code code, va_list p)
&& GET_CODE (h->u.rtl) == code && GET_CODE (h->u.rtl) == code
&& XEXP (h->u.rtl, 0) == arg0 && XEXP (h->u.rtl, 0) == arg0
&& XEXP (h->u.rtl, 1) == arg1) && XEXP (h->u.rtl, 1) == arg1)
return h->u.rtl; {
ATTR_CURR_SIMPLIFIED_P (h->u.rtl) = 0;
return h->u.rtl;
}
if (h == 0) if (h == 0)
{ {
...@@ -481,6 +474,9 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -481,6 +474,9 @@ attr_rtx_1 (enum rtx_code code, va_list p)
char *arg0 = va_arg (p, char *); char *arg0 = va_arg (p, char *);
char *arg1 = va_arg (p, char *); char *arg1 = va_arg (p, char *);
arg0 = DEF_ATTR_STRING (arg0);
arg1 = DEF_ATTR_STRING (arg1);
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1)); hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode if (h->hashcode == hashcode
...@@ -497,6 +493,29 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -497,6 +493,29 @@ attr_rtx_1 (enum rtx_code code, va_list p)
XSTR (rt_val, 1) = arg1; XSTR (rt_val, 1) = arg1;
} }
} }
else if (GET_RTX_LENGTH (code) == 2
&& GET_RTX_FORMAT (code)[0] == 'i'
&& GET_RTX_FORMAT (code)[1] == 'i')
{
int arg0 = va_arg (p, int);
int arg1 = va_arg (p, int);
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode
&& GET_CODE (h->u.rtl) == code
&& XINT (h->u.rtl, 0) == arg0
&& XINT (h->u.rtl, 1) == arg1)
return h->u.rtl;
if (h == 0)
{
rtl_obstack = hash_obstack;
rt_val = rtx_alloc (code);
XINT (rt_val, 0) = arg0;
XINT (rt_val, 1) = arg1;
}
}
else if (code == CONST_INT) else if (code == CONST_INT)
{ {
HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT); HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
...@@ -552,7 +571,7 @@ attr_rtx_1 (enum rtx_code code, va_list p) ...@@ -552,7 +571,7 @@ attr_rtx_1 (enum rtx_code code, va_list p)
rtl_obstack = old_obstack; rtl_obstack = old_obstack;
attr_hash_add_rtx (hashcode, rt_val); attr_hash_add_rtx (hashcode, rt_val);
ATTR_PERMANENT_P (rt_val) = 1; ATTR_PERMANENT_P (rt_val) = permanent_p;
return rt_val; return rt_val;
} }
...@@ -592,7 +611,7 @@ attr_printf (unsigned int len, const char *fmt, ...) ...@@ -592,7 +611,7 @@ attr_printf (unsigned int len, const char *fmt, ...)
static rtx static rtx
attr_eq (const char *name, const char *value) attr_eq (const char *name, const char *value)
{ {
return attr_rtx (EQ_ATTR, DEF_ATTR_STRING (name), DEF_ATTR_STRING (value)); return attr_rtx (EQ_ATTR, name, value);
} }
static const char * static const char *
...@@ -646,89 +665,6 @@ attr_equal_p (rtx x, rtx y) ...@@ -646,89 +665,6 @@ attr_equal_p (rtx x, rtx y)
&& rtx_equal_p (x, y))); && rtx_equal_p (x, y)));
} }
/* Copy an attribute value expression,
descending to all depths, but not copying any
permanent hashed subexpressions. */
static rtx
attr_copy_rtx (rtx orig)
{
rtx copy;
int i, j;
RTX_CODE code;
const char *format_ptr;
/* No need to copy a permanent object. */
if (ATTR_PERMANENT_P (orig))
return orig;
code = GET_CODE (orig);
switch (code)
{
case REG:
CASE_CONST_ANY:
case SYMBOL_REF:
case MATCH_TEST:
case CODE_LABEL:
case PC:
case CC0:
return orig;
default:
break;
}
copy = rtx_alloc (code);
PUT_MODE (copy, GET_MODE (orig));
ATTR_IND_SIMPLIFIED_P (copy) = ATTR_IND_SIMPLIFIED_P (orig);
ATTR_CURR_SIMPLIFIED_P (copy) = ATTR_CURR_SIMPLIFIED_P (orig);
ATTR_PERMANENT_P (copy) = ATTR_PERMANENT_P (orig);
format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
{
switch (*format_ptr++)
{
case 'e':
XEXP (copy, i) = XEXP (orig, i);
if (XEXP (orig, i) != NULL)
XEXP (copy, i) = attr_copy_rtx (XEXP (orig, i));
break;
case 'E':
case 'V':
XVEC (copy, i) = XVEC (orig, i);
if (XVEC (orig, i) != NULL)
{
XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
for (j = 0; j < XVECLEN (copy, i); j++)
XVECEXP (copy, i, j) = attr_copy_rtx (XVECEXP (orig, i, j));
}
break;
case 'n':
case 'i':
XINT (copy, i) = XINT (orig, i);
break;
case 'w':
XWINT (copy, i) = XWINT (orig, i);
break;
case 's':
case 'S':
XSTR (copy, i) = XSTR (orig, i);
break;
default:
gcc_unreachable ();
}
}
return copy;
}
/* Given a test expression EXP for attribute ATTR, ensure it is validly /* Given a test expression EXP for attribute ATTR, ensure it is validly
formed. LOC is the location of the .md construct that contains EXP. formed. LOC is the location of the .md construct that contains EXP.
...@@ -1236,7 +1172,7 @@ make_canonical (file_location loc, struct attr_desc *attr, rtx exp) ...@@ -1236,7 +1172,7 @@ make_canonical (file_location loc, struct attr_desc *attr, rtx exp)
XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i)); XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
XVECEXP (exp, 0, i + 1) XVECEXP (exp, 0, i + 1)
= make_canonical (loc, attr, XVECEXP (exp, 0, i + 1)); = make_canonical (loc, attr, XVECEXP (exp, 0, i + 1));
if (! rtx_equal_p (XVECEXP (exp, 0, i + 1), defval)) if (! attr_equal_p (XVECEXP (exp, 0, i + 1), defval))
allsame = 0; allsame = 0;
} }
if (allsame) if (allsame)
...@@ -1257,6 +1193,8 @@ copy_boolean (rtx exp) ...@@ -1257,6 +1193,8 @@ copy_boolean (rtx exp)
if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR) if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)), return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
copy_boolean (XEXP (exp, 1))); copy_boolean (XEXP (exp, 1)));
else if (GET_CODE (exp) == NOT)
return attr_rtx (NOT, copy_boolean (XEXP (exp, 0)));
if (GET_CODE (exp) == MATCH_OPERAND) if (GET_CODE (exp) == MATCH_OPERAND)
{ {
XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1)); XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
...@@ -1298,7 +1236,7 @@ get_attr_value (file_location loc, rtx value, struct attr_desc *attr, ...@@ -1298,7 +1236,7 @@ get_attr_value (file_location loc, rtx value, struct attr_desc *attr,
} }
for (av = attr->first_value; av; av = av->next) for (av = attr->first_value; av; av = av->next)
if (rtx_equal_p (value, av->value) if (attr_equal_p (value, av->value)
&& (num_alt == 0 || av->first_insn == NULL && (num_alt == 0 || av->first_insn == NULL
|| insn_alternatives[av->first_insn->def->insn_code])) || insn_alternatives[av->first_insn->def->insn_code]))
return av; return av;
...@@ -2339,9 +2277,7 @@ simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index) ...@@ -2339,9 +2277,7 @@ simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
rtl_obstack = temp_obstack; rtl_obstack = temp_obstack;
x = simplify_test_exp (exp, insn_code, insn_index); x = simplify_test_exp (exp, insn_code, insn_index);
rtl_obstack = old; rtl_obstack = old;
if (x == exp || rtl_obstack == temp_obstack) return x;
return x;
return attr_copy_rtx (x);
} }
/* Returns true if S1 is a subset of S2. */ /* Returns true if S1 is a subset of S2. */
...@@ -2397,28 +2333,27 @@ attr_alt_subset_of_compl_p (rtx s1, rtx s2) ...@@ -2397,28 +2333,27 @@ attr_alt_subset_of_compl_p (rtx s1, rtx s2)
static rtx static rtx
attr_alt_intersection (rtx s1, rtx s2) attr_alt_intersection (rtx s1, rtx s2)
{ {
rtx result = rtx_alloc (EQ_ATTR_ALT); int result;
switch ((XINT (s1, 1) << 1) | XINT (s2, 1)) switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
{ {
case (0 << 1) | 0: case (0 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0); result = XINT (s1, 0) & XINT (s2, 0);
break; break;
case (0 << 1) | 1: case (0 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0); result = XINT (s1, 0) & ~XINT (s2, 0);
break; break;
case (1 << 1) | 0: case (1 << 1) | 0:
XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0); result = XINT (s2, 0) & ~XINT (s1, 0);
break; break;
case (1 << 1) | 1: case (1 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0); result = XINT (s1, 0) | XINT (s2, 0);
break; break;
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
XINT (result, 1) = XINT (s1, 1) & XINT (s2, 1);
return result; return attr_rtx (EQ_ATTR_ALT, result, XINT (s1, 1) & XINT (s2, 1));
} }
/* Return EQ_ATTR_ALT expression representing union of S1 and S2. */ /* Return EQ_ATTR_ALT expression representing union of S1 and S2. */
...@@ -2426,28 +2361,27 @@ attr_alt_intersection (rtx s1, rtx s2) ...@@ -2426,28 +2361,27 @@ attr_alt_intersection (rtx s1, rtx s2)
static rtx static rtx
attr_alt_union (rtx s1, rtx s2) attr_alt_union (rtx s1, rtx s2)
{ {
rtx result = rtx_alloc (EQ_ATTR_ALT); int result;
switch ((XINT (s1, 1) << 1) | XINT (s2, 1)) switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
{ {
case (0 << 1) | 0: case (0 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0); result = XINT (s1, 0) | XINT (s2, 0);
break; break;
case (0 << 1) | 1: case (0 << 1) | 1:
XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0); result = XINT (s2, 0) & ~XINT (s1, 0);
break; break;
case (1 << 1) | 0: case (1 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0); result = XINT (s1, 0) & ~XINT (s2, 0);
break; break;
case (1 << 1) | 1: case (1 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0); result = XINT (s1, 0) & XINT (s2, 0);
break; break;
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
XINT (result, 1) = XINT (s1, 1) | XINT (s2, 1); return attr_rtx (EQ_ATTR_ALT, result, XINT (s1, 1) | XINT (s2, 1));
return result;
} }
/* Return EQ_ATTR_ALT expression representing complement of S. */ /* Return EQ_ATTR_ALT expression representing complement of S. */
...@@ -2455,12 +2389,7 @@ attr_alt_union (rtx s1, rtx s2) ...@@ -2455,12 +2389,7 @@ attr_alt_union (rtx s1, rtx s2)
static rtx static rtx
attr_alt_complement (rtx s) attr_alt_complement (rtx s)
{ {
rtx result = rtx_alloc (EQ_ATTR_ALT); return attr_rtx (EQ_ATTR_ALT, XINT (s, 0), 1 - XINT (s, 1));
XINT (result, 0) = XINT (s, 0);
XINT (result, 1) = 1 - XINT (s, 1);
return result;
} }
/* Return EQ_ATTR_ALT expression representing set containing elements set /* Return EQ_ATTR_ALT expression representing set containing elements set
...@@ -2469,12 +2398,7 @@ attr_alt_complement (rtx s) ...@@ -2469,12 +2398,7 @@ attr_alt_complement (rtx s)
static rtx static rtx
mk_attr_alt (uint64_t e) mk_attr_alt (uint64_t e)
{ {
rtx result = rtx_alloc (EQ_ATTR_ALT); return attr_rtx (EQ_ATTR_ALT, (int)e, 0);
XINT (result, 0) = e;
XINT (result, 1) = 0;
return result;
} }
/* Given an expression, see if it can be simplified for a particular insn /* Given an expression, see if it can be simplified for a particular insn
...@@ -3045,7 +2969,6 @@ optimize_attrs (int num_insn_codes) ...@@ -3045,7 +2969,6 @@ optimize_attrs (int num_insn_codes)
&& attr_rtx_cost (newexp) < 26 && attr_rtx_cost (newexp) < 26
) )
{ {
newexp = attr_copy_rtx (newexp);
remove_insn_ent (av, ie); remove_insn_ent (av, ie);
av = get_attr_value (ie->def->loc, newexp, attr, av = get_attr_value (ie->def->loc, newexp, attr,
ie->def->insn_code); ie->def->insn_code);
...@@ -5004,7 +4927,7 @@ make_automaton_attrs (void) ...@@ -5004,7 +4927,7 @@ make_automaton_attrs (void)
{ {
int j; int j;
char *name; char *name;
rtx test = attr_rtx (EQ_ATTR, tune_attr->name, XSTR (val->value, 0)); rtx test = attr_eq (tune_attr->name, XSTR (val->value, 0));
if (val == tune_attr->default_val) if (val == tune_attr->default_val)
continue; continue;
......
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