https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79302
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- But it smells similar to PR77318. gcc_assert (!chrec_contains_undetermined (nb_iters)); nb_iters = scalar_evolution_in_region (region, loop, nb_iters); gcc_assert (!chrec_contains_undetermined (nb_iters)); nb_iters is (unsigned int) _2 + 4294967295, defined outside of loop, loops outer loop is not fully contained within the region. scalar_evolution_in_region goes if (TREE_CODE (t) != SSA_NAME || loop_in_sese_p (loop, region)) /* FIXME: we would need instantiate SCEV to work on a region, and be more flexible wrt. memory loads that may be invariant in the region. */ return instantiate_scev (before, loop, analyze_scalar_evolution (loop, t)); where analyze_scalar_evolution just does nothing (obviously) but instantiate_scev returns scev_not_known because in 'before' we have _2 = middle_39 - bottom_30 and that's not analyzable (but graphite expects instantiation to stop there, evaluating to this symbolically). But we do static tree instantiate_scev_name (basic_block instantiate_below, struct loop *evolution_loop, struct loop *inner_loop, tree chrec, bool *fold_conversions, int size_expr) { ... /* If the analysis yields a parametric chrec, instantiate the result again. */ res = analyze_scalar_evolution (def_loop, chrec); and that fails and we run in circles via else if (res != chrec_dont_know) { if (inner_loop && def_bb->loop_father != inner_loop && !flow_loop_nested_p (def_bb->loop_father, inner_loop)) /* ??? We could try to compute the overall effect of the loop here. */ res = chrec_dont_know; else res = instantiate_scev_r (instantiate_below, evolution_loop, inner_loop, res, fold_conversions, size_expr); with the same SSA name again and again until we give up due to the recursion limit. So the expectation of GRAPHITE is sth like Index: gcc/tree-scalar-evolution.c =================================================================== --- gcc/tree-scalar-evolution.c (revision 245058) +++ gcc/tree-scalar-evolution.c (working copy) @@ -280,6 +280,7 @@ along with GCC; see the file COPYING3. #include "params.h" #include "tree-ssa-propagate.h" #include "gimple-fold.h" +#include "cfgexpand.h" static tree analyze_scalar_evolution_1 (struct loop *, tree, tree); static tree analyze_scalar_evolution_for_address_of (struct loop *loop, @@ -2460,9 +2461,14 @@ instantiate_scev_name (basic_block insta /* ??? We could try to compute the overall effect of the loop here. */ res = chrec_dont_know; else - res = instantiate_scev_r (instantiate_below, evolution_loop, - inner_loop, res, - fold_conversions, size_expr); + { + if (res == chrec + && is_gimple_assign (SSA_NAME_DEF_STMT (res))) + res = gimple_assign_rhs_to_tree (SSA_NAME_DEF_STMT (res)); + res = instantiate_scev_r (instantiate_below, evolution_loop, + inner_loop, res, + fold_conversions, size_expr); + } } /* Store the correct value to the cache. */ which fixes the ICE. But we can probably simply deal with this case in add_loop_constraints with Index: gcc/graphite-sese-to-poly.c =================================================================== --- gcc/graphite-sese-to-poly.c (revision 245058) +++ gcc/graphite-sese-to-poly.c (working copy) @@ -930,7 +931,11 @@ add_loop_constraints (scop_p scop, __isl /* loop_i <= expr_nb_iters */ gcc_assert (!chrec_contains_undetermined (nb_iters)); nb_iters = scalar_evolution_in_region (region, loop, nb_iters); - gcc_assert (!chrec_contains_undetermined (nb_iters)); + if (chrec_contains_undetermined (nb_iters)) + { + isl_space_free (space); + return domain; + } isl_pw_aff *aff_nb_iters = extract_affine (scop, nb_iters, isl_space_copy (space));