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>
* doc/install.texi: Remove references to java/libjava.
......@@ -386,6 +386,7 @@ attr_rtx_1 (enum rtx_code code, va_list p)
unsigned int hashcode;
struct attr_hash *h;
struct obstack *old_obstack = rtl_obstack;
int permanent_p = 1;
/* 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
......@@ -395,13 +396,8 @@ attr_rtx_1 (enum rtx_code code, va_list p)
{
rtx arg0 = va_arg (p, rtx);
/* A permanent object cannot point to impermanent ones. */
if (! ATTR_PERMANENT_P (arg0))
{
rt_val = rtx_alloc (code);
XEXP (rt_val, 0) = arg0;
return rt_val;
}
permanent_p = 0;
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
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)
rtx arg0 = 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))
{
rt_val = rtx_alloc (code);
XEXP (rt_val, 0) = arg0;
XEXP (rt_val, 1) = arg1;
return rt_val;
}
permanent_p = 0;
hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
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)
&& GET_CODE (h->u.rtl) == code
&& XEXP (h->u.rtl, 0) == arg0
&& 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)
{
......@@ -481,6 +474,9 @@ attr_rtx_1 (enum rtx_code code, va_list p)
char *arg0 = 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));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode
......@@ -497,6 +493,29 @@ attr_rtx_1 (enum rtx_code code, va_list p)
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)
{
HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
......@@ -552,7 +571,7 @@ attr_rtx_1 (enum rtx_code code, va_list p)
rtl_obstack = old_obstack;
attr_hash_add_rtx (hashcode, rt_val);
ATTR_PERMANENT_P (rt_val) = 1;
ATTR_PERMANENT_P (rt_val) = permanent_p;
return rt_val;
}
......@@ -592,7 +611,7 @@ attr_printf (unsigned int len, const char *fmt, ...)
static rtx
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 *
......@@ -646,89 +665,6 @@ attr_equal_p (rtx x, rtx 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
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)
XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
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;
}
if (allsame)
......@@ -1257,6 +1193,8 @@ copy_boolean (rtx exp)
if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
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)
{
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,
}
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
|| insn_alternatives[av->first_insn->def->insn_code]))
return av;
......@@ -2339,9 +2277,7 @@ simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
rtl_obstack = temp_obstack;
x = simplify_test_exp (exp, insn_code, insn_index);
rtl_obstack = old;
if (x == exp || rtl_obstack == temp_obstack)
return x;
return attr_copy_rtx (x);
return x;
}
/* Returns true if S1 is a subset of S2. */
......@@ -2397,28 +2333,27 @@ attr_alt_subset_of_compl_p (rtx s1, rtx s2)
static rtx
attr_alt_intersection (rtx s1, rtx s2)
{
rtx result = rtx_alloc (EQ_ATTR_ALT);
int result;
switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
{
case (0 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
result = XINT (s1, 0) & XINT (s2, 0);
break;
case (0 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
result = XINT (s1, 0) & ~XINT (s2, 0);
break;
case (1 << 1) | 0:
XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
result = XINT (s2, 0) & ~XINT (s1, 0);
break;
case (1 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
result = XINT (s1, 0) | XINT (s2, 0);
break;
default:
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. */
......@@ -2426,28 +2361,27 @@ attr_alt_intersection (rtx s1, rtx s2)
static rtx
attr_alt_union (rtx s1, rtx s2)
{
rtx result = rtx_alloc (EQ_ATTR_ALT);
int result;
switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
{
case (0 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
result = XINT (s1, 0) | XINT (s2, 0);
break;
case (0 << 1) | 1:
XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
result = XINT (s2, 0) & ~XINT (s1, 0);
break;
case (1 << 1) | 0:
XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
result = XINT (s1, 0) & ~XINT (s2, 0);
break;
case (1 << 1) | 1:
XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
result = XINT (s1, 0) & XINT (s2, 0);
break;
default:
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 complement of S. */
......@@ -2455,12 +2389,7 @@ attr_alt_union (rtx s1, rtx s2)
static rtx
attr_alt_complement (rtx s)
{
rtx result = rtx_alloc (EQ_ATTR_ALT);
XINT (result, 0) = XINT (s, 0);
XINT (result, 1) = 1 - XINT (s, 1);
return result;
return attr_rtx (EQ_ATTR_ALT, XINT (s, 0), 1 - XINT (s, 1));
}
/* Return EQ_ATTR_ALT expression representing set containing elements set
......@@ -2469,12 +2398,7 @@ attr_alt_complement (rtx s)
static rtx
mk_attr_alt (uint64_t e)
{
rtx result = rtx_alloc (EQ_ATTR_ALT);
XINT (result, 0) = e;
XINT (result, 1) = 0;
return result;
return attr_rtx (EQ_ATTR_ALT, (int)e, 0);
}
/* Given an expression, see if it can be simplified for a particular insn
......@@ -3045,7 +2969,6 @@ optimize_attrs (int num_insn_codes)
&& attr_rtx_cost (newexp) < 26
)
{
newexp = attr_copy_rtx (newexp);
remove_insn_ent (av, ie);
av = get_attr_value (ie->def->loc, newexp, attr,
ie->def->insn_code);
......@@ -5004,7 +4927,7 @@ make_automaton_attrs (void)
{
int j;
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)
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