From a1a5996d9ee2ae55dcc1c4e1bccb0dfb76a64caf Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 16 Jan 2008 16:00:17 +0000 Subject: [PATCH] re PR tree-optimization/34769 (gcc.dg/vect/no-vfa-pr29145.c) 2008-01-16 Richard Guenther PR tree-optimization/34769 * tree-data-ref.c (initialize_matrix_A): Revert fix for PR34458. * tree.c (int_cst_value): Instead make this function more permissive in what it accepts as valid input. Document this function always sign-extends the value. From-SVN: r131573 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-data-ref.c | 13 ++----------- gcc/tree.c | 19 ++++++++++++------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 909008b3fa9..2d4f0c78dd4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-01-16 Richard Guenther + + PR tree-optimization/34769 + * tree-data-ref.c (initialize_matrix_A): Revert fix for PR34458. + * tree.c (int_cst_value): Instead make this function more + permissive in what it accepts as valid input. Document this + function always sign-extends the value. + 2008-01-16 Jakub Jelinek Richard Guenther diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 1fe7c0a4683..2f17ed1deb4 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1823,21 +1823,12 @@ analyze_siv_subscript_cst_affine (tree chrec_a, static HOST_WIDE_INT initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult) { - tree type; - gcc_assert (chrec); - type = TREE_TYPE (chrec); if (TREE_CODE (chrec) != POLYNOMIAL_CHREC) - return tree_low_cst (chrec, TYPE_UNSIGNED (type) - && !(TREE_CODE (type) == INTEGER_TYPE - && TYPE_IS_SIZETYPE (type))); + return int_cst_value (chrec); - type = TREE_TYPE (CHREC_RIGHT (chrec)); - A[index][0] = mult * tree_low_cst (CHREC_RIGHT (chrec), - TYPE_UNSIGNED (type) - && !(TREE_CODE (type) == INTEGER_TYPE - && TYPE_IS_SIZETYPE (type))); + A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec)); return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult); } diff --git a/gcc/tree.c b/gcc/tree.c index 02570b78c1a..21121b27788 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -8036,21 +8036,26 @@ find_compatible_field (tree record, tree orig_field) return orig_field; } -/* Return value of a constant X. */ +/* Return value of a constant X and sign-extend it. */ HOST_WIDE_INT int_cst_value (const_tree x) { unsigned bits = TYPE_PRECISION (TREE_TYPE (x)); unsigned HOST_WIDE_INT val = TREE_INT_CST_LOW (x); - bool negative = ((val >> (bits - 1)) & 1) != 0; - gcc_assert (bits <= HOST_BITS_PER_WIDE_INT); + /* Make sure the sign-extended value will fit in a HOST_WIDE_INT. */ + gcc_assert (TREE_INT_CST_HIGH (x) == 0 + || TREE_INT_CST_HIGH (x) == -1); - if (negative) - val |= (~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1; - else - val &= ~((~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1); + if (bits < HOST_BITS_PER_WIDE_INT) + { + bool negative = ((val >> (bits - 1)) & 1) != 0; + if (negative) + val |= (~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1; + else + val &= ~((~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1); + } return val; }