diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-08 12:29:13 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-08 12:29:13 +0000 |
commit | c15aa7755e4904ca20faa07e37bc1c638248fade (patch) | |
tree | 69e03447f4533182251aad1f02e8ca6e223f91e5 /gcc/emit-rtl.c | |
parent | 41677b508a035595c08e78fdbe129399a84fd0fb (diff) | |
download | gcc-c15aa7755e4904ca20faa07e37bc1c638248fade.tar.gz |
* rtl.c (copy_most_rtx): Move from here ...
* emit-rtl.c (copy_most_rtx): ... to here.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50435 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 47574278e9d..e3d557fe809 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2238,6 +2238,106 @@ reset_used_decls (blk) reset_used_decls (t); } +/* Similar to `copy_rtx' except that if MAY_SHARE is present, it is + placed in the result directly, rather than being copied. */ + +rtx +copy_most_rtx (orig, may_share) + rtx orig; + rtx may_share; +{ + rtx copy; + int i, j; + RTX_CODE code; + const char *format_ptr; + + if (orig == may_share) + return orig; + + code = GET_CODE (orig); + + switch (code) + { + case REG: + case QUEUED: + case CONST_INT: + case CONST_DOUBLE: + case CONST_VECTOR: + case SYMBOL_REF: + case CODE_LABEL: + case PC: + case CC0: + return orig; + default: + break; + } + + copy = rtx_alloc (code); + PUT_MODE (copy, GET_MODE (orig)); + copy->in_struct = orig->in_struct; + copy->volatil = orig->volatil; + copy->unchanging = orig->unchanging; + copy->integrated = orig->integrated; + copy->frame_related = orig->frame_related; + + 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 (orig, i) != may_share) + XEXP (copy, i) = copy_most_rtx (XEXP (orig, i), may_share); + break; + + case 'u': + XEXP (copy, i) = 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) + = copy_most_rtx (XVECEXP (orig, i, j), may_share); + } + break; + + case 'w': + XWINT (copy, i) = XWINT (orig, i); + break; + + case 'n': + case 'i': + XINT (copy, i) = XINT (orig, i); + break; + + case 't': + XTREE (copy, i) = XTREE (orig, i); + break; + + case 's': + case 'S': + XSTR (copy, i) = XSTR (orig, i); + break; + + case '0': + /* Copy this through the wide int field; that's safest. */ + X0WINT (copy, i) = X0WINT (orig, i); + break; + + default: + abort (); + } + } + return copy; +} + /* Mark ORIG as in use, and return a copy of it if it was already in use. Recursively does the same for subexpressions. */ |