-/**
- * Handle Stores that were been scalar replaced or
- * will be scalar replaced.
- *
- * @param load A store node.
- * @param env Contains information about scalars number and mode.
- * @param repairs A set, that contains all blocks, that have a link, and all Phis, that
- * have copies to repair.
- */
-static void store_handling(ir_node *store, env_t *env, set *repairs)
-{
- repairs_t key, *value;
- ir_node *nods_block, *store_mem, *store_ptr, *store_value, *phi;
- ir_loop *store_l;
-
- store_ptr = get_Store_ptr(store);
-
- /* The pointer predecessor of Store must be a Sel node.*/
- if (get_irn_op(store_ptr) == op_Sel) {
- /* If the link field of a Store's is set to "ADDRESS_TAKEN", that mean this value
- can't be scalar replaced. It's nothing to do and store_handling() must be exit.*/
- if (get_entity_link(get_Sel_entity(store_ptr)) == ADDRESS_TAKEN)
- return;
-
- /* If the Store node is in a loop, than the loop head of the Store
- * must be handled, if this was not already done. */
- store_l = get_irn_loop(store);
- if (store_l != NULL) {
- phi = get_loop_node(store_l, 0);
- if (get_irn_op(phi) != op_Block) {
- key.irn = get_nodes_block(phi);
- value = set_find(repairs, &key, sizeof(key), HASH_PTR(key.irn));
- if (value == NULL) {
- set_irn_link(phi, LOOP_HEAD_PHI);
- block_link(phi, env, repairs);
- phi_handling(phi, env, repairs);
- }
- }
- }
-
- DDMN(store);
- nods_block = get_nodes_block(store);
-
- key.irn = nods_block;
- value = set_find(repairs, &key, sizeof(key), HASH_PTR(nods_block));
-
- store_mem = get_Store_mem(store);
- store_value = get_Store_value(store);
-
- if (store_l != NULL)
- loop_walk(store, env, repairs);
- else
- memory_edge_walk2(store, env, repairs);
- /* Store's pointer predecessor's link field contains the position in the block's link, where
- must be saved the value predecessor of this store. */
- value->link[(unsigned)get_irn_link(store_ptr)] = store_value;
-
- /* The store node can be turned into a tuple now. This tuple will be optimized later. */
- turn_into_tuple(store, pn_Store_max);
- set_Tuple_pred(store, pn_Store_M, store_mem);
- set_Tuple_pred(store, pn_Store_X_except, new_Bad());
- }
-}
-
-/**
- * A walker along the memory edge. Stores, Phis and their blocks as well Load's blocks must be found for optimization
- *
- * @param node A node from the graph.
- * @param env Contains information about scalars number and mode.
- * @param repairs A set, that contains all blocks, that have a link, and all Phis, that
- * have copies to repair.
-*/
-static void memory_edge_walk(ir_node *node, env_t *env, set *repairs)
-{
- int i, n = get_irn_arity(node);
- ir_op *op;
-
- DDMN(node);
-
- set_irn_link(get_nodes_block(node), NULL);
-
- for (i = n - 1; i >= 0; --i) {
- ir_node *pred = get_irn_n(node, i);
- ir_op *op = get_irn_op(pred);
-
- if ((op == op_Proj &&
- get_irn_mode(pred) == mode_M) ||
- op == op_Load ||
- op == op_Store ||
- op == op_Call ||
- op == op_Alloc)
- memory_edge_walk(pred, env, repairs);
-
- if (op == op_Phi &&
- get_irn_mode(pred) == mode_M &&
- get_irn_link(pred) != NODE_VISITED) {
- set_irn_link(pred, NODE_VISITED);
- memory_edge_walk(pred, env, repairs);
- }
- }
-
- op = get_irn_op(node);
- if (op == op_Store || op == op_Load)
- block_link(node, env, repairs);
-
- if (op == op_Phi && get_irn_mode(node) == mode_M)
- phi_handling(node, env, repairs);
-
- if (op == op_Store)
- store_handling(node, env, repairs);
-
- /* Reset the links, that have been used by the walk.*/
- if (get_irn_link(node) == NODE_VISITED)
- set_irn_link(node, NULL);
-}
-
-/**
- * Make scalar replacement.
- *
- * @param envals The number of scalars.
- * @param repairs A set, that contains all blocks, that have a link, and all Phis, that
- * have copies to repair.
- * @param modes A flexible array, containing all the modes of
- * the value numbers.
- */
-static void do_scalar_replacements(int nvals, set * repairs, ir_mode **modes)
-{
- ir_node *end_block = get_irg_end_block(current_ir_graph);
- int i;
- int n = get_Block_n_cfgpreds(end_block);
- env_t env;
-
- obstack_init(&env.obst);
- env.nvals = nvals;
- env.modes = modes;
-
- /* Search for scalars.*/
- for (i = 0; i < n; ++i) {
- ir_node *pred = get_Block_cfgpred(end_block, i);
- if (get_irn_op(pred) != op_Block)
- memory_edge_walk(pred, &env, repairs);
- }
-
- /* Search for predecessors of scalars.*/
- for (i = 0; i < n; ++i) {
- ir_node *pred = get_Block_cfgpred(end_block, i);
- if (get_irn_op(pred) != op_Block)
- memory_edge_walk2(pred, &env, repairs);
- }
- obstack_free(&env.obst, NULL);