diff mbox series

Compare loop bounds in ipa-icf

Message ID Zp6E-zlzX9hNRYIZ@kam.mff.cuni.cz
State New
Headers show
Series Compare loop bounds in ipa-icf | expand

Commit Message

Jan Hubicka July 22, 2024, 4:12 p.m. UTC
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, comitted. Will backport it to gcc14.

gcc/ChangeLog:

	PR ipa/115277
	* ipa-icf-gimple.cc (func_checker::compare_loops):

gcc/testsuite/ChangeLog:

	* gcc.c-torture/compile/pr115277.c: New test.

Comments

Marek Polacek July 22, 2024, 4:22 p.m. UTC | #1
On Mon, Jul 22, 2024 at 06:12:43PM +0200, Jan Hubicka wrote:
> 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, comitted. Will backport it to gcc14.
> 
> gcc/ChangeLog:
> 
> 	PR ipa/115277
> 	* ipa-icf-gimple.cc (func_checker::compare_loops):

CL entry missing here. 

Marek
diff mbox series

Patch

diff --git a/gcc/ipa-icf-gimple.cc b/gcc/ipa-icf-gimple.cc
index c25eb24710f..4c3174b68b6 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 00000000000..27449eb254f
--- /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;
+}