diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-27 09:47:13 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-27 09:47:13 +0000 |
commit | 7cbee41801178b64f13a838281cd72aee317a0e8 (patch) | |
tree | d9c22fd584d78d444cfd08cad923263f90e6469a | |
parent | 5ea601080eb8550f7226d3d9df4fa523f6161e51 (diff) | |
download | ppe42-gcc-7cbee41801178b64f13a838281cd72aee317a0e8.tar.gz ppe42-gcc-7cbee41801178b64f13a838281cd72aee317a0e8.zip |
* varasm.c (decode_addr_const): Handle special case of INDIRECT_REF.
(const_hash_1) <VECTOR_CST>: New case.
(compare_constant) <VECTOR_CST>: Likewise.
<ADDR_EXPR>: Deal with LABEL_REFs.
(copy_constant) <VECTOR_CST>: New case.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158776 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/varasm.c | 69 |
2 files changed, 75 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65c8feab413..e254eec8497 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-04-27 Eric Botcazou <ebotcazou@adacore.com> + + * varasm.c (decode_addr_const): Handle special case of INDIRECT_REF. + (const_hash_1) <VECTOR_CST>: New case. + (compare_constant) <VECTOR_CST>: Likewise. + <ADDR_EXPR>: Deal with LABEL_REFs. + (copy_constant) <VECTOR_CST>: New case. + 2010-04-27 Jan Hubicka <jh@suse.cz> * cgraph.c (cgraph_propagate_frequency): New function. diff --git a/gcc/varasm.c b/gcc/varasm.c index fc0eb8abce4..35b65a932e3 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2802,6 +2802,11 @@ decode_addr_const (tree exp, struct addr_const *value) * tree_low_cst (TREE_OPERAND (target, 1), 0)); target = TREE_OPERAND (target, 0); } + else if (TREE_CODE (target) == INDIRECT_REF + && TREE_CODE (TREE_OPERAND (target, 0)) == NOP_EXPR + && TREE_CODE (TREE_OPERAND (TREE_OPERAND (target, 0), 0)) + == ADDR_EXPR) + target = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (target, 0), 0), 0); else break; } @@ -2894,6 +2899,18 @@ const_hash_1 (const tree exp) return (const_hash_1 (TREE_REALPART (exp)) * 5 + const_hash_1 (TREE_IMAGPART (exp))); + case VECTOR_CST: + { + tree link; + + hi = 7 + TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)); + + for (link = TREE_VECTOR_CST_ELTS (exp); link; link = TREE_CHAIN (link)) + hi = hi * 563 + const_hash_1 (TREE_VALUE (link)); + + return hi; + } + case CONSTRUCTOR: { unsigned HOST_WIDE_INT idx; @@ -3022,6 +3039,27 @@ compare_constant (const tree t1, const tree t2) return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2)) && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2))); + case VECTOR_CST: + { + tree link1, link2; + + if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (t1)) + != TYPE_VECTOR_SUBPARTS (TREE_TYPE (t2))) + return 0; + + link2 = TREE_VECTOR_CST_ELTS (t2); + for (link1 = TREE_VECTOR_CST_ELTS (t1); + link1; + link1 = TREE_CHAIN (link1)) + { + if (!compare_constant (TREE_VALUE (link1), TREE_VALUE (link2))) + return 0; + link2 = TREE_CHAIN (link2); + } + + return 1; + } + case CONSTRUCTOR: { VEC(constructor_elt, gc) *v1, *v2; @@ -3082,11 +3120,34 @@ compare_constant (const tree t1, const tree t2) case FDESC_EXPR: { struct addr_const value1, value2; + enum rtx_code code; + int ret; decode_addr_const (t1, &value1); decode_addr_const (t2, &value2); - return (value1.offset == value2.offset - && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0); + + if (value1.offset != value2.offset) + return 0; + + code = GET_CODE (value1.base); + if (code != GET_CODE (value2.base)) + return 0; + + switch (code) + { + case SYMBOL_REF: + ret = (strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0); + break; + + case LABEL_REF: + ret = (CODE_LABEL_NUMBER (XEXP (value1.base, 0)) + == CODE_LABEL_NUMBER (XEXP (value2.base, 0))); + break; + + default: + gcc_unreachable (); + } + return ret; } case PLUS_EXPR: @@ -3147,6 +3208,10 @@ copy_constant (tree exp) return build1 (TREE_CODE (exp), TREE_TYPE (exp), copy_constant (TREE_OPERAND (exp, 0))); + case VECTOR_CST: + return build_vector (TREE_TYPE (exp), + copy_list (TREE_VECTOR_CST_ELTS (exp))); + case CONSTRUCTOR: { tree copy = copy_node (exp); |