| //===- 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 |