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.
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 ();
--- /dev/null
+/* { 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;
+}