craig.topper created this revision.
craig.topper added reviewers: rsmith, chandlerc, echristo, rnk.

This is part of an ongoing attempt at making 512 bit vectors illegal in the X86 
backend type legalizer due to CPU frequency penalties associated with wide 
vectors on Skylake Server CPUs. We want the loop vectorizer to be able to emit 
IR containing wide vectors as intermediate operations in vectorized code and 
allow these wide vectors to be legalized to 256 bits by the X86 backend even 
though we are targetting a CPU that supports 512 bit vectors. This is similar 
to what happens with an AVX2 CPU, the vectorizer can emit wide vectors and the 
backend will split them. We want this splitting behavior, but still be able to 
use new Skylake instructions that work on 256-bit vectors and support things 
like masking and gather/scatter.

Of course if the user uses explicit vector code in their source code we need to 
not split those operations. Especially if they have used any of the 512-bit 
vector intrinsics from immintrin.h. And we need to make it so that merely using 
the intrinsics produces the expected code in order to be backwards compatible.

To support this goal, this patch adds a new IR function attribute 
"min-legal-vector-width" that can indicate the need for a minimum vector width 
to be legal in the backend. We need to ensure this attribute is set to the 
largest vector width needed by any intrinsics from immintrin.h that the 
function uses. The inliner will be reponsible for merging this attribute when a 
function is inlined. We may also need a way to limit inlining in the future as 
well, but we can discuss that in the future.

To make things more complicated, there are two different ways intrinsics are 
implemented in immintrin.h. Either as an always_inline function containing 
calls to builtins(can be target specific or target independent) or vector 
extension code. Or as a macro wrapper around a taget specific builtin. I 
believe I've removed all cases where the macro was around a target independent 
builtin.

To support the always_inline function case this patch adds 
__attribute__((__min_vector_width__(128))) that can be used to tag these 
functions with their vector width. All x86 intrinsic functions that operate on 
vectors have been tagged with this attribute.

To support the macro case, all x86 specific builtins have also been tagged with 
the vector width that they require. Use of any builtin with this property will 
implicitly increase the __min_vector_width__ of the function that calls it. 
I've done this as a new property in the attribute string for the builtin rather 
than basing it on the type string so that we can opt into it on a per builtin 
basis and avoid any impact to target independent builtins.

There will be future work to support vectors passed as function arguments and 
supporting inline assembly. And whatever else we can find that isn't covered by 
this patch.

Special thanks to Chandler who suggested this direction and reviewed a preview 
version of this patch. And thanks to Eric Christopher who has had many 
conversations with me about this issue.


https://reviews.llvm.org/D48617

Files:
  include/clang/Basic/Attr.td
  include/clang/Basic/Builtins.def
  include/clang/Basic/Builtins.h
  include/clang/Basic/BuiltinsX86.def
  include/clang/Basic/BuiltinsX86_64.def
  lib/Basic/Builtins.cpp
  lib/CodeGen/CGBuiltin.cpp
  lib/CodeGen/CodeGenFunction.cpp
  lib/CodeGen/CodeGenFunction.h
  lib/Headers/__wmmintrin_aes.h
  lib/Headers/ammintrin.h
  lib/Headers/avx2intrin.h
  lib/Headers/avx512bitalgintrin.h
  lib/Headers/avx512bwintrin.h
  lib/Headers/avx512cdintrin.h
  lib/Headers/avx512dqintrin.h
  lib/Headers/avx512fintrin.h
  lib/Headers/avx512ifmaintrin.h
  lib/Headers/avx512ifmavlintrin.h
  lib/Headers/avx512vbmi2intrin.h
  lib/Headers/avx512vbmiintrin.h
  lib/Headers/avx512vbmivlintrin.h
  lib/Headers/avx512vlbitalgintrin.h
  lib/Headers/avx512vlbwintrin.h
  lib/Headers/avx512vlcdintrin.h
  lib/Headers/avx512vldqintrin.h
  lib/Headers/avx512vlintrin.h
  lib/Headers/avx512vlvbmi2intrin.h
  lib/Headers/avx512vlvnniintrin.h
  lib/Headers/avx512vnniintrin.h
  lib/Headers/avx512vpopcntdqintrin.h
  lib/Headers/avx512vpopcntdqvlintrin.h
  lib/Headers/avxintrin.h
  lib/Headers/emmintrin.h
  lib/Headers/f16cintrin.h
  lib/Headers/fma4intrin.h
  lib/Headers/fmaintrin.h
  lib/Headers/gfniintrin.h
  lib/Headers/mm3dnow.h
  lib/Headers/mmintrin.h
  lib/Headers/pmmintrin.h
  lib/Headers/shaintrin.h
  lib/Headers/smmintrin.h
  lib/Headers/tmmintrin.h
  lib/Headers/vaesintrin.h
  lib/Headers/xmmintrin.h
  lib/Headers/xopintrin.h
  lib/Sema/SemaDeclAttr.cpp
  test/CodeGen/function-min-vector-width.c
  test/CodeGen/x86-builtins-vector-width.c
  test/Sema/attr-min-vector-width.c



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to