Skip to content

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.

  1. 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.
  2. 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

Merge request reports