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.
This commit is contained in:
parent
34f33ea801
commit
0d19fbc7b0
2 changed files with 32 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
|
28
gcc/testsuite/gcc.c-torture/compile/pr115277.c
Normal file
28
gcc/testsuite/gcc.c-torture/compile/pr115277.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue