[llvm-commits] [llvm] r146163 - in /llvm/trunk/lib/Target/X86: X86InstrFormats.td X86InstrInfo.td X86InstrSSE.td X86Subtarget.h
Bruno Cardoso Lopes
bruno.cardoso at gmail.com
Thu Dec 8 17:12:09 PST 2011
Hi Evan,
On Thu, Dec 8, 2011 at 5:00 PM, Evan Cheng <evan.cheng at apple.com> wrote:
> Author: evancheng
> Date: Thu Dec 8 13:00:42 2011
> New Revision: 146163
>
> URL: http://llvm.org/viewvc/llvm-project?rev=146163&view=rev
> Log:
> Many of the SSE patterns should not be selected when AVX is available. This led to the following code in X86Subtarget.cpp
>
> if (HasAVX)
> X86SSELevel = NoMMXSSE;
>
> This is so patterns that are predicated on hasSSE3, etc. would not be selected when avx is available. Instead, the AVX variant is selected.
> However, this breaks instructions which do not have AVX variants.
>
> The right way to fix this is for the SSE but not-AVX patterns to predicate on something like hasSSE3() && !hasAVX().
> Then we can take out the hack in X86Subtarget.cpp. Patterns which do not have AVX variants do not need to change.
>
> However, we need to audit all the patterns before we make the change. This patch is workaround that fixes one specific case,
> the prefetch instructions. rdar://10538297
>
> Modified:
> llvm/trunk/lib/Target/X86/X86InstrFormats.td
> llvm/trunk/lib/Target/X86/X86InstrInfo.td
> llvm/trunk/lib/Target/X86/X86InstrSSE.td
> llvm/trunk/lib/Target/X86/X86Subtarget.h
>
> Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=146163&r1=146162&r2=146163&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Thu Dec 8 13:00:42 2011
> @@ -334,6 +334,10 @@
> list<dag> pattern>
> : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedSingle>, TB,
> Requires<[HasAVX]>;
> +class VoPSI<bits<8> o, Format F, dag outs, dag ins, string asm,
> + list<dag> pattern>
> + : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB,
> + Requires<[HasSSE1orAVX]>;
>
> // SSE2 Instruction Templates:
> //
>
> Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=146163&r1=146162&r2=146163&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Thu Dec 8 13:00:42 2011
> @@ -476,6 +476,8 @@
> def HasXMM : Predicate<"Subtarget->hasXMM()">;
> def HasXMMInt : Predicate<"Subtarget->hasXMMInt()">;
>
> +def HasSSE1orAVX : Predicate<"Subtarget->hasSSE1orAVX()">;
> +
> def HasPOPCNT : Predicate<"Subtarget->hasPOPCNT()">;
> def HasAES : Predicate<"Subtarget->hasAES()">;
> def HasCLMUL : Predicate<"Subtarget->hasCLMUL()">;
>
> Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=146163&r1=146162&r2=146163&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Thu Dec 8 13:00:42 2011
> @@ -3183,13 +3183,13 @@
> //===----------------------------------------------------------------------===//
>
> // Prefetch intrinsic.
> -def PREFETCHT0 : PSI<0x18, MRM1m, (outs), (ins i8mem:$src),
> +def PREFETCHT0 : VoPSI<0x18, MRM1m, (outs), (ins i8mem:$src),
> "prefetcht0\t$src", [(prefetch addr:$src, imm, (i32 3), (i32 1))]>;
> -def PREFETCHT1 : PSI<0x18, MRM2m, (outs), (ins i8mem:$src),
> +def PREFETCHT1 : VoPSI<0x18, MRM2m, (outs), (ins i8mem:$src),
> "prefetcht1\t$src", [(prefetch addr:$src, imm, (i32 2), (i32 1))]>;
> -def PREFETCHT2 : PSI<0x18, MRM3m, (outs), (ins i8mem:$src),
> +def PREFETCHT2 : VoPSI<0x18, MRM3m, (outs), (ins i8mem:$src),
> "prefetcht2\t$src", [(prefetch addr:$src, imm, (i32 1), (i32 1))]>;
> -def PREFETCHNTA : PSI<0x18, MRM0m, (outs), (ins i8mem:$src),
> +def PREFETCHNTA : VoPSI<0x18, MRM0m, (outs), (ins i8mem:$src),
> "prefetchnta\t$src", [(prefetch addr:$src, imm, (i32 0), (i32 1))]>;
>
> // Flush cache
>
> Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=146163&r1=146162&r2=146163&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)
> +++ llvm/trunk/lib/Target/X86/X86Subtarget.h Thu Dec 8 13:00:42 2011
> @@ -193,6 +193,7 @@
> bool hasAVX2() const { return HasAVX2; }
> bool hasXMM() const { return hasSSE1() || hasAVX(); }
> bool hasXMMInt() const { return hasSSE2() || hasAVX(); }
> + bool hasSSE1orAVX() const { return hasSSE1() || hasAVX(); }
> bool hasSSE3orAVX() const { return hasSSE3() || hasAVX(); }
> bool hasSSSE3orAVX() const { return hasSSSE3() || hasAVX(); }
> bool hasSSE41orAVX() const { return hasSSE41() || hasAVX(); }
Why don't use hasXMM() instead of creating a hasSSE1orAVX()? That's
how we usually check for this predicate all around the code. Perhaps
it deserves some better naming though...
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the llvm-commits
mailing list