From: Diego Novillo Date: Fri, 30 Jul 2004 19:40:30 +0000 (+0000) Subject: tree-ssa-alias.c (compute_points_to_and_addr_escape): If a pointer escapes through... X-Git-Tag: releases/gcc-4.0.0~6219 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=92965c565bf0dac4c58f819f29d7a537a587d6c0;p=gcc.git tree-ssa-alias.c (compute_points_to_and_addr_escape): If a pointer escapes through a function call... * tree-ssa-alias.c (compute_points_to_and_addr_escape): If a pointer escapes through a function call, assume that the callee will dereference it. (add_pointed_to_var): Assume that VALUE is always an ADDR_EXPR. (collect_points_to_info_r): Only call add_pointed_to_var if the value is an ADDR_EXPR. From-SVN: r85353 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 53cb77e3fc95..b36cc87ae2f8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-07-30 Diego Novillo + + * tree-ssa-alias.c (compute_points_to_and_addr_escape): If a + pointer escapes through a function call, assume that the + callee will dereference it. + (add_pointed_to_var): Assume that VALUE is always an + ADDR_EXPR. + (collect_points_to_info_r): Only call add_pointed_to_var if + the value is an ADDR_EXPR. + 2004-07-30 Diego Novillo * tree-ssa-alias.c (create_alias_map_for): Do not get the diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 2363ec95885d..1ec246492041 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -691,7 +691,10 @@ compute_points_to_and_addr_escape (struct alias_info *ai) that pointer OP will be dereferenced in a store operation inside the called function. */ if (get_call_expr_in (stmt)) - bitmap_set_bit (ai->dereferenced_ptrs_store, v_ann->uid); + { + bitmap_set_bit (ai->dereferenced_ptrs_store, v_ann->uid); + pi->is_dereferenced = 1; + } } } @@ -1863,35 +1866,32 @@ static void add_pointed_to_var (struct alias_info *ai, tree ptr, tree value) { struct ptr_info_def *pi = get_ptr_info (ptr); + tree pt_var; + size_t uid; - if (TREE_CODE (value) == ADDR_EXPR) - { - tree pt_var; - size_t uid; +#if defined ENABLE_CHECKING + if (TREE_CODE (value) != ADDR_EXPR) + abort (); +#endif - pt_var = TREE_OPERAND (value, 0); - if (TREE_CODE_CLASS (TREE_CODE (pt_var)) == 'r') - pt_var = get_base_address (pt_var); + pt_var = TREE_OPERAND (value, 0); + if (TREE_CODE_CLASS (TREE_CODE (pt_var)) == 'r') + pt_var = get_base_address (pt_var); - if (pt_var && SSA_VAR_P (pt_var)) - { - uid = var_ann (pt_var)->uid; - bitmap_set_bit (ai->addresses_needed, uid); + if (pt_var && SSA_VAR_P (pt_var)) + { + uid = var_ann (pt_var)->uid; + bitmap_set_bit (ai->addresses_needed, uid); - /* If PTR has already been found to point anywhere, don't - add the variable to PTR's points-to set. */ - if (!pi->pt_anything) - { - if (pi->pt_vars == NULL) - pi->pt_vars = BITMAP_GGC_ALLOC (); - bitmap_set_bit (pi->pt_vars, uid); - } + /* If PTR has already been found to point anywhere, don't + add the variable to PTR's points-to set. */ + if (!pi->pt_anything) + { + if (pi->pt_vars == NULL) + pi->pt_vars = BITMAP_GGC_ALLOC (); + bitmap_set_bit (pi->pt_vars, uid); } - else - add_pointed_to_expr (ptr, value); } - else - add_pointed_to_expr (ptr, value); } @@ -1922,8 +1922,8 @@ collect_points_to_info_r (tree var, tree stmt, void *data) tree rhs = TREE_OPERAND (stmt, 1); STRIP_NOPS (rhs); - /* Found P_i = CONST. */ - if (is_gimple_min_invariant (rhs)) + /* Found P_i = ADDR_EXPR */ + if (TREE_CODE (rhs) == ADDR_EXPR) add_pointed_to_var (ai, var, rhs); /* Found P_i = Q_j. */ @@ -1944,9 +1944,9 @@ collect_points_to_info_r (tree var, tree stmt, void *data) else if (TREE_CODE (op1) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (op1))) merge_pointed_to_info (ai, var, op1); - else if (is_gimple_min_invariant (op0)) + else if (TREE_CODE (op0) == ADDR_EXPR) add_pointed_to_var (ai, var, op0); - else if (is_gimple_min_invariant (op1)) + else if (TREE_CODE (op1) == ADDR_EXPR) add_pointed_to_var (ai, var, op1); else add_pointed_to_expr (var, rhs); @@ -1978,7 +1978,7 @@ collect_points_to_info_r (tree var, tree stmt, void *data) variable that we are analyzing is the LHS of the PHI node. */ tree lhs = PHI_RESULT (stmt); - if (is_gimple_min_invariant (var)) + if (TREE_CODE (var) == ADDR_EXPR) add_pointed_to_var (ai, lhs, var); else if (TREE_CODE (var) == SSA_NAME) { @@ -1987,6 +1987,8 @@ collect_points_to_info_r (tree var, tree stmt, void *data) else set_pt_anything (lhs); } + else if (is_gimple_min_invariant (var)) + add_pointed_to_expr (lhs, var); else abort (); }