This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Question on TARGET_MMX and X86_TUNE_GENERAL_REGS_SSE_SPILL
- From: Uros Bizjak <ubizjak at gmail dot com>
- To: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- Cc: "Kumar, Venkataramanan" <Venkataramanan dot Kumar at amd dot com>, "vmakarov at redhat dot com" <vmakarov at redhat dot com>, "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Wed, 27 Apr 2016 16:39:07 +0200
- Subject: Re: Question on TARGET_MMX and X86_TUNE_GENERAL_REGS_SSE_SPILL
- Authentication-results: sourceware.org; auth=none
- References: <CY1PR1201MB10983163705189636C9C66828F970 at CY1PR1201MB1098 dot namprd12 dot prod dot outlook dot com> <CAMbmDYbfub0Uu99Aj2V=V+UGED044GXcwOCeprzJyj3Djsvdqg at mail dot gmail dot com> <CY1PR1201MB1098CEA365D982D0E24653468F640 at CY1PR1201MB1098 dot namprd12 dot prod dot outlook dot com> <CAMbmDYZ2wgGTHuFDOHZdGMXmHMDwnvv0NzJHRXTTkpoyTWf5hA at mail dot gmail dot com> <CY1PR1201MB109891C41F233F29DBA06D558F640 at CY1PR1201MB1098 dot namprd12 dot prod dot outlook dot com> <CAMbmDYZtw2ZTMJpH=sJ16fMiJ_h2iw9FWJ9KYZSkd614=DmkhQ at mail dot gmail dot com>
On Wed, Apr 27, 2016 at 4:26 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>>> >> > X86_TUNE_GENERAL_REGS_SSE_SPILL: Try to spill general regs to SSE
>>> >> > regs
>>> >> instead of memory.
>>> >> >
>>> >> > I tried enabling the above tuning with -march=bdver4 -Ofast -mtune-
>>> >> ctrl=general_regs_sse_spill.
>>> >> > I did not find any code differences.
>>> >> >
>>> >> > Looking at the below code to enable this tune, mmx ISA needs to be
>>> >> > turned
>>> >> off.
>>> >> >
>>> >> > static reg_class_t
>>> >> > ix86_spill_class (reg_class_t rclass, machine_mode mode) {
>>> >> > if (TARGET_SSE && TARGET_GENERAL_REGS_SSE_SPILL && !
>>> >> TARGET_MMX
>>> >> > && (mode == SImode || (TARGET_64BIT && mode == DImode))
>>> >> > && rclass != NO_REGS && INTEGER_CLASS_P (rclass))
>>> >> > return ALL_SSE_REGS;
>>> >> > return NO_REGS;
>>> >> > }
>>> >> >
>>> >> > All processor variants enable MMX by default and why we need to
>>> >> > switch
>>> >> off mmx?
>>> >>
>>> >> That really looks weird to me. I ran SPEC2006 on Ofast + LTO with
>>> >> and without -mno-mmx and -mno-mmx gives (Haswell machine):
>>> >>
>>> >> SPEC2006INT : +0.30%
>>> >> SPEC2006FP : +0.60%
>>> >> SPEC2006ALL : +0.48%
>>> >>
>>> >> Which is quite surprising for disabling a hardware feature hardly
>>> >> used anywhere now.
>>> >
>>> > As I said without mmx (-mno-mmx), the tune
>>> X86_TUNE_GENERAL_REGS_SSE_SPILL may be active now.
>>> > Not sure if there are any other reason.
>>>
>>> Surely that should be the main reason I see performance gain.
>>> So I want to ask the same question as you did: why does this important
>>> performance feature requires disabled MMX. This restriction exists from the
>>> very start of X86_TUNE_GENERAL_REGS_SSE_SPILL existence (at least in
>>> trunk) and no comments on why we have this restriction.
>>
>> I was told by Uros, that using TARGET_MMX is to prevent intreg <-> MMX moves that clobber stack registers.
>
> ix86_spill_class is supposed to return a register class to be used
> to store general purpose registers. It returns ALL_SSE_REGS which
> doesn't intersect with MMX_REGS class. So I don't see why
> intreg <-> MMX moves may appear. And if those moves appear we should
> fix it, not disable the whole feature.
>
> @Uros, do you have a comment here?
Looking at the implementation of ix86_spill_class, TARGET_MMX check
really looks too restrictive. However, we need to check TARGET_SSE2
and TARGET_INTERUNIT_MOVES instead, otherwise movq xmm <-> intreg
pattern gets disabled
This change should be OK then, but just in case, SSE2 enabled
-mfpmath=i387 32bit SPEC run should uncover unwanted MMX instructions.
Uros.