CIRCT 22.0.0git
Loading...
Searching...
No Matches
CombToLLVM.cpp
Go to the documentation of this file.
1//===- CombToLLVM.cpp - Comb to LLVM Conversion Patterns ------------------===//
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// This file implements Comb to LLVM conversion patterns.
10//
11//===----------------------------------------------------------------------===//
12
15#include "circt/Support/LLVM.h"
16#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
17#include "mlir/Conversion/LLVMCommon/Pattern.h"
18#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
19#include "mlir/Pass/Pass.h"
20#include "mlir/Transforms/DialectConversion.h"
21
22using namespace mlir;
23using namespace circt;
24
25namespace {
26
27//===----------------------------------------------------------------------===//
28// Comb Operation Conversion Patterns
29//===----------------------------------------------------------------------===//
30
31/// Convert a comb::ParityOp to the LLVM dialect.
32struct CombParityOpConversion : public ConvertToLLVMPattern {
33 explicit CombParityOpConversion(MLIRContext *ctx,
34 LLVMTypeConverter &typeConverter)
35 : ConvertToLLVMPattern(comb::ParityOp::getOperationName(), ctx,
36 typeConverter) {}
37
38 LogicalResult
39 matchAndRewrite(Operation *op, ArrayRef<Value> operands,
40 ConversionPatternRewriter &rewriter) const override {
41 auto parityOp = cast<comb::ParityOp>(op);
42
43 auto popCount =
44 LLVM::CtPopOp::create(rewriter, op->getLoc(), parityOp.getInput());
45 rewriter.replaceOpWithNewOp<LLVM::TruncOp>(
46 op, IntegerType::get(rewriter.getContext(), 1), popCount);
47
48 return success();
49 }
50};
51
52/// Convert a comb::ReverseOp to the LLVM dialect.
53struct CombReverseOpConversion
54 : public ConvertOpToLLVMPattern<comb::ReverseOp> {
55 using ConvertOpToLLVMPattern<comb::ReverseOp>::ConvertOpToLLVMPattern;
56
57 LogicalResult
58 matchAndRewrite(comb::ReverseOp op, OpAdaptor adaptor,
59 ConversionPatternRewriter &rewriter) const override {
60 rewriter.replaceOpWithNewOp<LLVM::BitReverseOp>(
61 op, adaptor.getInput().getType(), adaptor.getInput());
62 return success();
63 }
64};
65
66} // namespace
67
68//===----------------------------------------------------------------------===//
69// Pattern Population Functions
70//===----------------------------------------------------------------------===//
71
72void circt::populateCombToLLVMConversionPatterns(LLVMTypeConverter &converter,
73 RewritePatternSet &patterns) {
74 // Only add patterns for operations that don't have Comb-to-Arith patterns
75 // Most Comb operations are handled by the Comb-to-Arith + Arith-to-LLVM
76 // pipeline
77 patterns.add<CombParityOpConversion>(patterns.getContext(), converter);
78 patterns.add<CombReverseOpConversion>(converter);
79}
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
void populateCombToLLVMConversionPatterns(mlir::LLVMTypeConverter &converter, RewritePatternSet &patterns)
Get the Comb to LLVM conversion patterns.
Definition comb.py:1