I have followup patches that add new conditions to store::eval_alias.
Rather than duplicate all conditions for symmetry, split it up and
call it on both (A, B) and (B, A).

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as c199723d7ed0032db095abc75b82a9710eaa5e56.

gcc/analyzer/ChangeLog:
        * store.cc (store::eval_alias): Make const.  Split out 2nd half
        into store::eval_alias_1 and call it twice for symmetry, avoiding
        test duplication.
        (store::eval_alias_1): New function, split out from the above.
        * store.h (store::eval_alias): Make const.
        (store::eval_alias_1): New decl.
---
 gcc/analyzer/store.cc | 45 +++++++++++++++++++++++--------------------
 gcc/analyzer/store.h  |  4 +++-
 2 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/gcc/analyzer/store.cc b/gcc/analyzer/store.cc
index d854f4e504a..298088f6ef9 100644
--- a/gcc/analyzer/store.cc
+++ b/gcc/analyzer/store.cc
@@ -1544,7 +1544,7 @@ store::set_value (store_manager *mgr, const region 
*lhs_reg,
 
 tristate
 store::eval_alias (const region *base_reg_a,
-                  const region *base_reg_b)
+                  const region *base_reg_b) const
 {
   /* SSA names can't alias.  */
   tree decl_a = base_reg_a->maybe_get_decl ();
@@ -1554,31 +1554,34 @@ store::eval_alias (const region *base_reg_a,
   if (decl_b && TREE_CODE (decl_b) == SSA_NAME)
     return tristate::TS_FALSE;
 
+  /* Try both ways, for symmetry.  */
+  tristate ts_ab = eval_alias_1 (base_reg_a, base_reg_b);
+  if (ts_ab.is_false ())
+    return tristate::TS_FALSE;
+  tristate ts_ba = eval_alias_1 (base_reg_b, base_reg_a);
+  if (ts_ba.is_false ())
+    return tristate::TS_FALSE;
+  return tristate::TS_UNKNOWN;
+}
+
+/* Half of store::eval_alias; called twice for symmetry.  */
+
+tristate
+store::eval_alias_1 (const region *base_reg_a,
+                    const region *base_reg_b) const
+{
   if (const symbolic_region *sym_reg_a
       = base_reg_a->dyn_cast_symbolic_region ())
     {
       const svalue *sval_a = sym_reg_a->get_pointer ();
-      if (sval_a->get_kind () == SK_INITIAL
-         && decl_b
-         && !is_global_var (decl_b))
-       {
-         /* The initial value of a pointer can't point to a local.  */
-         return tristate::TS_FALSE;
-       }
-    }
-  if (const symbolic_region *sym_reg_b
-      = base_reg_b->dyn_cast_symbolic_region ())
-    {
-      const svalue *sval_b = sym_reg_b->get_pointer ();
-      if (sval_b->get_kind () == SK_INITIAL
-         && decl_a
-         && !is_global_var (decl_a))
-       {
-         /* The initial value of a pointer can't point to a local.  */
-         return tristate::TS_FALSE;
-       }
+      if (sval_a->get_kind () == SK_INITIAL)
+       if (tree decl_b = base_reg_b->maybe_get_decl ())
+         if (!is_global_var (decl_b))
+           {
+             /* The initial value of a pointer can't point to a local.  */
+             return tristate::TS_FALSE;
+           }
     }
-
   return tristate::TS_UNKNOWN;
 }
 
diff --git a/gcc/analyzer/store.h b/gcc/analyzer/store.h
index bc9dc2e0b5c..636a9547f2c 100644
--- a/gcc/analyzer/store.h
+++ b/gcc/analyzer/store.h
@@ -553,7 +553,7 @@ public:
   cluster_map_t::iterator end () const { return m_cluster_map.end (); }
 
   tristate eval_alias (const region *base_reg_a,
-                      const region *base_reg_b);
+                      const region *base_reg_b) const;
 
   template <typename BindingVisitor>
   void for_each_binding (BindingVisitor &v)
@@ -569,6 +569,8 @@ public:
 
 private:
   void remove_overlapping_bindings (store_manager *mgr, const region *reg);
+  tristate eval_alias_1 (const region *base_reg_a,
+                        const region *base_reg_b) const;
 
   cluster_map_t m_cluster_map;
 
-- 
2.26.2

Reply via email to