Commit dd747311 by Jeff Law Committed by Jeff Law

toplev.h (flag_delete_null_pointer_checks): Move from here to...

        * toplev.h (flag_delete_null_pointer_checks): Move from here to...
        * flags.h (flag_delete_null_pointer_checks): Here.
        * tree-flow.h (cprop_into_successor_phis): Add argument to prototype.
        * tree-phinodes.c (resize_phi_node): Initialize PHI_ARG_NONZERO.
        (add_phi_arg, remove_phi_arg_num): Similarly.
        * tree-ssa-copy.c (cprop_into_successor_phis): Propagate nonzero
        property into PHI nodes.
        * tree-ssa-dom.c: Remove redundant inclusion of flags.h.
        (record_equivalences_from_phis): If all PHI arguments are known to be
        nonzero, then the result must be nonzero as well.
        (cprop_into_phis): Pass nonzero_vars bitmap to cprop_into_successor_phis        (record_equivalences_from_stmt): Check flag_delete_null_pointer_checks
        appropriately.  Walk the USE-DEF chains and propagate nonzero property
        as appropriate.
        * tree.h (PHI_ARG_NONZERO): Define.
        (phi_arg_d): Add nonzero flag.

From-SVN: r81968
parent b4117c30
2004-05-17 Jeff Law <law@redhat.com>
* toplev.h (flag_delete_null_pointer_checks): Move from here to...
* flags.h (flag_delete_null_pointer_checks): Here.
* tree-flow.h (cprop_into_successor_phis): Add argument to prototype.
* tree-phinodes.c (resize_phi_node): Initialize PHI_ARG_NONZERO.
(add_phi_arg, remove_phi_arg_num): Similarly.
* tree-ssa-copy.c (cprop_into_successor_phis): Propagate nonzero
property into PHI nodes.
* tree-ssa-dom.c: Remove redundant inclusion of flags.h.
(record_equivalences_from_phis): If all PHI arguments are known to be
nonzero, then the result must be nonzero as well.
(cprop_into_phis): Pass nonzero_vars bitmap to cprop_into_successor_phis (record_equivalences_from_stmt): Check flag_delete_null_pointer_checks
appropriately. Walk the USE-DEF chains and propagate nonzero property
as appropriate.
* tree.h (PHI_ARG_NONZERO): Define.
(phi_arg_d): Add nonzero flag.
2004-05-17 Zack Weinberg <zack@codesourcery.com> 2004-05-17 Zack Weinberg <zack@codesourcery.com>
* f: Entire directory removed * f: Entire directory removed
......
...@@ -323,6 +323,10 @@ extern int flag_cse_skip_blocks; ...@@ -323,6 +323,10 @@ extern int flag_cse_skip_blocks;
perform miscellaneous relatively-expensive optimizations. */ perform miscellaneous relatively-expensive optimizations. */
extern int flag_expensive_optimizations; extern int flag_expensive_optimizations;
/* Nonzero means to use global dataflow analysis to eliminate
useless null pointer tests. */
extern int flag_delete_null_pointer_checks;
/* Nonzero means don't put addresses of constant functions in registers. /* Nonzero means don't put addresses of constant functions in registers.
Used for compiling the Unix kernel, where strange substitutions are Used for compiling the Unix kernel, where strange substitutions are
done on the assembly output. */ done on the assembly output. */
......
...@@ -113,7 +113,6 @@ extern int flag_loop_optimize; ...@@ -113,7 +113,6 @@ extern int flag_loop_optimize;
extern int flag_crossjumping; extern int flag_crossjumping;
extern int flag_if_conversion; extern int flag_if_conversion;
extern int flag_if_conversion2; extern int flag_if_conversion2;
extern int flag_delete_null_pointer_checks;
extern int flag_keep_static_consts; extern int flag_keep_static_consts;
extern int flag_peel_loops; extern int flag_peel_loops;
extern int flag_rerun_cse_after_loop; extern int flag_rerun_cse_after_loop;
......
...@@ -575,7 +575,7 @@ extern void debug_dominator_optimization_stats (void); ...@@ -575,7 +575,7 @@ extern void debug_dominator_optimization_stats (void);
extern void propagate_value (tree *, tree); extern void propagate_value (tree *, tree);
extern void replace_exp (tree *, tree); extern void replace_exp (tree *, tree);
extern bool cprop_into_stmt (tree, varray_type); extern bool cprop_into_stmt (tree, varray_type);
extern void cprop_into_successor_phis (basic_block, varray_type); extern void cprop_into_successor_phis (basic_block, varray_type, bitmap);
/* In tree-flow-inline.h */ /* In tree-flow-inline.h */
static inline int phi_arg_from_edge (tree, edge); static inline int phi_arg_from_edge (tree, edge);
......
...@@ -280,6 +280,7 @@ resize_phi_node (tree *phi, int len) ...@@ -280,6 +280,7 @@ resize_phi_node (tree *phi, int len)
{ {
PHI_ARG_DEF (new_phi, i) = NULL_TREE; PHI_ARG_DEF (new_phi, i) = NULL_TREE;
PHI_ARG_EDGE (new_phi, i) = NULL; PHI_ARG_EDGE (new_phi, i) = NULL;
PHI_ARG_NONZERO (new_phi, i) = false;
} }
*phi = new_phi; *phi = new_phi;
...@@ -366,6 +367,7 @@ add_phi_arg (tree *phi, tree def, edge e) ...@@ -366,6 +367,7 @@ add_phi_arg (tree *phi, tree def, edge e)
PHI_ARG_DEF (*phi, i) = def; PHI_ARG_DEF (*phi, i) = def;
PHI_ARG_EDGE (*phi, i) = e; PHI_ARG_EDGE (*phi, i) = e;
PHI_ARG_NONZERO (*phi, i) = false;
PHI_NUM_ARGS (*phi)++; PHI_NUM_ARGS (*phi)++;
} }
...@@ -408,11 +410,13 @@ remove_phi_arg_num (tree phi, int i) ...@@ -408,11 +410,13 @@ remove_phi_arg_num (tree phi, int i)
{ {
PHI_ARG_DEF (phi, i) = PHI_ARG_DEF (phi, num_elem - 1); PHI_ARG_DEF (phi, i) = PHI_ARG_DEF (phi, num_elem - 1);
PHI_ARG_EDGE (phi, i) = PHI_ARG_EDGE (phi, num_elem - 1); PHI_ARG_EDGE (phi, i) = PHI_ARG_EDGE (phi, num_elem - 1);
PHI_ARG_NONZERO (phi, i) = PHI_ARG_NONZERO (phi, num_elem - 1);
} }
/* Shrink the vector and return. */ /* Shrink the vector and return. */
PHI_ARG_DEF (phi, num_elem - 1) = NULL_TREE; PHI_ARG_DEF (phi, num_elem - 1) = NULL_TREE;
PHI_ARG_EDGE (phi, num_elem - 1) = NULL; PHI_ARG_EDGE (phi, num_elem - 1) = NULL;
PHI_ARG_NONZERO (phi, num_elem - 1) = false;
PHI_NUM_ARGS (phi)--; PHI_NUM_ARGS (phi)--;
/* If we removed the last PHI argument, then go ahead and /* If we removed the last PHI argument, then go ahead and
......
...@@ -40,7 +40,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -40,7 +40,6 @@ Boston, MA 02111-1307, USA. */
#include "domwalk.h" #include "domwalk.h"
#include "real.h" #include "real.h"
#include "tree-pass.h" #include "tree-pass.h"
#include "flags.h"
#include "langhooks.h" #include "langhooks.h"
/* This file implements optimizations on the dominator tree. */ /* This file implements optimizations on the dominator tree. */
...@@ -1314,7 +1313,12 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) ...@@ -1314,7 +1313,12 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
Ignoring any alternatives which are the same as the result, if Ignoring any alternatives which are the same as the result, if
all the alternatives are equal, then the PHI node creates an all the alternatives are equal, then the PHI node creates an
equivalence. */ equivalence.
Additionally, if all the PHI alternatives are known to have a nonzero
value, then the result of this PHI is known to have a nonzero value,
even if we do not know its exact value. */
static void static void
record_equivalences_from_phis (struct dom_walk_data *walk_data, basic_block bb) record_equivalences_from_phis (struct dom_walk_data *walk_data, basic_block bb)
{ {
...@@ -1367,6 +1371,17 @@ record_equivalences_from_phis (struct dom_walk_data *walk_data, basic_block bb) ...@@ -1367,6 +1371,17 @@ record_equivalences_from_phis (struct dom_walk_data *walk_data, basic_block bb)
&& may_propagate_copy (lhs, rhs)) && may_propagate_copy (lhs, rhs))
set_value_for (lhs, rhs, const_and_copies); set_value_for (lhs, rhs, const_and_copies);
/* Now see if we know anything about the nonzero property for the
result of this PHI. */
for (i = 0; i < PHI_NUM_ARGS (phi); i++)
{
if (!PHI_ARG_NONZERO (phi, i))
break;
}
if (i == PHI_NUM_ARGS (phi))
bitmap_set_bit (nonzero_vars, SSA_NAME_VERSION (PHI_RESULT (phi)));
register_new_def (lhs, &bd->block_defs); register_new_def (lhs, &bd->block_defs);
} }
} }
...@@ -2257,7 +2272,7 @@ static void ...@@ -2257,7 +2272,7 @@ static void
cprop_into_phis (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, cprop_into_phis (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
basic_block bb) basic_block bb)
{ {
cprop_into_successor_phis (bb, const_and_copies); cprop_into_successor_phis (bb, const_and_copies, nonzero_vars);
} }
/* Search for redundant computations in STMT. If any are found, then /* Search for redundant computations in STMT. If any are found, then
...@@ -2422,25 +2437,39 @@ record_equivalences_from_stmt (tree stmt, ...@@ -2422,25 +2437,39 @@ record_equivalences_from_stmt (tree stmt,
/* Look at both sides for pointer dereferences. If we find one, then /* Look at both sides for pointer dereferences. If we find one, then
the pointer must be nonnull and we can enter that equivalence into the pointer must be nonnull and we can enter that equivalence into
the hash tables. */ the hash tables. */
for (i = 0; i < 2; i++) if (flag_delete_null_pointer_checks)
{ for (i = 0; i < 2; i++)
tree t = TREE_OPERAND (stmt, i); {
tree t = TREE_OPERAND (stmt, i);
/* Strip away any COMPONENT_REFs. */
while (TREE_CODE (t) == COMPONENT_REF) /* Strip away any COMPONENT_REFs. */
t = TREE_OPERAND (t, 0); while (TREE_CODE (t) == COMPONENT_REF)
t = TREE_OPERAND (t, 0);
/* Now see if this is a pointer dereference. */
if (TREE_CODE (t) == INDIRECT_REF) /* Now see if this is a pointer dereference. */
{ if (TREE_CODE (t) == INDIRECT_REF)
tree op = TREE_OPERAND (t, 0); {
tree op = TREE_OPERAND (t, 0);
/* If the pointer is a SSA variable, then enter new
equivalences into the hash table. */ /* If the pointer is a SSA variable, then enter new
if (TREE_CODE (op) == SSA_NAME) equivalences into the hash table. */
record_var_is_nonzero (op, block_nonzero_vars_p); while (TREE_CODE (op) == SSA_NAME)
} {
} tree def = SSA_NAME_DEF_STMT (op);
record_var_is_nonzero (op, block_nonzero_vars_p);
/* And walk up the USE-DEF chains noting other SSA_NAMEs
which are known to have a nonzero value. */
if (def
&& TREE_CODE (def) == MODIFY_EXPR
&& TREE_CODE (TREE_OPERAND (def, 1)) == NOP_EXPR)
op = TREE_OPERAND (TREE_OPERAND (def, 1), 0);
else
break;
}
}
}
/* A memory store, even an aliased store, creates a useful /* A memory store, even an aliased store, creates a useful
equivalence. By exchanging the LHS and RHS, creating suitable equivalence. By exchanging the LHS and RHS, creating suitable
......
...@@ -1203,6 +1203,7 @@ struct tree_ssa_name GTY(()) ...@@ -1203,6 +1203,7 @@ struct tree_ssa_name GTY(())
#define PHI_ARG_ELT(NODE, I) PHI_NODE_ELT_CHECK (NODE, I) #define PHI_ARG_ELT(NODE, I) PHI_NODE_ELT_CHECK (NODE, I)
#define PHI_ARG_EDGE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).e #define PHI_ARG_EDGE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).e
#define PHI_ARG_DEF(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).def #define PHI_ARG_DEF(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).def
#define PHI_ARG_NONZERO(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).nonzero
struct edge_def; struct edge_def;
...@@ -1210,6 +1211,7 @@ struct phi_arg_d GTY(()) ...@@ -1210,6 +1211,7 @@ struct phi_arg_d GTY(())
{ {
tree def; tree def;
struct edge_def * GTY((skip (""))) e; struct edge_def * GTY((skip (""))) e;
bool nonzero;
}; };
struct tree_phi_node GTY(()) struct tree_phi_node GTY(())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment