From 6182121c120a277dd38eb28e669866842a83a4dc Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 13 Dec 2016 09:17:42 +0000 Subject: [PATCH] re PR tree-optimization/78742 (internal compiler error: in int_cst_value, at tree.c:10782) 2016-12-13 Richard Biener PR middle-end/78742 * tree.c (cst_and_fits_in_hwi): Look if the actual value fits. * tree-object-size.c (compute_builtin_object_size): Use tree_fits_shwi_p. * tree-data-ref.c (initialize_matrix_A): Remove excess assert. * gcc.dg/torture/pr78742.c: New testcase. From-SVN: r243598 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr78742.c | 20 ++++++++++++++++++++ gcc/tree-data-ref.c | 2 -- gcc/tree-object-size.c | 2 +- gcc/tree.c | 2 +- 6 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr78742.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ae13c5ed05..5e0562bbbef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-12-13 Richard Biener + + PR middle-end/78742 + * tree.c (cst_and_fits_in_hwi): Look if the actual value fits. + * tree-object-size.c (compute_builtin_object_size): Use + tree_fits_shwi_p. + * tree-data-ref.c (initialize_matrix_A): Remove excess assert. + 2016-12-13 Martin Liska * asan.c (asan_mark_poison_p): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff7bd7868bc..6ad28bf9ce0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-13 Richard Biener + + PR middle-end/78742 + * gcc.dg/torture/pr78742.c: New testcase. + 2016-12-13 Martin Liska * gcc.dg/asan/use-after-scope-goto-1.c: Update first argument of diff --git a/gcc/testsuite/gcc.dg/torture/pr78742.c b/gcc/testsuite/gcc.dg/torture/pr78742.c new file mode 100644 index 00000000000..c83ecbcb7d7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr78742.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target int128 } */ + +void foo(); + +void func() +{ + int m; + + int tab[m]; + + __int128 j; + for(; j; j++) + { + tab[j] = 0; + tab[j+1] = 0; + } + + foo(); +} diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 8152da3f180..1408c242f22 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -2118,8 +2118,6 @@ initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult) switch (TREE_CODE (chrec)) { case POLYNOMIAL_CHREC: - gcc_assert (TREE_CODE (CHREC_RIGHT (chrec)) == INTEGER_CST); - 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-object-size.c b/gcc/tree-object-size.c index 0fae183b330..f9c752198e0 100644 --- a/gcc/tree-object-size.c +++ b/gcc/tree-object-size.c @@ -538,7 +538,7 @@ compute_builtin_object_size (tree ptr, int object_size_type, tree offset = gimple_assign_rhs2 (def); ptr = gimple_assign_rhs1 (def); - if (cst_and_fits_in_hwi (offset) + if (tree_fits_shwi_p (offset) && compute_builtin_object_size (ptr, object_size_type, psize)) { /* Return zero when the offset is out of bounds. */ diff --git a/gcc/tree.c b/gcc/tree.c index 0f0e6753b19..2a603866522 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1677,7 +1677,7 @@ bool cst_and_fits_in_hwi (const_tree x) { return (TREE_CODE (x) == INTEGER_CST - && TYPE_PRECISION (TREE_TYPE (x)) <= HOST_BITS_PER_WIDE_INT); + && (tree_fits_shwi_p (x) || tree_fits_uhwi_p (x))); } /* Build a newly constructed VECTOR_CST node of length LEN. */ -- 2.30.2