diff options
Diffstat (limited to 'lib/Transforms/Vectorize/VPlanBuilder.h')
| -rw-r--r-- | lib/Transforms/Vectorize/VPlanBuilder.h | 61 | 
1 files changed, 61 insertions, 0 deletions
| diff --git a/lib/Transforms/Vectorize/VPlanBuilder.h b/lib/Transforms/Vectorize/VPlanBuilder.h new file mode 100644 index 000000000000..d6eb3397d044 --- /dev/null +++ b/lib/Transforms/Vectorize/VPlanBuilder.h @@ -0,0 +1,61 @@ +//===- VPlanBuilder.h - A VPlan utility for constructing VPInstructions ---===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file provides a VPlan-based builder utility analogous to IRBuilder. +/// It provides an instruction-level API for generating VPInstructions while +/// abstracting away the Recipe manipulation details. +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_BUILDER_H +#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_BUILDER_H + +#include "VPlan.h" + +namespace llvm { + +class VPBuilder { +private: +  VPBasicBlock *BB = nullptr; +  VPBasicBlock::iterator InsertPt = VPBasicBlock::iterator(); + +  VPInstruction *createInstruction(unsigned Opcode, +                                   std::initializer_list<VPValue *> Operands) { +    VPInstruction *Instr = new VPInstruction(Opcode, Operands); +    BB->insert(Instr, InsertPt); +    return Instr; +  } + +public: +  VPBuilder() {} + +  /// \brief This specifies that created VPInstructions should be appended to +  /// the end of the specified block. +  void setInsertPoint(VPBasicBlock *TheBB) { +    assert(TheBB && "Attempting to set a null insert point"); +    BB = TheBB; +    InsertPt = BB->end(); +  } + +  VPValue *createNot(VPValue *Operand) { +    return createInstruction(VPInstruction::Not, {Operand}); +  } + +  VPValue *createAnd(VPValue *LHS, VPValue *RHS) { +    return createInstruction(Instruction::BinaryOps::And, {LHS, RHS}); +  } + +  VPValue *createOr(VPValue *LHS, VPValue *RHS) { +    return createInstruction(Instruction::BinaryOps::Or, {LHS, RHS}); +  } +}; + +} // namespace llvm + +#endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_BUILDER_H | 
