]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa/123416 - fix IPA modref summary merging after inlining
authorRichard Biener <rguenther@suse.de>
Tue, 3 Feb 2026 08:26:01 +0000 (09:26 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 3 Feb 2026 09:43:04 +0000 (10:43 +0100)
There's a typo in the condition skipping load collapsing when
there's no callee modref summary.  We do have to collapse loads
for the destination iff the callee performs any loads which includes
when the callee is ECF_PURE.  The LTO summary part already gets
this correct.

PR ipa/123416
* ipa-modref.cc (ipa_merge_modref_summary_after_inlining):
Fix typo in condtion for load merging when no callee summary.

* gcc.dg/torture/pr123416.c: New testcase.

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

index 372f73543617e85364cde86afad96822e1784944..fc00acecfce7fd7ed31d2ffddca2479215ac2c13 100644 (file)
@@ -5352,7 +5352,7 @@ ipa_merge_modref_summary_after_inlining (cgraph_edge *edge)
 
   if (!callee_info && to_info)
     {
-      if (!(flags & (ECF_CONST | ECF_PURE | ECF_NOVOPS)))
+      if (!(flags & (ECF_CONST | ECF_NOVOPS)))
        to_info->loads->collapse ();
       if (!ignore_stores)
        to_info->stores->collapse ();
diff --git a/gcc/testsuite/gcc.dg/torture/pr123416.c b/gcc/testsuite/gcc.dg/torture/pr123416.c
new file mode 100644 (file)
index 0000000..83a126d
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fno-strict-aliasing" } */
+
+struct a {
+  int b;
+} c;
+
+int d;
+
+static struct a
+g()
+{
+  int a[2], b, f = 0;
+  for (; f < 2; f++)
+    a[f] = 1;
+  b = a[0];
+  if (b)
+    return c;
+}
+int main()
+{
+  c.b = 1;
+  struct a e = g();
+  c = g();
+  if (!c.b || !e.b)
+    __builtin_abort();
+  return 0;
+}