aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dse.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2021-11-14 12:01:41 +0100
committerJan Hubicka <jh@suse.cz>2021-11-14 12:01:41 +0100
commita29174904bb1b005e16bd9d498b2aa380b6999f8 (patch)
tree48361c572baa32880b4f5905f5da52495b53a90e /gcc/tree-ssa-dse.c
parenta8029add3065e4abb5dbaa92ce3f1b307f3e16ef (diff)
downloadgcc-a29174904bb1b005e16bd9d498b2aa380b6999f8.zip
gcc-a29174904bb1b005e16bd9d498b2aa380b6999f8.tar.gz
gcc-a29174904bb1b005e16bd9d498b2aa380b6999f8.tar.bz2
Cleanup tree-ssa-alias and tree-ssa-dse use of modref summary
Move code getting tree op from access_node and stmt to a common place. I also commonized logic to build ao_ref. While I was on it I also replaced FOR_EACH_* by range for since they reads better. gcc/ChangeLog: 2021-11-14 Jan Hubicka <hubicka@ucw.cz> * ipa-modref-tree.c (modref_access_node::get_call_arg): New member function. (modref_access_node::get_ao_ref): Likewise. * ipa-modref-tree.h (modref_access_node::get_call_arg): Declare. (modref_access_node::get_ao_ref): Declare. * tree-ssa-alias.c (modref_may_conflict): Use new accessors. * tree-ssa-dse.c (dse_optimize_call): Use new accessors. gcc/testsuite/ChangeLog: 2021-11-14 Jan Hubicka <hubicka@ucw.cz> * c-c++-common/asan/null-deref-1.c: Update template. * c-c++-common/tsan/free_race.c: Update template. * c-c++-common/tsan/free_race2.c: Update template. * gcc.dg/ipa/ipa-sra-4.c: Update template.
Diffstat (limited to 'gcc/tree-ssa-dse.c')
-rw-r--r--gcc/tree-ssa-dse.c32
1 files changed, 11 insertions, 21 deletions
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index 0e8c4ed..ce0083a 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -1079,35 +1079,25 @@ dse_optimize_call (gimple_stmt_iterator *gsi, sbitmap live_bytes)
if (!summary || !summary->try_dse)
return false;
- modref_base_node <alias_set_type> *base_node;
- modref_ref_node <alias_set_type> *ref_node;
- modref_access_node *access_node;
- size_t i, j, k;
bool by_clobber_p = false;
/* Walk all memory writes and verify that they are dead. */
- FOR_EACH_VEC_SAFE_ELT (summary->stores->bases, i, base_node)
- FOR_EACH_VEC_SAFE_ELT (base_node->refs, j, ref_node)
- FOR_EACH_VEC_SAFE_ELT (ref_node->accesses, k, access_node)
+ for (auto base_node : summary->stores->bases)
+ for (auto ref_node : base_node->refs)
+ for (auto access_node : ref_node->accesses)
{
- gcc_checking_assert (access_node->parm_offset_known);
+ tree arg = access_node.get_call_arg (stmt);
- tree arg;
- if (access_node->parm_index == MODREF_STATIC_CHAIN_PARM)
- arg = gimple_call_chain (stmt);
- else
- arg = gimple_call_arg (stmt, access_node->parm_index);
+ if (!arg)
+ return false;
+
+ if (integer_zerop (arg) && flag_delete_null_pointer_checks)
+ continue;
ao_ref ref;
- poly_offset_int off = (poly_offset_int)access_node->offset
- + ((poly_offset_int)access_node->parm_offset
- << LOG2_BITS_PER_UNIT);
- poly_int64 off2;
- if (!off.to_shwi (&off2))
+
+ if (!access_node.get_ao_ref (stmt, &ref))
return false;
- ao_ref_init_from_ptr_and_range
- (&ref, arg, true, off2, access_node->size,
- access_node->max_size);
ref.ref_alias_set = ref_node->ref;
ref.base_alias_set = base_node->base;