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.

(cherry picked from commit 0d19fbc7b0760ce665fa6a88cd40cfa0311358d7)
This commit is contained in:
Jan Hubicka 2024-07-22 18:01:57 +02:00
parent 9a7d668fc5
commit c5397d343f
2 changed files with 32 additions and 0 deletions

View file

@ -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;
}

View file

@ -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;
}