diff --git a/include/circt/Dialect/RTG/Reductions/RTGReductions.h b/include/circt/Dialect/RTG/Reductions/RTGReductions.h new file mode 100644 index 000000000000..00e96396ae09 --- /dev/null +++ b/include/circt/Dialect/RTG/Reductions/RTGReductions.h @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef CIRCT_DIALECT_RTG_REDUCTIONS_RTGREDUCTIONS_H +#define CIRCT_DIALECT_RTG_REDUCTIONS_RTGREDUCTIONS_H + +#include "circt/Reduce/Reduction.h" + +namespace circt { +namespace rtg { + +/// A dialect interface to provide reduction patterns to a reducer tool. +struct RTGReducePatternDialectInterface : public ReducePatternDialectInterface { + using ReducePatternDialectInterface::ReducePatternDialectInterface; + void populateReducePatterns(circt::ReducePatternSet &patterns) const override; +}; + +/// Register the RTG Reduction pattern dialect interface to the given registry. +void registerReducePatternDialectInterface(mlir::DialectRegistry ®istry); + +} // namespace rtg +} // namespace circt + +#endif // CIRCT_DIALECT_RTG_REDUCTIONS_RTGREDUCTIONS_H diff --git a/lib/Dialect/RTG/CMakeLists.txt b/lib/Dialect/RTG/CMakeLists.txt index 9f57627c321f..e55dac655bc9 100644 --- a/lib/Dialect/RTG/CMakeLists.txt +++ b/lib/Dialect/RTG/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(IR) +add_subdirectory(Reductions) add_subdirectory(Transforms) diff --git a/lib/Dialect/RTG/Reductions/CMakeLists.txt b/lib/Dialect/RTG/Reductions/CMakeLists.txt new file mode 100644 index 000000000000..89b630ee18bb --- /dev/null +++ b/lib/Dialect/RTG/Reductions/CMakeLists.txt @@ -0,0 +1,8 @@ +add_circt_library(CIRCTRTGReductions + RTGReductions.cpp + + LINK_LIBS PUBLIC + CIRCTReduceLib + CIRCTRTGDialect + MLIRIR +) diff --git a/lib/Dialect/RTG/Reductions/RTGReductions.cpp b/lib/Dialect/RTG/Reductions/RTGReductions.cpp new file mode 100644 index 000000000000..1b01363ce766 --- /dev/null +++ b/lib/Dialect/RTG/Reductions/RTGReductions.cpp @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "circt/Dialect/RTG/Reductions/RTGReductions.h" +#include "circt/Dialect/RTG/IR/RTGOps.h" + +using namespace mlir; +using namespace circt; +using namespace rtg; + +//===----------------------------------------------------------------------===// +// Reduction patterns +//===----------------------------------------------------------------------===// + +namespace { + +/// Replace virtual registers with a constant register. +struct VirtualRegisterConstantifier : public OpReduction { + LogicalResult rewrite(VirtualRegisterOp op) override { + if (op.getAllowedRegs().getAllowedRegs().empty()) + return failure(); + + OpBuilder builder(op); + auto constReg = ConstantOp::create(builder, op.getLoc(), + op.getAllowedRegs().getAllowedRegs()[0]); + op.getResult().replaceAllUsesWith(constReg); + op.erase(); + return success(); + } + + std::string getName() const override { + return "rtg-virtual-register-constantifier"; + } +}; + +} // namespace + +//===----------------------------------------------------------------------===// +// Reduction Registration +//===----------------------------------------------------------------------===// + +void RTGReducePatternDialectInterface::populateReducePatterns( + circt::ReducePatternSet &patterns) const { + // Gather a list of reduction patterns that we should try. Ideally these are + // assigned reasonable benefit indicators (higher benefit patterns are + // prioritized). For example, things that can knock out entire modules while + // being cheap should be tried first (and thus have higher benefit), before + // trying to tweak operands of individual arithmetic ops. + patterns.add(); +} + +void rtg::registerReducePatternDialectInterface( + mlir::DialectRegistry ®istry) { + registry.addExtension(+[](MLIRContext *ctx, RTGDialect *dialect) { + dialect->addInterfaces(); + }); +} diff --git a/test/Dialect/RTG/Reduction/virtual-register-constantifier.mlir b/test/Dialect/RTG/Reduction/virtual-register-constantifier.mlir new file mode 100644 index 000000000000..590bd0058cd7 --- /dev/null +++ b/test/Dialect/RTG/Reduction/virtual-register-constantifier.mlir @@ -0,0 +1,11 @@ +// UNSUPPORTED: system-windows +// See https://github.com/llvm/circt/issues/4129 +// RUN: circt-reduce %s --test /usr/bin/env --test-arg grep --test-arg -q --test-arg "rtg.test @test" --keep-best=0 --include rtg-virtual-register-constantifier | FileCheck %s + +// CHECK-LABEL: rtg.test @test +rtg.test @test() { + // CHECK-NEXT: [[V0:%.+]] = rtg.constant #rtgtest.t0 : !rtgtest.ireg + // CHECK-NEXT: rtgtest.rv32i.add [[V0]], [[V0]], [[V0]] + %reg = rtg.virtual_reg [#rtgtest.t0, #rtgtest.t1, #rtgtest.t2] + rtgtest.rv32i.add %reg, %reg, %reg +} diff --git a/tools/circt-reduce/CMakeLists.txt b/tools/circt-reduce/CMakeLists.txt index 1d503c4aa74a..be198fa05f7d 100644 --- a/tools/circt-reduce/CMakeLists.txt +++ b/tools/circt-reduce/CMakeLists.txt @@ -13,6 +13,7 @@ set(LIBS CIRCTEmitReductions CIRCTHWReductions CIRCTFIRRTLReductions + CIRCTRTGReductions CIRCTReduceLib MLIRIR MLIRBytecodeWriter diff --git a/tools/circt-reduce/circt-reduce.cpp b/tools/circt-reduce/circt-reduce.cpp index 40696d1367d4..69ef52888b20 100644 --- a/tools/circt-reduce/circt-reduce.cpp +++ b/tools/circt-reduce/circt-reduce.cpp @@ -16,6 +16,7 @@ #include "circt/Dialect/FIRRTL/FIRRTLReductions.h" #include "circt/Dialect/HW/HWDialect.h" #include "circt/Dialect/HW/HWReductions.h" +#include "circt/Dialect/RTG/Reductions/RTGReductions.h" #include "circt/InitAllDialects.h" #include "circt/Reduce/GenericReductions.h" #include "circt/Reduce/Tester.h" @@ -532,6 +533,7 @@ int main(int argc, char **argv) { emit::registerReducePatternDialectInterface(registry); firrtl::registerReducePatternDialectInterface(registry); hw::registerReducePatternDialectInterface(registry); + rtg::registerReducePatternDialectInterface(registry); // Set up dialect plugin loading callback dialectPlugins.setCallback([&](const std::string &pluginPath) {