]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix small thinko in IPA mod/ref pass
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 20 Sep 2024 10:32:13 +0000 (12:32 +0200)
committerEric Botcazou <ebotcazou@adacore.com>
Fri, 20 Sep 2024 12:15:23 +0000 (14:15 +0200)
When a memory copy operation is analyzed by analyze_ssa_name, if both the
load and store are made through the same SSA name, the store is overlooked.

gcc/
* ipa-modref.cc (modref_eaf_analysis::analyze_ssa_name): Always
process both the load and the store of a memory copy operation.

gcc/testsuite/
* gcc.dg/ipa/modref-4.c: New test.

gcc/ipa-modref.cc
gcc/testsuite/gcc.dg/ipa/modref-4.c [new file with mode: 0644]

index 10344fbb4b5868533302b8c93ab204cb73076802..ccf788e6398c0c47e3b04c26adebe90ae885ff71 100644 (file)
@@ -2604,8 +2604,9 @@ modref_eaf_analysis::analyze_ssa_name (tree name, bool deferred)
                 is used arbitrarily.  */
              if (memory_access_to (gimple_assign_rhs1 (assign), name))
                m_lattice[index].merge (deref_flags (0, false));
+
              /* Handle *name = *exp.  */
-             else if (memory_access_to (gimple_assign_lhs (assign), name))
+             if (memory_access_to (gimple_assign_lhs (assign), name))
                m_lattice[index].merge_direct_store ();
            }
          /* Handle lhs = *name.  */
diff --git a/gcc/testsuite/gcc.dg/ipa/modref-4.c b/gcc/testsuite/gcc.dg/ipa/modref-4.c
new file mode 100644 (file)
index 0000000..71ed1ca
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-options "-O"  } */
+/* { dg-do run } */
+
+static __attribute__((noipa)) int foo (void)
+{
+  return 1;
+}
+
+int main (void)
+{
+  struct S { int a; int b; };
+  struct T { struct S s; };
+
+  struct T t = { { 0, 0 } };
+  struct T u;
+
+  __attribute__((noinline)) void bar (void)
+  {
+    if (foo ())
+      {
+       u = t;
+        /* OK with u.s.a = 0; */
+      }
+  }
+
+  u.s.a = 1;
+
+  bar ();
+
+  if (u.s.a != 0)
+    __builtin_abort ();
+
+  return 0;
+}