55 ImplicitLocOpBuilder builder(op.getLoc(), op);
56 SmallVector<ValueRange> vectors;
58 for (ValueRange range : op.getInputs()) {
59 unsigned bw = range.front().getType().getIntOrFloatBitWidth();
61 comb::ConcatOp::create(builder,
62 builder.getIntegerType(bw * range.size()), range)
66 unsigned width = op->getResult(0).getType().getIntOrFloatBitWidth();
67 VectorizeOp newOp = VectorizeOp::create(
68 builder, builder.getIntegerType(width * op->getNumResults()), vectors);
69 newOp.getBody().takeBody(op.getBody());
71 for (OpResult res : op.getResults()) {
73 builder, newOp.getResult(0), width * res.getResultNumber(), width);
74 res.replaceAllUsesWith(newRes);
112 ImplicitLocOpBuilder builder(op.getLoc(), op);
113 SmallVector<ValueRange> vectors;
115 for (ValueRange range : op.getInputs()) {
118 VectorType type = VectorType::get(SmallVector<int64_t>(1, range.size()),
119 range.front().getType());
120 if (llvm::all_equal(range)) {
122 vector::BroadcastOp::create(builder, type, range.front())
129 arith::ConstantOp::create(
131 DenseElementsAttr::get(
132 type, SmallVector<Attribute>(
134 builder.getIntegerAttr(type.getElementType(), 0))))
136 for (
auto [i, element] : llvm::enumerate(range))
137 vector = vector::InsertOp::create(builder, element, vector.front(), i)
140 vectors.push_back(vector);
143 VectorType resType = VectorType::get(
144 SmallVector<int64_t>(1, op->getNumResults()), op.getResult(0).getType());
145 VectorizeOp newOp = VectorizeOp::create(builder, resType, vectors);
146 newOp.getBody().takeBody(op.getBody());
148 for (OpResult res : op.getResults())
149 res.replaceAllUsesWith(vector::ExtractOp::create(
150 builder, newOp.getResult(0), res.getResultNumber()));
166 if (op.isBoundaryVectorized())
171 if (op.isBodyVectorized()) {
172 if (isa<VectorType>(op.getBody().front().getArgumentTypes().front()))
179 unsigned numLanes = op.getInputs().size();
180 unsigned maxLaneWidth = 0;
181 for (OperandRange range : op.getInputs())
183 std::max(maxLaneWidth, range.front().getType().getIntOrFloatBitWidth());
185 if ((numLanes * maxLaneWidth <= 64) &&
186 op->getResult(0).getType().getIntOrFloatBitWidth() *
187 op->getNumResults() <=
232 if (!(op.isBodyVectorized() && op.isBoundaryVectorized()))
233 return op->emitError(
234 "can only inline body if boundary and body are already vectorized");
236 Block &block = op.getBody().front();
237 for (
auto [operand, arg] : llvm::zip(op.getInputs(), block.getArguments()))
238 arg.replaceAllUsesWith(operand.front());
240 Operation *terminator = block.getTerminator();
241 op->getResult(0).replaceAllUsesWith(terminator->getOperand(0));
244 op->getBlock()->getOperations().splice(op->getIterator(),
245 block.getOperations());