Commit bd7960b1 by Richard Sandiford Committed by Richard Sandiford

rtl.h (shallow_copy_rtvec): Declare.

gcc/
	* rtl.h (shallow_copy_rtvec): Declare.
	* rtl.c (shallow_copy_rtvec): New function.
	* cselib.c (cselib_subst_to_values): Use it.  Only modify an
	rtx field if the subrtx has changed.

From-SVN: r153475
parent 2a31793e
2009-10-22 Richard Sandiford <rdsandiford@googlemail.com>
* rtl.h (shallow_copy_rtvec): Declare.
* rtl.c (shallow_copy_rtvec): New function.
* cselib.c (cselib_subst_to_values): Use it. Only modify an
rtx field if the subrtx has changed.
2009-10-22 Anatoly Sokolov <aesok@post.ru> 2009-10-22 Anatoly Sokolov <aesok@post.ru>
* config/m32c/m32c.c (m32c_function_value_regno_p): New function. * config/m32c/m32c.c (m32c_function_value_regno_p): New function.
...@@ -1422,30 +1422,31 @@ cselib_subst_to_values (rtx x) ...@@ -1422,30 +1422,31 @@ cselib_subst_to_values (rtx x)
{ {
rtx t = cselib_subst_to_values (XEXP (x, i)); rtx t = cselib_subst_to_values (XEXP (x, i));
if (t != XEXP (x, i) && x == copy) if (t != XEXP (x, i))
copy = shallow_copy_rtx (x); {
if (x == copy)
XEXP (copy, i) = t; copy = shallow_copy_rtx (x);
XEXP (copy, i) = t;
}
} }
else if (fmt[i] == 'E') else if (fmt[i] == 'E')
{ {
int j, k; int j;
for (j = 0; j < XVECLEN (x, i); j++) for (j = 0; j < XVECLEN (x, i); j++)
{ {
rtx t = cselib_subst_to_values (XVECEXP (x, i, j)); rtx t = cselib_subst_to_values (XVECEXP (x, i, j));
if (t != XVECEXP (x, i, j) && XVEC (x, i) == XVEC (copy, i)) if (t != XVECEXP (x, i, j))
{ {
if (x == copy) if (XVEC (x, i) == XVEC (copy, i))
copy = shallow_copy_rtx (x); {
if (x == copy)
XVEC (copy, i) = rtvec_alloc (XVECLEN (x, i)); copy = shallow_copy_rtx (x);
for (k = 0; k < j; k++) XVEC (copy, i) = shallow_copy_rtvec (XVEC (x, i));
XVECEXP (copy, i, k) = XVECEXP (x, i, k); }
XVECEXP (copy, i, j) = t;
} }
XVECEXP (copy, i, j) = t;
} }
} }
} }
......
...@@ -164,6 +164,20 @@ rtvec_alloc (int n) ...@@ -164,6 +164,20 @@ rtvec_alloc (int n)
return rt; return rt;
} }
/* Create a bitwise copy of VEC. */
rtvec
shallow_copy_rtvec (rtvec vec)
{
rtvec newvec;
int n;
n = GET_NUM_ELEM (vec);
newvec = rtvec_alloc (n);
memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n);
return newvec;
}
/* Return the number of bytes occupied by rtx value X. */ /* Return the number of bytes occupied by rtx value X. */
unsigned int unsigned int
......
...@@ -1568,6 +1568,7 @@ extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL); ...@@ -1568,6 +1568,7 @@ extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
#define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO) #define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)
extern rtvec rtvec_alloc (int); extern rtvec rtvec_alloc (int);
extern rtvec shallow_copy_rtvec (rtvec);
extern bool shared_const_p (const_rtx); extern bool shared_const_p (const_rtx);
extern rtx copy_rtx (rtx); extern rtx copy_rtx (rtx);
extern void dump_rtx_statistics (void); extern void dump_rtx_statistics (void);
......
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