[PATCH] New and semi-improved PHI-OPT
Andrew Pinski
pinskia@physics.uc.edu
Sun Mar 6 20:29:00 GMT 2005
On Mar 6, 2005, at 3:11 PM, Kazu Hirata wrote:
> Hi Andrew and Richard,
>
>>> This is port of the PHI-OPT from the tree cleanup branch. The
>>> original
>>> patch
>>> was posted here:
>>> http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02959.html> which
>>> describes what the patch does.
>>>
>>> OK? Bootstrapped and tested on powerpc-darwin with no regressions.
>>
>> Do you have some numbers on the compile-time and memory-usage
>> impact vs. performance benefit of this patch?
>
> In particular, it would be interesting to see how many more
> opportunities we catch at tree level and how much work we take away
> from ifcvt at the RTL level.
Also note both the old algorithm and this one is still O(n), the n
changed
from the number of BBs with one PHIs to the number of BBs that end in a
conditional. Also one more thing the following code we get better code
than before (this shows up in PR8361 for an example):
_Bool f1(_Bool a, _Bool b)
{
if (a)
{
if (b)
return 1;
else
return 0;
}
return 0;
}
Before (PPC):
_f1:
cmpwi cr7,r3,0
cmpwi cr6,r4,0
li r3,1
beq- cr7,L2
bnelr+ cr6
L2:
li r3,0
blr
After:
_f1:
cmpwi cr7,r3,0
li r3,0
beqlr- cr7
addic r0,r4,-1
subfe r3,r0,r4
blr
Notice how it is smaller code and one less branch so it will be faster.
> + for (i = 0;i < PHI_NUM_ARGS (phi); i++)
> + {
> + if (PHI_ARG_EDGE (phi, i) == e1)
> + arg0 = PHI_ARG_DEF_TREE (phi, i);
> + else if (PHI_ARG_EDGE (phi, i) == e2)
> + arg1 = PHI_ARG_DEF_TREE (phi, i);
> + }
>
> This loop can collapse to
>
> arg0 = PHI_ARG_DEF (phi, e1->dest_idx);
> arg1 = PHI_ARG_DEF (phi, e2->dest_idx);
Woops, I had forgot about that, well that is because this changed
after I wrote the code and it is not really written up anywhere.
More information about the Gcc-patches
mailing list