re PR tree-optimization/89223 (internal compiler error: in int_cst_value, at tree.c:11226)

2019-02-08  Richard Biener  <rguenther@suse.de>

	PR middle-end/89223
	* tree-data-ref.c (initialize_matrix_A): Fail if constant
	doesn't fit in HWI.
	(analyze_subscript_affine_affine): Handle failure from
	initialize_matrix_A.

	* gcc.dg/torture/pr89223.c: New testcase.

From-SVN: r268666
This commit is contained in:
Richard Biener 2019-02-08 08:18:09 +00:00 committed by Richard Biener
parent 1c93f6ce59
commit 2536d696a3
4 changed files with 40 additions and 4 deletions

View file

@ -1,3 +1,11 @@
2019-02-08 Richard Biener <rguenther@suse.de>
PR middle-end/89223
* tree-data-ref.c (initialize_matrix_A): Fail if constant
doesn't fit in HWI.
(analyze_subscript_affine_affine): Handle failure from
initialize_matrix_A.
2019-02-08 Jakub Jelinek <jakub@redhat.com>
* cfganal.c (pre_and_rev_post_order_compute_fn): Use fn instead of

View file

@ -1,3 +1,8 @@
2019-02-08 Richard Biener <rguenther@suse.de>
PR middle-end/89223
* gcc.dg/torture/pr89223.c: New testcase.
2019-02-07 David Malcolm <dmalcolm@redhat.com>
PR tree-optimization/86637

View file

@ -0,0 +1,10 @@
/* { dg-do compile { target int128 } } */
int a[5];
unsigned __int128 b;
void c()
{
b = 4;
for (;; b--)
a[b] = ({ a[b + b]; });
}

View file

@ -3191,6 +3191,8 @@ initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult)
switch (TREE_CODE (chrec))
{
case POLYNOMIAL_CHREC:
if (!cst_and_fits_in_hwi (CHREC_RIGHT (chrec)))
return chrec_dont_know;
A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec));
return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult);
@ -3574,7 +3576,7 @@ analyze_subscript_affine_affine (tree chrec_a,
tree *last_conflicts)
{
unsigned nb_vars_a, nb_vars_b, dim;
HOST_WIDE_INT init_a, init_b, gamma, gcd_alpha_beta;
HOST_WIDE_INT gamma, gcd_alpha_beta;
lambda_matrix A, U, S;
struct obstack scratch_obstack;
@ -3611,9 +3613,20 @@ analyze_subscript_affine_affine (tree chrec_a,
A = lambda_matrix_new (dim, 1, &scratch_obstack);
S = lambda_matrix_new (dim, 1, &scratch_obstack);
init_a = int_cst_value (initialize_matrix_A (A, chrec_a, 0, 1));
init_b = int_cst_value (initialize_matrix_A (A, chrec_b, nb_vars_a, -1));
gamma = init_b - init_a;
tree init_a = initialize_matrix_A (A, chrec_a, 0, 1);
tree init_b = initialize_matrix_A (A, chrec_b, nb_vars_a, -1);
if (init_a == chrec_dont_know
|| init_b == chrec_dont_know)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "affine-affine test failed: "
"representation issue.\n");
*overlaps_a = conflict_fn_not_known ();
*overlaps_b = conflict_fn_not_known ();
*last_conflicts = chrec_dont_know;
goto end_analyze_subs_aa;
}
gamma = int_cst_value (init_b) - int_cst_value (init_a);
/* Don't do all the hard work of solving the Diophantine equation
when we already know the solution: for example,