static enum ssa_prop_result copy_prop_visit_stmt (gimple stmt, edge *taken_edge_p, tree *result_p) { enum ssa_prop_result retval; if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "\nVisiting statement:\n"); print_gimple_stmt (dump_file, stmt, 0, dump_flags); fprintf (dump_file, "\n"); } if (gimple_assign_single_p (stmt) && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))) { /* If the statement is a copy assignment, evaluate its RHS to see if the lattice value of its output has changed. */ retval = copy_prop_visit_assignment (stmt, result_p); } else if (gimple_code (stmt) == GIMPLE_COND) { /* See if we can determine which edge goes out of a conditional jump. */ retval = copy_prop_visit_cond_stmt (stmt, taken_edge_p); } else retval = SSA_PROP_VARYING; if (retval == SSA_PROP_VARYING) { tree def; ssa_op_iter i; /* Any other kind of statement is not interesting for constant propagation and, therefore, not worth simulating. */ if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "No interesting values produced.\n"); /* The assignment is not a copy operation. Don't visit this statement again and mark all the definitions in the statement to be copies of nothing. */ FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS) set_copy_of_val (def, def); } return retval; }
static VEC (tree, gc) * copy_vuses_from_stmt (tree stmt) { ssa_op_iter iter; tree vuse; VEC (tree, gc) *vuses = NULL; if (!stmt) return NULL; FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VUSE) VEC_safe_push (tree, gc, vuses, vuse); return vuses; }
static VEC (tree, gc) * shared_vuses_from_stmt (tree stmt) { ssa_op_iter iter; tree vuse; if (!stmt) return NULL; VEC_truncate (tree, shared_lookup_vuses, 0); FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VUSE) VEC_safe_push (tree, gc, shared_lookup_vuses, vuse); if (VEC_length (tree, shared_lookup_vuses) > 1) sort_vuses (shared_lookup_vuses); return shared_lookup_vuses; }
DEBUG_FUNCTION void verify_ssaname_freelists (struct function *fun) { if (!gimple_in_ssa_p (fun)) return; bitmap names_in_il = BITMAP_ALLOC (NULL); /* Walk the entire IL noting every SSA_NAME we see. */ basic_block bb; FOR_EACH_BB_FN (bb, fun) { tree t; /* First note the result and arguments of PHI nodes. */ for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gphi *phi = gsi.phi (); t = gimple_phi_result (phi); bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t)); for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++) { t = gimple_phi_arg_def (phi, i); if (TREE_CODE (t) == SSA_NAME) bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t)); } } /* Then note the operands of each statement. */ for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { ssa_op_iter iter; gimple *stmt = gsi_stmt (gsi); FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, SSA_OP_ALL_OPERANDS) bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t)); } }