aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2024-07-22 18:01:57 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-07-28 19:05:45 +0200
commit0b5b178caea0417ff23d0609b1416e3f3e4f6689 (patch)
treec508d126b62a5296b2b9b092824ca886cf5aab39 /gcc
parent082e0faa06b32f765cceb989453d7736ddaee878 (diff)
downloadgcc-0b5b178caea0417ff23d0609b1416e3f3e4f6689.zip
gcc-0b5b178caea0417ff23d0609b1416e3f3e4f6689.tar.gz
gcc-0b5b178caea0417ff23d0609b1416e3f3e4f6689.tar.bz2
Compare loop bounds in ipa-icf
Hi, this testcase shows another poblem with missing comparators for metadata in ICF. With value ranges available to loop optimizations during early opts we can estimate number of iterations based on guarding condition that can be split away by the fnsplit pass. This patch disables ICF when number of iteraitons does not match. Bootstrapped/regtesed x86_64-linux, will commit it shortly gcc/ChangeLog: PR ipa/115277 * ipa-icf-gimple.cc (func_checker::compare_loops): compare loop bounds. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/pr115277.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-icf-gimple.cc4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr115277.c28
2 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ipa-icf-gimple.cc b/gcc/ipa-icf-gimple.cc
index c25eb24..4c3174b 100644
--- a/gcc/ipa-icf-gimple.cc
+++ b/gcc/ipa-icf-gimple.cc
@@ -543,6 +543,10 @@ func_checker::compare_loops (basic_block bb1, basic_block bb2)
return return_false_with_msg ("unroll");
if (!compare_variable_decl (l1->simduid, l2->simduid))
return return_false_with_msg ("simduid");
+ if ((l1->any_upper_bound != l2->any_upper_bound)
+ || (l1->any_upper_bound
+ && (l1->nb_iterations_upper_bound != l2->nb_iterations_upper_bound)))
+ return return_false_with_msg ("nb_iterations_upper_bound");
return true;
}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr115277.c b/gcc/testsuite/gcc.c-torture/compile/pr115277.c
new file mode 100644
index 0000000..27449eb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr115277.c
@@ -0,0 +1,28 @@
+int array[1000];
+void
+test (int a)
+{
+ if (__builtin_expect (a > 3, 1))
+ return;
+ for (int i = 0; i < a; i++)
+ array[i]=i;
+}
+void
+test2 (int a)
+{
+ if (__builtin_expect (a > 10, 1))
+ return;
+ for (int i = 0; i < a; i++)
+ array[i]=i;
+}
+int
+main()
+{
+ test(1);
+ test(2);
+ test(3);
+ test2(10);
+ if (array[9] != 9)
+ __builtin_abort ();
+ return 0;
+}