https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87917
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |sebpop at gmail dot com --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- I get: during GIMPLE pass: ldist pr34635.c: In function ‘foo’: pr34635.c:4:6: internal compiler error: tree check: expected integer_cst, have polynomial_chrec in int_cst_value, at tree.c:11188 4 | void foo(int x[]) | ^~~ 0x1397ffc tree_check_failed(tree_node const*, char const*, int, char const*, ...) /tmp/trunk/gcc/tree.c:9371 0x83e3a7 tree_int_cst_elt_check(tree_node const*, int, char const*, int, char const*) /tmp/trunk/gcc/tree.h:3307 0x13a0e5b int_cst_value(tree_node const*) /tmp/trunk/gcc/tree.c:11188 #11 0x00000000010cf399 in get_data_dependence (rdg=0x2816ba0, a=0x2817830, b=0x28170c0) at /tmp/trunk/gcc/tree-loop-distribution.c:1188 1188 compute_affine_dependence (ddr, loop_nest[0]); (gdb) l 1183 ent.b = b; 1184 slot = ddrs_table->find_slot (&ent, INSERT); 1185 if (*slot == NULL) 1186 { 1187 ddr = initialize_data_dependence_relation (a, b, loop_nest); 1188 compute_affine_dependence (ddr, loop_nest[0]); 1189 *slot = ddr; 1190 } (gdb) p debug_data_reference (a) #(Data Ref: # bb: 3 # stmt: _8 = *_4; # ref: *_4; # base_object: *x_22(D); # Access function 0: {0B, +, {0, +, 4}_1}_2 #) $6 = void (gdb) p debug_data_reference (b) #(Data Ref: # bb: 3 # stmt: *_7 = _8; # ref: *_7; # base_object: *x_22(D); # Access function 0: {0B, +, 4}_1 #) so we have an "invariant" access and a variant one. I think else if (evolution_function_is_affine_multivariate_p (chrec_a, loop_nest->num) && !chrec_contains_symbols (chrec_a) && evolution_function_is_affine_multivariate_p (chrec_b, loop_nest->num) && !chrec_contains_symbols (chrec_b)) { /* testsuite/.../ssa-chrec-35.c {0, +, 1}_2 vs. {0, +, 1}_3 the overlapping elements are respectively located at iterations: {0, +, 1}_x and {0, +, 1}_x, in other words, we have the equality: {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x) Other examples: {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) = {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y) {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) = {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) */ analyze_subscript_affine_affine (chrec_a, chrec_b, overlaps_a, overlaps_b, last_conflicts); is not properly guarded. evolution_function_is_affine_multivariate_p lets this through via bool evolution_function_is_affine_multivariate_p (const_tree chrec, int loopnum) { if (chrec == NULL_TREE) return false; switch (TREE_CODE (chrec)) { case POLYNOMIAL_CHREC: if (evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec), loopnum)) { if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum)) return true; else { if (TREE_CODE (CHREC_RIGHT (chrec)) == POLYNOMIAL_CHREC && CHREC_VARIABLE (CHREC_RIGHT (chrec)) != CHREC_VARIABLE (chrec) && evolution_function_is_affine_multivariate_p (CHREC_RIGHT (chrec), loopnum)) but as we are interested in loopnum == 1 for {0, +, {0, +, 4}_1}_2 we have to exclude the case where CHREC_RIGHT variates in it. Whatever exactly a affine multivariate is... Sebastian - can you say if evolution_function_is_affine_multivariate_p ({0, +, {0, +, 4}_1}_2, 1) should really return true?