On 02/19/2016 03:03 PM, Bernd Schmidt wrote:
In this PR, we generate unnecessarily bad code for code that declares a
global register var. Since global regs get added to fixed_regs, IRA
never considers them as candidates. However, we do seem to have proper
data flow information for them. In the testcase, the global reg dies,
some operations are done on temporary results, and the final result
stored back in the global reg. We can achieve the desired code
generation by reusing the global reg for those temporaries.

Bootstrapped and tested on x86_64-linux. Ok? An argument could be made
not to use this for gcc-6 since global register vars are both not very
important and not very well represented in the testsuite.


Bernd

global-regalloc.diff


        PR rtl-optimization/44281
        * hard-reg-set.h (struct target_hard_regs): New field
        x_fixed_nonglobal_reg_set.
        (fixed_nonglobal_reg_set): New macro.
        * reginfo.c (init_reg_sets_1): Initialize it.
        * ira.c (setup_alloc_regs): Use fixed_nonglobal_reg_set instead
        of fixed_reg_set.

        PR rtl-optimization/44281
        * gcc.target/i386/pr44281.c: New test.
It sounds like Richi wants to table this to gcc-7, which I can understand. So I'm not going to dig into the patch itself, just touch on the high level stuff.

Global register variables are currently documented as "The register is reserved entirely for this use, and will not be allocated for any other purpose". That would need to be fixed.

When David W. and I were working through the docs on this stuff in 2015, I don't think that either of us considered the possibility that the register could be used for temporaries between a use of the global register var (where it dies) and an assignment to the global register var (rebirth).

As long as our dataflow is good, using the global register var for a temporary in that window seems like a useful thing to do. So I think the biggest concern would be any kind of implicit use. I'm thinking of function calls where the callee expects the global register var to have the right value, perhaps asms as well (someone might reference the global var in the asm, but not list it in the sets/uses/clobbers because it wasn't really necessary in the past).

Thoughts?

jeff


Reply via email to