x86: Add a fake SSE register for ix86_gen_scratch_sse_rtx
ix86_gen_scratch_sse_rtx returns XMM7/XMM15/XMM31 as a scratch vector register to prevent RTL optimizers from removing vector register. It introduces a conflict with explicit XMM7/XMM15/XMM31 usage and when it is called by RTL optimizers, it may introduce conflicting usages of XMM7/XMM15/XMM31.
- Add a fake SSE register, xmm_scratch (XMM_SCRATCH_REG). It is only used by ix86_gen_scratch_sse_rtx to return a scratch SSE register during gimple to RTL expansion.
- Add a pass to convert xmm_scratch to pseudo register before IRA.
gcc/
PR target/104704
* config/i386/i386-features.cc (ix86_find_xmm_scratch): New.
(ix86_replace_xmm_scratch): Likewise.
(convert_xmm_scratch): Likewise.
(pass_data_convert_xmm_scratch): Likewise.
(pass_convert_xmm_scratch): Likewise.
(make_pass_convert_xmm_scratch ): Likewise.
* config/i386/i386-passes.def: Insert pass_convert_xmm_scratch
before pass_ira.
* config/i386/i386-protos.h (make_pass_convert_xmm_scratch): New.
* config/i386/i386.cc (regclass_map): Add XMM_SCRATCH_REG.
(dbx_register_map): Likewise.
(dbx64_register_map): Likewise.
(svr4_dbx_register_map): Likewise.
(zero_call_used_regno_p): Return false for XMM_SCRATCH_REG.
(ix86_hard_regno_call_part_clobbered): Return false for
XMM_SCRATCH_REG.
(ix86_gen_scratch_sse_rtx): Check currently_expanding_gimple_stmt
instead of !lra_in_progress. Use XMM_SCRATCH_REG and set
xmm_scratch_used.
* config/i386/i386.h (FIXED_REGISTERS): Add XMM_SCRATCH_REG.
(CALL_USED_REGISTERS): Likewise.
(REG_ALLOC_ORDER): Likewise.
(HI_REGISTER_NAMES): Likewise.
(SSE_REGNO_P): Allow XMM_SCRATCH_REG.
(machine_function): Add xmm_scratch_used.
* config/i386/i386.md (XMM_SCRATCH_REG): New.
(FIRST_PSEUDO_REG): Increment by 1.
gcc/testsuite/
PR target/104704
* gcc.target/i386/pieces-memset-21.c: Always expect vzeroupper.
* gcc.target/i386/pr82941-1.c: Likewise.
* gcc.target/i386/pr82942-1.c: Likewise.
* gcc.target/i386/pr82990-1.c: Likewise.
* gcc.target/i386/pr82990-3.c: Likewise.
* gcc.target/i386/pr82990-5.c: Likewise.
* gcc.target/i386/pr100865-11b.c: Expect vmovdqa instead of
vmovdqa64.
* gcc.target/i386/pr100865-12b.c: Likewise.
* gcc.target/i386/pr100865-8b.c: Likewise.
* gcc.target/i386/pr100865-9b.c: Likewise.
* gcc.target/i386/pr104704-1.c: New test.
* gcc.target/i386/pr104704-2.c: Likewise.
* gcc.target/i386/pr104704-3.c: Likewise.
* gcc.target/i386/pr104704-4.c: Likewise.
* gcc.target/i386/pr104704-5.c: Likewise.
* gcc.target/i386/pr104704-6.c: Likewise.
Edited by H.J. Lu