]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
icf: Punt for musttail call flag differences in ICF [PR119376]
authorJakub Jelinek <jakub@redhat.com>
Fri, 21 Mar 2025 11:18:35 +0000 (12:18 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 21 Mar 2025 11:18:35 +0000 (12:18 +0100)
The following testcase shows we were ignoring musttail flags on calls
when deciding if two functions are the same.
That can result in problems in both directions, either we silently
lose musttail attribute because there is a similar function without it
earlier and then we e.g. don't diagnose if it can't be tail called
or don't try harder to do a tail call, or we get it even in functions
which didn't have it before.

The following patch for now just punts if it differs.  Perhaps we could
just merge it and get musttail flag if any of the merged functions had
one in such position, but it feels to me that it is now too late in GCC 15
cycle to play with this.

2025-03-21  Jakub Jelinek  <jakub@redhat.com>

PR ipa/119376
* ipa-icf-gimple.cc (func_checker::compare_gimple_call): Return false
for gimple_call_must_tail_p mismatches.

* c-c++-common/musttail27.c: New test.

gcc/ipa-icf-gimple.cc
gcc/testsuite/c-c++-common/musttail27.c [new file with mode: 0644]

index 51ca8a3e114397b80800ef54dd432e25516c2d5b..ac169868076c17953fcb171f00411f1e56d598b5 100644 (file)
@@ -708,7 +708,8 @@ func_checker::compare_gimple_call (gcall *s1, gcall *s2)
       || gimple_call_from_thunk_p (s1) != gimple_call_from_thunk_p (s2)
       || gimple_call_from_new_or_delete (s1) != gimple_call_from_new_or_delete (s2)
       || gimple_call_va_arg_pack_p (s1) != gimple_call_va_arg_pack_p (s2)
-      || gimple_call_alloca_for_var_p (s1) != gimple_call_alloca_for_var_p (s2))
+      || gimple_call_alloca_for_var_p (s1) != gimple_call_alloca_for_var_p (s2)
+      || gimple_call_must_tail_p (s1) != gimple_call_must_tail_p (s2))
     return false;
 
   unsigned check_arg_types_from = 0;
diff --git a/gcc/testsuite/c-c++-common/musttail27.c b/gcc/testsuite/c-c++-common/musttail27.c
new file mode 100644 (file)
index 0000000..2a92bcb
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR ipa/119376 */
+/* { dg-do compile { target musttail } } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "  \[^\n\r]* = foo \\\(\[^\n\r]*\\\); \\\[tail call\\\] \\\[must tail call\\\]" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "  \[^\n\r]* = foo \\\(\[^\n\r]*\\\); \\\[tail call\\\]" 4 "optimized" } } */
+
+int foo (int);
+
+int
+bar (int x)
+{
+  [[gnu::musttail]] return foo (x + 1);
+}
+
+int
+baz (int x)
+{
+  return foo (x + 1);
+}
+
+int
+qux (int x)
+{
+  return foo (x + 2);
+}
+
+int
+corge (int x)
+{
+  [[gnu::musttail]] return foo (x + 2);
+}