diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-10 08:46:07 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-10 08:46:07 +0000 |
commit | 499d260609c095f24afbd8960c2e076b9d417796 (patch) | |
tree | fb71cd4c9d25b4c0689180b831233d246d68e6cb | |
parent | 1b06efcbed2c253af915d612f1e2af28edb88a2e (diff) | |
download | gcc-499d260609c095f24afbd8960c2e076b9d417796.tar.gz |
Mostly revert r254296
r254296 added support for (const ...) wrappers around vectors,
but in the end the agreement was to use a variable-length
encoding of CONST_VECTOR (and VECTOR_CST) instead. This patch
therefore reverts the bits that are no longer needed.
The rtl.texi part isn't a full revert, since r254296 also updated the
documentation to mention unspecs in address calculations, and to relax
the requirement that the mode had to be Pmode.
2018-01-10 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
* doc/rtl.texi: Remove documentation of (const ...) wrappers
for vectors, as a partial revert of r254296.
* rtl.h (const_vec_p): Delete.
(const_vec_duplicate_p): Don't test for vector CONSTs.
(unwrap_const_vec_duplicate, const_vec_series_p): Likewise.
* expmed.c (make_tree): Likewise.
Revert:
* common.md (E, F): Use CONSTANT_P instead of checking for
CONST_VECTOR.
* emit-rtl.c (gen_lowpart_common): Use const_vec_p instead of
checking for CONST_VECTOR.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256421 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/common.md | 4 | ||||
-rw-r--r-- | gcc/doc/rtl.texi | 18 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 2 | ||||
-rw-r--r-- | gcc/expmed.c | 17 | ||||
-rw-r--r-- | gcc/rtl.h | 41 |
6 files changed, 31 insertions, 66 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98ea00bd5be..03c5f868d03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-01-10 Richard Sandiford <richard.sandiford@linaro.org> + + * doc/rtl.texi: Remove documentation of (const ...) wrappers + for vectors, as a partial revert of r254296. + * rtl.h (const_vec_p): Delete. + (const_vec_duplicate_p): Don't test for vector CONSTs. + (unwrap_const_vec_duplicate, const_vec_series_p): Likewise. + * expmed.c (make_tree): Likewise. + + Revert: + * common.md (E, F): Use CONSTANT_P instead of checking for + CONST_VECTOR. + * emit-rtl.c (gen_lowpart_common): Use const_vec_p instead of + checking for CONST_VECTOR. + 2018-01-09 Jan Hubicka <hubicka@ucw.cz> PR middle-end/83575 diff --git a/gcc/common.md b/gcc/common.md index 71905e1c684..9fe3810ef7f 100644 --- a/gcc/common.md +++ b/gcc/common.md @@ -80,14 +80,14 @@ (define_constraint "E" "Matches a floating-point constant." (ior (match_test "CONST_DOUBLE_AS_FLOAT_P (op)") - (match_test "CONSTANT_P (op) + (match_test "GET_CODE (op) == CONST_VECTOR && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT"))) ;; There is no longer a distinction between "E" and "F". (define_constraint "F" "Matches a floating-point constant." (ior (match_test "CONST_DOUBLE_AS_FLOAT_P (op)") - (match_test "CONSTANT_P (op) + (match_test "GET_CODE (op) == CONST_VECTOR && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT"))) (define_constraint "X" diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi index bd9e998f527..2523f63c673 100644 --- a/gcc/doc/rtl.texi +++ b/gcc/doc/rtl.texi @@ -1875,18 +1875,12 @@ Usually that is the only mode for which a label is directly valid. @findex const @item (const:@var{m} @var{exp}) -Wraps an rtx computation @var{exp} whose inputs and result do not -change during the execution of a thread. There are two valid uses. -The first is to represent a global or thread-local address calculation. -In this case @var{exp} should contain @code{const_int}, -@code{symbol_ref}, @code{label_ref} or @code{unspec} expressions, -combined with @code{plus} and @code{minus}. Any such @code{unspec}s -are target-specific and typically represent some form of relocation -operator. @var{m} should be a valid address mode. - -The second use of @code{const} is to wrap a vector operation. -In this case @var{exp} must be a @code{vec_duplicate} or -@code{vec_series} expression. +Represents a constant that is the result of an assembly-time +arithmetic computation. The operand, @var{exp}, contains only +@code{const_int}, @code{symbol_ref}, @code{label_ref} or @code{unspec} +expressions, combined with @code{plus} and @code{minus}. Any such +@code{unspec}s are target-specific and typically represent some form +of relocation operator. @var{m} should be a valid address mode. @findex high @item (high:@var{m} @var{exp}) diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index c6ce35889b1..a722985b5d9 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1593,7 +1593,7 @@ gen_lowpart_common (machine_mode mode, rtx x) return gen_rtx_fmt_e (GET_CODE (x), int_mode, XEXP (x, 0)); } else if (GET_CODE (x) == SUBREG || REG_P (x) - || GET_CODE (x) == CONCAT || const_vec_p (x) + || GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR || CONST_DOUBLE_AS_FLOAT_P (x) || CONST_SCALAR_INT_P (x) || CONST_POLY_INT_P (x)) return lowpart_subreg (mode, x, innermode); diff --git a/gcc/expmed.c b/gcc/expmed.c index 808b067c670..f34ed9376af 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -5355,22 +5355,7 @@ make_tree (tree type, rtx x) return fold_convert (type, make_tree (t, XEXP (x, 0))); case CONST: - { - rtx op = XEXP (x, 0); - if (GET_CODE (op) == VEC_DUPLICATE) - { - tree elt_tree = make_tree (TREE_TYPE (type), XEXP (op, 0)); - return build_vector_from_val (type, elt_tree); - } - if (GET_CODE (op) == VEC_SERIES) - { - tree itype = TREE_TYPE (type); - tree base_tree = make_tree (itype, XEXP (op, 0)); - tree step_tree = make_tree (itype, XEXP (op, 1)); - return build_vec_series (type, base_tree, step_tree); - } - return make_tree (type, op); - } + return make_tree (type, XEXP (x, 0)); case SYMBOL_REF: t = SYMBOL_REF_DECL (x); diff --git a/gcc/rtl.h b/gcc/rtl.h index 71a81a211f1..fcad6a7e3f8 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2935,24 +2935,14 @@ extern rtx shallow_copy_rtx (const_rtx CXX_MEM_STAT_INFO); extern int rtx_equal_p (const_rtx, const_rtx); extern bool rtvec_all_equal_p (const_rtvec); -/* Return true if X is some form of vector constant. */ - -inline bool -const_vec_p (const_rtx x) -{ - return VECTOR_MODE_P (GET_MODE (x)) && CONSTANT_P (x); -} - /* Return true if X is a vector constant with a duplicated element value. */ inline bool const_vec_duplicate_p (const_rtx x) { - return ((GET_CODE (x) == CONST_VECTOR - && CONST_VECTOR_NPATTERNS (x) == 1 - && CONST_VECTOR_DUPLICATE_P (x)) - || (GET_CODE (x) == CONST - && GET_CODE (XEXP (x, 0)) == VEC_DUPLICATE)); + return (GET_CODE (x) == CONST_VECTOR + && CONST_VECTOR_NPATTERNS (x) == 1 + && CONST_VECTOR_DUPLICATE_P (x)); } /* Return true if X is a vector constant with a duplicated element value. @@ -2962,20 +2952,11 @@ template <typename T> inline bool const_vec_duplicate_p (T x, T *elt) { - if (GET_CODE (x) == CONST_VECTOR - && CONST_VECTOR_NPATTERNS (x) == 1 - && CONST_VECTOR_DUPLICATE_P (x)) + if (const_vec_duplicate_p (x)) { *elt = CONST_VECTOR_ENCODED_ELT (x, 0); return true; } - if (GET_CODE (x) == CONST - && GET_CODE (XEXP (x, 0)) == VEC_DUPLICATE - && !VECTOR_MODE_P (GET_MODE (XEXP (XEXP (x, 0), 0)))) - { - *elt = XEXP (XEXP (x, 0), 0); - return true; - } return false; } @@ -3002,12 +2983,8 @@ template <typename T> inline T unwrap_const_vec_duplicate (T x) { - if (GET_CODE (x) == CONST_VECTOR - && CONST_VECTOR_NPATTERNS (x) == 1 - && CONST_VECTOR_DUPLICATE_P (x)) - return CONST_VECTOR_ENCODED_ELT (x, 0); - if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == VEC_DUPLICATE) - return XEXP (XEXP (x, 0), 0); + if (const_vec_duplicate_p (x)) + x = CONST_VECTOR_ELT (x, 0); return x; } @@ -3030,12 +3007,6 @@ const_vec_series_p (const_rtx x, rtx *base_out, rtx *step_out) && CONST_VECTOR_NPATTERNS (x) == 1 && !CONST_VECTOR_DUPLICATE_P (x)) return const_vec_series_p_1 (x, base_out, step_out); - if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == VEC_SERIES) - { - *base_out = XEXP (XEXP (x, 0), 0); - *step_out = XEXP (XEXP (x, 0), 1); - return true; - } return false; } |