On 07/08/2011 11:05 AM, Dimitrios Apostolou wrote:
On Fri, 8 Jul 2011, Jakub Jelinek wrote:
On Fri, Jul 08, 2011 at 06:20:04AM +0300, Dimitrios Apostolou wrote:
The attached patch does two things for df_get_call_refs():
* First it uses HARD_REG_SETs for defs_generated and
regs_invalidated_by_call, instead of bitmaps. Replacing in total
more than 400K calls (for my testcase) to bitmap_bit_p() with the
much faster TEST_HARD_REG_BIT, reduces the total instruction count
from about 13M to 1.5M.

Have you verified that collection_rec->def_vec never contains pseudo
register references? Otherwise you couldn't use
HARD_REG_SET... gcc_checking_assert might be useful.


Hi Jakub, Steve pointed me to the following from GCC Internals Manual:

call_insn insns have the same extra fields as insn insns, accessed in
the same way and in addition contain a field CALL_INSN_FUNCTION_USAGE,
which contains a list (chain of expr_list expressions) containing use
and clobber expressions that denote hard registers and MEMs used or
clobbered by the called function.

So doesn't that mean that for CALL insns it should contain only HARD_REG
DEFs? I will ofcourse use an assert to be sure.

That part is only for CALL_INSN_FUNCTION_USAGE, which is what df_get_call_refs handles. However, if you rewrite the handling of defs_generated as required by your second patch, you'll then be sure that you will only have hard registers.

BTW, what testcase are you using? I suggest that you try building stage1 with CFLAGS=--save-temps, and get some of the largest preprocessed .i files from there (combine and fold-const for example). You can then time them very easily from the old and new build directories, with "./cc1 /path/to/file.i -O2".

Paolo

Reply via email to