continue;
sem_item *source = c->members[0];
+ bool this_merged_p = false;
if (DECL_NAME (source->decl)
&& MAIN_NAME_P (DECL_NAME (source->decl)))
if (dbg_cnt (merged_ipa_icf))
{
bool merged = source->merge (alias);
- merged_p |= merged;
+ this_merged_p |= merged;
if (merged && alias->type == VAR)
{
}
}
}
+
+ merged_p |= this_merged_p;
+ if (this_merged_p
+ && source->type == FUNC
+ && (!flag_wpa || flag_checking))
+ {
+ unsigned i;
+ tree name;
+ FOR_EACH_SSA_NAME (i, name, DECL_STRUCT_FUNCTION (source->decl))
+ {
+ /* We need to either merge or reset SSA_NAME_*_INFO.
+ For merging we don't preserve the mapping between
+ original and alias SSA_NAMEs from successful equals
+ calls. */
+ if (POINTER_TYPE_P (TREE_TYPE (name)))
+ {
+ if (SSA_NAME_PTR_INFO (name))
+ {
+ gcc_checking_assert (!flag_wpa);
+ SSA_NAME_PTR_INFO (name) = NULL;
+ }
+ }
+ else if (SSA_NAME_RANGE_INFO (name))
+ {
+ gcc_checking_assert (!flag_wpa);
+ SSA_NAME_RANGE_INFO (name) = NULL;
+ }
+ }
+ }
}
if (!m_merged_variables.is_empty ())
--- /dev/null
+/* PR middle-end/113907 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-minline-all-stringops" { target i?86-*-* x86_64-*-* } } */
+
+static inline int
+foo (int len, void *indata, void *outdata)
+{
+ if (len < 0 || (len & 7) != 0)
+ return 0;
+ if (len != 0 && indata != outdata)
+ __builtin_memcpy (outdata, indata, len);
+ return len;
+}
+
+static inline int
+bar (int len, void *indata, void *outdata)
+{
+ if (len < 0 || (len & 1) != 0)
+ return 0;
+ if (len != 0 && indata != outdata)
+ __builtin_memcpy (outdata, indata, len);
+ return len;
+}
+
+int (*volatile p1) (int, void *, void *) = foo;
+int (*volatile p2) (int, void *, void *) = bar;
+
+__attribute__((noipa)) int
+baz (int len, void *indata, void *outdata)
+{
+ if ((len & 6) != 0)
+ bar (len, indata, outdata);
+ else
+ foo (len, indata, outdata);
+}
+
+struct S { char buf[64]; } s __attribute__((aligned (8)));
+
+int
+main ()
+{
+ for (int i = 0; i < 64; ++i)
+ s.buf[i] = ' ' + i;
+ p2 (2, s.buf, s.buf + 33);
+ for (int i = 0; i < 64; ++i)
+ if (s.buf[i] != ' ' + ((i >= 33 && i < 35) ? i - 33 : i))
+ __builtin_abort ();
+}