llvm-project/llvm/lib
Ahmed Bougacha fab5892f8b [AArch64] Avoid going through GPRs for across-vector instructions.
This adds new node types for each intrinsic.
For instance, for addv, we have AArch64ISD::UADDV, such that:
  (v4i32 (uaddv ...))
is the same as
  (v4i32 (scalar_to_vector (i32 (int_aarch64_neon_uaddv ...))))
that is,
  (v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
           (i32 (int_aarch64_neon_uaddv ...)), ssub)

In a combine, we transform all such across-vector-lanes intrinsics to:

  (i32 (extract_vector_elt (uaddv ...), 0))

This has one big advantage: by making the extract_element explicit, we
enable the existing patterns for lane-aware instructions to fire.
This lets us avoid needlessly going through the GPRs.  Consider:

    uint32x4_t test_mul(uint32x4_t a, uint32x4_t b) {
        return vmulq_n_u32(a, vaddvq_u32(b));
    }

We now generate:
    addv.4s  s1, v1
    mul.4s   v0, v0, v1[0]
instead of the previous:
    addv.4s  s1, v1
    fmov     w8, s1
    dup.4s   v1, w8
    mul.4s   v0, v1, v0

rdar://20044838

llvm-svn: 231840
2015-03-10 20:45:38 +00:00
..
Analysis LoopAccessAnalysis: Silence -Wreturn-type diagnostic from GCC 2015-03-10 20:23:29 +00:00
AsmParser Fix a stack overflow in the assembler when checking that GEPs must be over sized types. 2015-03-10 06:34:57 +00:00
Bitcode Simplify expressions involving boolean constants with clang-tidy 2015-03-09 01:57:13 +00:00
CodeGen Don't evaluate rend() on every iteration of the loop. 2015-03-10 20:29:59 +00:00
DebugInfo DWARFFormValue: Add getAsSignedConstant method. 2015-03-04 22:07:41 +00:00
ExecutionEngine Temporarily revert r231726 and r231724 as they're breaking the build.: 2015-03-10 00:33:27 +00:00
Fuzzer [sanitizer/coverage] Add AFL-style coverage counters (search heuristic for fuzzing). 2015-03-03 23:27:02 +00:00
IR [X86, AVX] replace vinsertf128 intrinsics with generic shuffles 2015-03-10 16:08:36 +00:00
IRReader Use ADDITIONAL_HEADER_DIRS in all LLVM CMake projects. 2015-02-11 03:28:02 +00:00
LTO Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
LineEditor Use ADDITIONAL_HEADER_DIRS in all LLVM CMake projects. 2015-02-11 03:28:02 +00:00
Linker DataLayout is mandatory, update the API to reflect it with references. 2015-03-10 02:37:25 +00:00
MC Simplify expressions involving boolean constants with clang-tidy 2015-03-09 01:57:13 +00:00
Object Add support for Nuxi CloudABI. 2015-03-09 18:40:45 +00:00
Option Remove explicit no-op dtor in favor of the implicit dtor so as not to disable/deprecate the copy operations. 2015-03-03 19:53:02 +00:00
Passes [PM] Fixup for r231556 where I missed a dependency on intrinsics 2015-03-07 09:08:20 +00:00
ProfileData InstrProf: Allow hexadecimal function hashes in proftext format 2015-03-09 18:54:49 +00:00
Support Teach raw_ostream to accept SmallString. 2015-03-10 07:33:23 +00:00
TableGen Add missing includes. make_unique proliferated everywhere. 2015-03-01 21:28:53 +00:00
Target [AArch64] Avoid going through GPRs for across-vector instructions. 2015-03-10 20:45:38 +00:00
Transforms remove function names from comments; NFC 2015-03-10 19:42:57 +00:00
CMakeLists.txt [PM] Create a separate library for high-level pass management code. 2015-03-07 09:02:36 +00:00
LLVMBuild.txt [PM] Create a separate library for high-level pass management code. 2015-03-07 09:02:36 +00:00
Makefile [PM] Create a separate library for high-level pass management code. 2015-03-07 09:02:36 +00:00