Hi Tobias, I think that, according to the std::map feedback, we could use std::map now and replace it with hash_map later, if its performance is better. However, I propose to temporary postpone this and work on gimple code generation from isl_ast_node_user, because we already have generation of loops with empty bodies and generation from isl_ast_node_user can be a problem. What do you think about this?
Could you please advise me an algorithm for computation of substitutions? (ClooG uses its own algorithm for this and stores substitutions in clast_user_stmt. There is an algorithm, which is used in polly, but, honestly, I don't understand it.) Could you please advise me how is it better to bind polly basic blocks to a isl_ast_node_user? I'm using the following code now, but I'm not sure if it is the right way: bb_schedule = isl_map_intersect_domain (bb_schedule, isl_set_copy (pbb->domain)); isl_id *dim_in_id = isl_map_get_tuple_id (bb_schedule, isl_dim_in); isl_id *new_dim_in_id = isl_id_alloc (isl_id_get_ctx (dim_in_id), isl_id_get_name (dim_in_id), pbb); bb_schedule = isl_map_set_tuple_id (bb_schedule, isl_dim_in, new_dim_in_id); (I'm allocating an isl_id, which contains pointer to polly basic blocks, while we're generating a isl_schedule.) gcc_assert (isl_ast_node_get_type (node) == isl_ast_node_user); isl_ast_expr *user_expr = isl_ast_node_user_get_expr (node); isl_ast_expr *name_expr = isl_ast_expr_get_op_arg (user_expr, 0); gcc_assert (isl_ast_expr_get_type (name_expr) == isl_ast_expr_id); isl_id *name_id = isl_ast_expr_get_id (name_expr); poly_bb_p pbb = (poly_bb_p) isl_id_get_user (name_id); (I'm getting this information, while we're handling isl_ast_node_user) -- Cheers, Roman Gareev