| //===- llvm/VectorBuilder.h - Builder for VP Intrinsics ---------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the VectorBuilder class, which is used as a convenient way |
| // to create VP intrinsics as if they were LLVM instructions with a consistent |
| // and simplified interface. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_IR_VECTORBUILDER_H |
| #define LLVM_IR_VECTORBUILDER_H |
| |
| #include <llvm/IR/IRBuilder.h> |
| #include <llvm/IR/InstrTypes.h> |
| #include <llvm/IR/Instruction.h> |
| #include <llvm/IR/Value.h> |
| |
| namespace llvm { |
| |
| class VectorBuilder { |
| public: |
| enum class Behavior { |
| // Abort if the requested VP intrinsic could not be created. |
| // This is useful for strict consistency. |
| ReportAndAbort = 0, |
| |
| // Return a default-initialized value if the requested VP intrinsic could |
| // not be created. |
| // This is useful for a defensive fallback to non-VP code. |
| SilentlyReturnNone = 1, |
| }; |
| |
| private: |
| IRBuilderBase &Builder; |
| Behavior ErrorHandling; |
| |
| // Explicit mask parameter. |
| Value *Mask; |
| // Explicit vector length parameter. |
| Value *ExplicitVectorLength; |
| // Compile-time vector length. |
| ElementCount StaticVectorLength; |
| |
| // Get mask/evl value handles for the current configuration. |
| Value &requestMask(); |
| Value &requestEVL(); |
| |
| void handleError(const char *ErrorMsg) const; |
| template <typename RetType> |
| RetType returnWithError(const char *ErrorMsg) const { |
| handleError(ErrorMsg); |
| return RetType(); |
| } |
| |
| public: |
| VectorBuilder(IRBuilderBase &Builder, |
| Behavior ErrorHandling = Behavior::ReportAndAbort) |
| : Builder(Builder), ErrorHandling(ErrorHandling), Mask(nullptr), |
| ExplicitVectorLength(nullptr), |
| StaticVectorLength(ElementCount::getFixed(0)) {} |
| |
| Module &getModule() const; |
| LLVMContext &getContext() const { return Builder.getContext(); } |
| |
| // All-true mask for the currently configured explicit vector length. |
| Value *getAllTrueMask(); |
| |
| VectorBuilder &setMask(Value *NewMask) { |
| Mask = NewMask; |
| return *this; |
| } |
| VectorBuilder &setEVL(Value *NewExplicitVectorLength) { |
| ExplicitVectorLength = NewExplicitVectorLength; |
| return *this; |
| } |
| VectorBuilder &setStaticVL(unsigned NewFixedVL) { |
| StaticVectorLength = ElementCount::getFixed(NewFixedVL); |
| return *this; |
| } |
| // TODO: setStaticVL(ElementCount) for scalable types. |
| |
| // Emit a VP intrinsic call that mimics a regular instruction. |
| // This operation behaves according to the VectorBuilderBehavior. |
| // \p Opcode The functional instruction opcode of the emitted intrinsic. |
| // \p ReturnTy The return type of the operation. |
| // \p VecOpArray The operand list. |
| Value *createVectorInstruction(unsigned Opcode, Type *ReturnTy, |
| ArrayRef<Value *> VecOpArray, |
| const Twine &Name = Twine()); |
| }; |
| |
| } // namespace llvm |
| |
| #endif // LLVM_IR_VECTORBUILDER_H |