Combine four insns
Bernd Schmidt
bernds@codesourcery.com
Tue Aug 10 14:37:00 GMT 2010
>> $ grep Trying.four log |wc -l
>> 307743
>> $ grep Trying.three log |wc -l
>> 592776
>> $ grep Trying.two log |wc -l
>> 1643112
>> $ grep Succeeded.two log |wc -l
>> 204808
>> $ grep Succeeded.three.into.two log |wc -l
>> 2976
>> $ grep Succeeded.three.into.one log |wc -l
>> 12473
>> $ grep Succeeded.four.into.two log |wc -l
>> 244
>> $ grep Succeeded.four.into.one log |wc -l
>> 140
>
> No four into three? So overall it's one order of magnitude less
> three than two and two order of magnitude less four than three.
I redid the numbers for Thumb-1, over the same set of input files. I
left out the two-insn combinations because the greps take ages and the
comparison 3 vs 4 should provide enough information.
$ grep Trying.three log |wc -l
842213
$ grep Trying.four log |wc -l
488682
$ grep Succeeded.four.to.two log|wc -l
759
$ grep Succeeded.four.to.one log|wc -l
163
$ grep Succeeded.three.to.two log|wc -l
6230
$ grep Succeeded.three.to.one log|wc -l
3178
So the patch seems somewhat more effective for this target
(unsurprisingly as it has simpler instructions).
With the following heuristic in try_combine:
if (i0)
{
int i;
int ncst = 0;
int nshift = 0;
for (i = 0; i < 3; i++)
{
rtx insn = i == 0 ? i0 : i == 1 ? i1 : i2;
rtx set = single_set (insn);
if (set && CONSTANT_P (SET_SRC (set)))
ncst++;
else if (set && (GET_CODE (SET_SRC (set)) == ASHIFT
|| GET_CODE (SET_SRC (set)) == ASHIFTRT
|| GET_CODE (SET_SRC (set)) == LSHIFTRT))
nshift++;
}
if (ncst == 0 && nshift < 2)
return 0;
}
$ grep Trying.four log2 |wc -l
187120
$ grep Succeeded.four log2|wc -l
828
$ grep Succeeded.three.to.one log2|wc -l
3161
$ grep Succeeded.three.to.two log2|wc -l
6218
With the heuristic, we still catch the majority of interesting cases on
Thumb-1, with a reduced number of attempts, but we also miss some
optimizations like these:
- add r2, r2, #1
lsl r2, r2, #5
- add r3, r3, r2
- sub r3, r3, #32
+ add r3, r2, r3
====
- mvn r3, r3
lsr r3, r3, #16
- mvn r3, r3
====
In summary, should I check in the patch with the above heuristic?
Bernd
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: combine4d.diff
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100810/dfef500b/attachment.ksh>
More information about the Gcc-patches
mailing list