This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 0/3][POPCOUNT]
- From: Kugan Vivekanandarajah <kugan dot vivekanandarajah at linaro dot org>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 22 Jun 2018 19:11:30 +1000
- Subject: [PATCH 0/3][POPCOUNT]
When we set niter with maybe_zero, currently final_value_relacement
will not happen due to expression_expensive_p not handling. Patch 1
adds this.
With that we have the following optimized gimple.
<bb 2> [local count: 118111601]:
if (b_4(D) != 0)
goto <bb 3>; [89.00%]
else
goto <bb 4>; [11.00%]
<bb 3> [local count: 105119324]:
_2 = (unsigned long) b_4(D);
_9 = __builtin_popcountl (_2);
c_3 = b_4(D) != 0 ? _9 : 1;
<bb 4> [local count: 118111601]:
# c_12 = PHI <c_3(3), 0(2)>
I assume that 1 in b_4(D) != 0 ? _9 : 1; is OK (?) because when the
latch execute zero times for b_4 == 0 means that the body will execute
ones.
The issue here is, since we are checking if (b_4(D) != 0) before
entering the loop means we don't need to set maybe_zero. Patch 2
handles this.
With that we have
<bb 2> [local count: 118111601]:
if (b_4(D) != 0)
goto <bb 3>; [89.00%]
else
goto <bb 4>; [11.00%]
<bb 3> [local count: 105119324]:
_2 = (unsigned long) b_4(D);
_9 = __builtin_popcountl (_2);
<bb 4> [local count: 118111601]:
# c_12 = PHI <0(2), _9(3)>
As advised earlier, patch 3 adds phiopt support to remove this.
Bootstrap and regression testing are ongoing.
Is this OK for trunk.
Thanks,
Kugan