diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr98773.c | 19 | ||||
-rw-r--r-- | gcc/tree-data-ref.c | 17 |
2 files changed, 22 insertions, 14 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr98773.c b/gcc/testsuite/gcc.dg/torture/pr98773.c new file mode 100644 index 0000000..026e8ef --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr98773.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ + +char a[128]; + +void __attribute__((noipa)) +foo () +{ + for (unsigned i = 27; i >= 5; --i) + a[i] = a[i-5]; +} + +int main() +{ + __builtin_memcpy (a, "Hello World", sizeof ("Hello World")); + foo (); + if (__builtin_memcmp (a + 5, "Hello World", sizeof ("Hello World")) != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index d19c5eb..124a7be 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -3924,21 +3924,10 @@ initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult) switch (TREE_CODE (chrec)) { case POLYNOMIAL_CHREC: - /* CHREC_RIGHT and its negated value should fit in a lambda_int. - Pointer typed chrecs right are to be interpreted signed. */ HOST_WIDE_INT chrec_right; - if (POINTER_TYPE_P (chrec_type (chrec))) - { - if (!cst_and_fits_in_hwi (CHREC_RIGHT (chrec))) - return chrec_dont_know; - chrec_right = int_cst_value (CHREC_RIGHT (chrec)); - } - else - { - if (!tree_fits_shwi_p (CHREC_RIGHT (chrec))) - return chrec_dont_know; - chrec_right = tree_to_shwi (CHREC_RIGHT (chrec)); - } + if (!cst_and_fits_in_hwi (CHREC_RIGHT (chrec))) + return chrec_dont_know; + chrec_right = int_cst_value (CHREC_RIGHT (chrec)); /* We want to be able to negate without overflow. */ if (chrec_right == HOST_WIDE_INT_MIN) return chrec_dont_know; |