1//===- SandboxVectorizerIR.cpp - Sandbox IR Specialization ----------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerIR.h"
10#include "llvm/SandboxIR/Type.h"
11
12namespace llvm::sandboxir {
13
14Value *PackInst::create(ArrayRef<Value *> PackOps, InsertPosition InsertBefore,
15 SBVecContext &Ctx) {
16 auto &Builder = Instruction::setInsertPos(InsertBefore);
17 // TODO: Replace with actual instruction sequence!
18 auto *C = ConstantInt::get(Ty: Type::getInt32Ty(Ctx), V: 0);
19 auto *LLVMC = cast<llvm::Constant>(Val: C->Val);
20 auto *LLVMVecTy = llvm::FixedVectorType::get(ElementType: PackOps[0]->Val->getType(), NumElts: 2);
21 auto *LLVMPoison = llvm::PoisonValue::get(T: LLVMVecTy);
22 llvm::Value *NewV =
23 Builder.CreateInsertElement(Vec: LLVMPoison, NewElt: PackOps[0]->Val, Idx: LLVMC, Name: "TEST");
24
25 if (auto *NewInsert = dyn_cast<llvm::InsertElementInst>(Val: NewV))
26 return Ctx.createPackInst(PackInstrs: {NewInsert});
27 assert(isa<llvm::Constant>(NewV) && "Expected constant");
28 return Ctx.getOrCreateConstant(LLVMC: cast<llvm::Constant>(Val: NewV));
29}
30
31bool PackInst::classof(const Value *From) {
32 return From->getSubclassID() == ClassID::Pack;
33}
34
35PackInst *
36SBVecContext::createPackInst(ArrayRef<llvm::Instruction *> PackInstrs) {
37 assert(all_of(PackInstrs,
38 [](llvm::Value *V) {
39 return isa<llvm::InsertElementInst>(V) ||
40 isa<llvm::ExtractElementInst>(V);
41 }) &&
42 "Expected inserts or extracts!");
43 auto NewPtr = std::unique_ptr<PackInst>(new PackInst(PackInstrs, *this));
44 return cast<PackInst>(Val: registerValue(VPtr: std::move(NewPtr)));
45}
46
47} // namespace llvm::sandboxir
48