https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103175

--- Comment #5 from hubicka at kam dot mff.cuni.cz ---
The sanity check verifies that functions acessing parameter indirectly
also reads the parameter (otherwise the indirect reference can not
happen).  This patch moves the check earlier and removes some overactive
flag cleaning on function call boundary which introduces the non-sential
situation.  I got bit paranoid here on how return value relates to
escaping solution.

as discussed on ML, matmul failure is simply the fact that the testcase
verified missed optimization is still misssed.

diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 72006251f29..a97021c6c60 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -1681,6 +1681,13 @@ modref_lattice::merge (int f)
 {
   if (f & EAF_UNUSED)
     return false;
+  /* Check that flags seems sane: if function does not read the parameter
+     it can not access it indirectly.  */
+  gcc_checking_assert (!(f & EAF_NO_DIRECT_READ)
+                      || ((f & EAF_NO_INDIRECT_READ)
+                          && (f & EAF_NO_INDIRECT_CLOBBER)
+                          && (f & EAF_NO_INDIRECT_ESCAPE)
+                          && (f & EAF_NOT_RETURNED_INDIRECTLY)));
   if ((flags & f) != flags)
     {
       flags &= f;
@@ -1874,27 +1881,13 @@ modref_eaf_analysis::merge_call_lhs_flags (gcall *call,
int arg,
    argument if needed.  */

 static int
-callee_to_caller_flags (int call_flags, bool ignore_stores,
-                       modref_lattice &lattice)
+callee_to_caller_flags (int call_flags, bool ignore_stores)
 {
   /* call_flags is about callee returning a value
      that is not the same as caller returning it.  */
   call_flags |= EAF_NOT_RETURNED_DIRECTLY
                | EAF_NOT_RETURNED_INDIRECTLY;
-  /* TODO: We miss return value propagation.
-     Be conservative and if value escapes to memory
-     also mark it as escaping.  */
-  if (!ignore_stores && !(call_flags & EAF_UNUSED))
-    {
-      if (!(call_flags & EAF_NO_DIRECT_ESCAPE))
-       lattice.merge (~(EAF_NOT_RETURNED_DIRECTLY
-                        | EAF_NOT_RETURNED_INDIRECTLY
-                        | EAF_UNUSED));
-      if (!(call_flags & EAF_NO_INDIRECT_ESCAPE))
-       lattice.merge (~(EAF_NOT_RETURNED_INDIRECTLY
-                        | EAF_UNUSED));
-    }
-  else
+  if (ignore_stores)
     call_flags |= ignore_stores_eaf_flags;
   return call_flags;
 }
@@ -2033,15 +2026,9 @@ modref_eaf_analysis::analyze_ssa_name (tree name)
                          if (!(call_flags & (EAF_NOT_RETURNED_DIRECTLY
                                              | EAF_UNUSED)))
                            m_lattice[index].merge (~(EAF_NO_DIRECT_ESCAPE
-                                                     | EAF_NO_INDIRECT_ESCAPE
-                                                     | EAF_UNUSED));
-                         if (!(call_flags & (EAF_NOT_RETURNED_INDIRECTLY
-                                             | EAF_UNUSED)))
-                           m_lattice[index].merge (~(EAF_NO_INDIRECT_ESCAPE
                                                      | EAF_UNUSED));
                          call_flags = callee_to_caller_flags
-                                          (call_flags, false,
-                                           m_lattice[index]);
+                                          (call_flags, false);
                        }
                      m_lattice[index].merge (call_flags);
                    }
@@ -2057,8 +2044,7 @@ modref_eaf_analysis::analyze_ssa_name (tree name)
                          !(call_flags & EAF_NOT_RETURNED_DIRECTLY),
                          !(call_flags & EAF_NOT_RETURNED_INDIRECTLY));
                  call_flags = callee_to_caller_flags
-                                  (call_flags, ignore_stores,
-                                   m_lattice[index]);
+                                  (call_flags, ignore_stores);
                  if (!(ecf_flags & (ECF_CONST | ECF_NOVOPS)))
                    m_lattice[index].merge (call_flags);
                }
@@ -2082,8 +2068,7 @@ modref_eaf_analysis::analyze_ssa_name (tree name)
                    if (!(ecf_flags & (ECF_CONST | ECF_NOVOPS)))
                      {
                        call_flags = callee_to_caller_flags
-                                        (call_flags, ignore_stores,
-                                         m_lattice[index]);
+                                        (call_flags, ignore_stores);
                        if (!record_ipa)
                          m_lattice[index].merge (call_flags);
                        else
@@ -2105,8 +2090,7 @@ modref_eaf_analysis::analyze_ssa_name (tree name)
                    else
                      {
                        call_flags = callee_to_caller_flags
-                                        (call_flags, ignore_stores,
-                                         m_lattice[index]);
+                                        (call_flags, ignore_stores);
                        if (!record_ipa)
                          m_lattice[index].merge (call_flags);
                        else

Reply via email to