Enhance final_value_replacement_loop to handle bitwise induction.
This patch will enable below optimization:
{
- int bit;
- long long unsigned int _1;
- long long unsigned int _2;
-
<bb 2> [local count:
46707768]:
-
- <bb 3> [local count:
1027034057]:
- # tmp_11 = PHI <tmp_8(3), tmp_6(D)(2)>
- # bit_13 = PHI <bit_9(3), 63(2)>
- _1 = 1 << bit_13;
- _2 = ~_1;
- tmp_8 = _2 & tmp_11;
- bit_9 = bit_13 + -3;
- if (bit_9 != -3(OVF))
- goto <bb 3>; [95.65%]
- else
- goto <bb 4>; [4.35%]
-
- <bb 4> [local count:
46707768]:
- return tmp_8;
+ tmp_12 = tmp_6(D) &
7905747460161236406;
+ return tmp_12;
}
gcc/ChangeLog:
PR middle-end/103462
* match.pd (bitwise_induction_p): New match.
* tree-scalar-evolution.cc (gimple_bitwise_induction_p):
Declare.
(analyze_and_compute_bitwise_induction_effect): New function.
(enum bit_op_kind): New enum.
(final_value_replacement_loop): Enhanced to handle bitwise
induction.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr103462-1.c: New test.
* gcc.target/i386/pr103462-2.c: New test.
* gcc.target/i386/pr103462-3.c: New test.
* gcc.target/i386/pr103462-4.c: New test.
* gcc.target/i386/pr103462-5.c: New test.
* gcc.target/i386/pr103462-6.c: New test.