]> granicus.if.org Git - llvm/commit
[IntrinsicEmitter] Support scalable vectors in intrinsics
authorCullen Rhodes <cullen.rhodes@arm.com>
Tue, 27 Aug 2019 12:57:09 +0000 (12:57 +0000)
committerCullen Rhodes <cullen.rhodes@arm.com>
Tue, 27 Aug 2019 12:57:09 +0000 (12:57 +0000)
commit2033d5f0347b150730dda2e9587c78b6ae969054
tree85e01cc3cd455ad8362ee687b65b5db658081c26
parente05bcc80b38b696949cf22ac68e120c78505c003
[IntrinsicEmitter] Support scalable vectors in intrinsics

Summary:
This patch adds support for scalable vectors in intrinsics, enabling
intrinsics such as the following to be defined:

    declare <vscale x 4 x i32> @llvm.something.nxv4i32(<vscale x 4 x i32>)

Support for this is implemented by defining a new type descriptor for
scalable vectors and adding mangling support for scalable vector types
in the name mangling scheme used by 'any' types in intrinsic signatures.

Tests have been added for IRBuilder to test scalable vectors work as
expected when using intrinsics through this interface. This required
implementing an intrinsic that is explicitly defined with scalable
vectors, e.g.  LLVMType<nxv4i32>, an SVE floating-point convert
intrinsic was used for this.  The behaviour of the overloaded type
LLVMScalarOrSameVectorWidth with scalable vectors is tested using the
existing masked load intrinsic. Also added an .ll test to test the
Verifier catches a bad intrinsic argument when passing a fixed-width
predicate (mask) to the masked.load intrinsic where a scalable is
expected.

Patch by Paul Walker

Reviewed By: sdesmalen

Differential Revision: https://reviews.llvm.org/D65930

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370053 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/IR/Intrinsics.h
include/llvm/IR/IntrinsicsAArch64.td
include/llvm/Support/ScalableSize.h
lib/IR/Function.cpp
test/Verifier/intrinsic-bad-arg-type.ll [new file with mode: 0644]
unittests/IR/IRBuilderTest.cpp
utils/TableGen/IntrinsicEmitter.cpp