static inline void finalize_ssa_uses (gimple stmt) { unsigned new_i; struct use_optype_d new_list; use_optype_p old_ops, ptr, last; /* Pre-pend the VUSE we may have built. */ if (build_vuse != NULL_TREE) { tree oldvuse = gimple_vuse (stmt); if (oldvuse && TREE_CODE (oldvuse) == SSA_NAME) oldvuse = SSA_NAME_VAR (oldvuse); if (oldvuse != (build_vuse != NULL_TREE ? build_vuse : build_vdef)) gimple_set_vuse (stmt, NULL_TREE); VEC_safe_insert (tree, heap, build_uses, 0, (tree)gimple_vuse_ptr (stmt)); } new_list.next = NULL; last = &new_list; old_ops = gimple_use_ops (stmt); /* Clear a no longer necessary VUSE. */ if (build_vuse == NULL_TREE && gimple_vuse (stmt) != NULL_TREE) gimple_set_vuse (stmt, NULL_TREE); /* If there is anything in the old list, free it. */ if (old_ops) { for (ptr = old_ops; ptr; ptr = ptr->next) delink_imm_use (USE_OP_PTR (ptr)); old_ops->next = gimple_ssa_operands (cfun)->free_uses; gimple_ssa_operands (cfun)->free_uses = old_ops; } /* If we added a VUSE, make sure to set the operand if it is not already present and mark it for renaming. */ if (build_vuse != NULL_TREE && gimple_vuse (stmt) == NULL_TREE) { gimple_set_vuse (stmt, gimple_vop (cfun)); mark_sym_for_renaming (gimple_vop (cfun)); } /* Now create nodes for all the new nodes. */ for (new_i = 0; new_i < VEC_length (tree, build_uses); new_i++) last = add_use_op (stmt, (tree *) VEC_index (tree, build_uses, new_i), last); /* Now set the stmt's operands. */ gimple_set_use_ops (stmt, new_list.next); }
static void create_mem_region (CORE_ADDR lo, CORE_ADDR hi, const struct mem_attrib *attrib) { struct mem_region newobj; int i, ix; /* lo == hi is a useless empty region. */ if (lo >= hi && hi != 0) { printf_unfiltered (_("invalid memory region: low >= high\n")); return; } mem_region_init (&newobj); newobj.lo = lo; newobj.hi = hi; ix = VEC_lower_bound (mem_region_s, mem_region_list, &newobj, mem_region_lessthan); /* Check for an overlapping memory region. We only need to check in the vicinity - at most one before and one after the insertion point. */ for (i = ix - 1; i < ix + 1; i++) { struct mem_region *n; if (i < 0) continue; if (i >= VEC_length (mem_region_s, mem_region_list)) continue; n = VEC_index (mem_region_s, mem_region_list, i); if ((lo >= n->lo && (lo < n->hi || n->hi == 0)) || (hi > n->lo && (hi <= n->hi || n->hi == 0)) || (lo <= n->lo && ((hi >= n->hi && n->hi != 0) || hi == 0))) { printf_unfiltered (_("overlapping memory region\n")); return; } } newobj.number = ++mem_number; newobj.attrib = *attrib; VEC_safe_insert (mem_region_s, mem_region_list, ix, &newobj); }
static inline void finalize_ssa_defs (gimple stmt) { unsigned new_i; struct def_optype_d new_list; def_optype_p old_ops, last; unsigned int num = VEC_length (tree, build_defs); /* There should only be a single real definition per assignment. */ gcc_assert ((stmt && gimple_code (stmt) != GIMPLE_ASSIGN) || num <= 1); /* Pre-pend the vdef we may have built. */ if (build_vdef != NULL_TREE) { tree oldvdef = gimple_vdef (stmt); if (oldvdef && TREE_CODE (oldvdef) == SSA_NAME) oldvdef = SSA_NAME_VAR (oldvdef); if (oldvdef != build_vdef) gimple_set_vdef (stmt, build_vdef); VEC_safe_insert (tree, heap, build_defs, 0, (tree)gimple_vdef_ptr (stmt)); ++num; } new_list.next = NULL; last = &new_list; old_ops = gimple_def_ops (stmt); new_i = 0; /* Clear and unlink a no longer necessary VDEF. */ if (build_vdef == NULL_TREE && gimple_vdef (stmt) != NULL_TREE) { if (TREE_CODE (gimple_vdef (stmt)) == SSA_NAME) { unlink_stmt_vdef (stmt); release_ssa_name (gimple_vdef (stmt)); } gimple_set_vdef (stmt, NULL_TREE); } /* If we have a non-SSA_NAME VDEF, mark it for renaming. */ if (gimple_vdef (stmt) && TREE_CODE (gimple_vdef (stmt)) != SSA_NAME) mark_sym_for_renaming (gimple_vdef (stmt)); /* Check for the common case of 1 def that hasn't changed. */ if (old_ops && old_ops->next == NULL && num == 1 && (tree *) VEC_index (tree, build_defs, 0) == DEF_OP_PTR (old_ops)) return; /* If there is anything in the old list, free it. */ if (old_ops) { old_ops->next = gimple_ssa_operands (cfun)->free_defs; gimple_ssa_operands (cfun)->free_defs = old_ops; } /* If there is anything remaining in the build_defs list, simply emit it. */ for ( ; new_i < num; new_i++) last = add_def_op ((tree *) VEC_index (tree, build_defs, new_i), last); /* Now set the stmt's operands. */ gimple_set_def_ops (stmt, new_list.next); }