mirror of https://github.com/llvm/circt.git
[FIRRTL] Minor canonicalization of cat(asuint)
This commit is contained in:
parent
69fccebb31
commit
61b360ab4f
|
@ -47,6 +47,9 @@ def EqualTypes : Constraint<CPred<"areAnonymousTypesEquivalent($0.getType(), $1.
|
|||
// Constraint that enforces equal type sizes
|
||||
def EqualIntSize : Constraint<CPred<"type_cast<IntType>($0.getType()).getWidth() == type_cast<IntType>($1.getType()).getWidth()">>;
|
||||
|
||||
// Constraint that enforces equal type signedness
|
||||
def EqualSigns : Constraint<CPred<"type_cast<IntType>($0.getType()).isSigned() == type_cast<IntType>($1.getType()).isSigned()">>;
|
||||
|
||||
// sizeof(0) >= sizeof(1)
|
||||
def IntTypeWidthGEQ32 : Constraint<CPred<
|
||||
"type_cast<IntType>($0.getType()).getBitWidthOrSentinel() >= type_cast<IntType>($1.getType()).getBitWidthOrSentinel()">>;
|
||||
|
@ -684,6 +687,12 @@ def CatDoubleConst : Pat <
|
|||
(MoveNameHint $old, (CatPrimOp (CatPrimOp $cst1, (AsUIntPrimOp $cst2)), (AsUIntPrimOp $v))),
|
||||
[(KnownWidth $v), (AnyConstantOp $cst1), (AnyConstantOp $cst2)]>;
|
||||
|
||||
// cat(asUint(x), asUint(y)) -> cat(x,y)
|
||||
def CatCast : Pat <
|
||||
(CatPrimOp:$old (AsUIntPrimOp $x), (AsUIntPrimOp $y)),
|
||||
(MoveNameHint $old, (CatPrimOp $x, $y)),
|
||||
[(EqualSigns $x, $y)]>;
|
||||
|
||||
// regreset(clock, constant_zero, resetValue) -> reg(clock)
|
||||
def RegResetWithZeroReset : Pat<
|
||||
(RegResetOp $clock, $reset, $_, $name, $nameKind, $annotations, $inner_sym, $forceable),
|
||||
|
|
|
@ -1201,7 +1201,7 @@ void DShrPrimOp::getCanonicalizationPatterns(RewritePatternSet &results,
|
|||
|
||||
namespace {
|
||||
// cat(bits(x, ...), bits(x, ...)) -> bits(x ...) when the two ...'s are
|
||||
// consequtive in the input.
|
||||
// consecutive in the input.
|
||||
struct CatBitsBits : public mlir::RewritePattern {
|
||||
CatBitsBits(MLIRContext *context)
|
||||
: RewritePattern(CatPrimOp::getOperationName(), 0, context) {}
|
||||
|
@ -1228,7 +1228,8 @@ struct CatBitsBits : public mlir::RewritePattern {
|
|||
|
||||
void CatPrimOp::getCanonicalizationPatterns(RewritePatternSet &results,
|
||||
MLIRContext *context) {
|
||||
results.insert<CatBitsBits, patterns::CatDoubleConst>(context);
|
||||
results.insert<CatBitsBits, patterns::CatDoubleConst, patterns::CatCast>(
|
||||
context);
|
||||
}
|
||||
|
||||
OpFoldResult BitCastOp::fold(FoldAdaptor adaptor) {
|
||||
|
|
|
@ -455,6 +455,7 @@ firrtl.module @Cat(in %in4: !firrtl.uint<4>,
|
|||
out %out4: !firrtl.uint<4>,
|
||||
out %outcst: !firrtl.uint<8>,
|
||||
out %outcst2: !firrtl.uint<8>,
|
||||
out %outu8: !firrtl.uint<8>,
|
||||
in %in0 : !firrtl.uint<0>,
|
||||
out %outpt1: !firrtl.uint<4>,
|
||||
out %outpt2 : !firrtl.uint<4>) {
|
||||
|
@ -490,6 +491,12 @@ firrtl.module @Cat(in %in4: !firrtl.uint<4>,
|
|||
%9 = firrtl.cat %c0_si2, %sin4 : (!firrtl.sint<2>, !firrtl.sint<4>) -> !firrtl.uint<6>
|
||||
%10 = firrtl.cat %c0_ui2, %9 : (!firrtl.uint<2>, !firrtl.uint<6>) -> !firrtl.uint<8>
|
||||
firrtl.connect %outcst, %10 : !firrtl.uint<8>, !firrtl.uint<8>
|
||||
|
||||
// CHECK: %[[fixedsign:.*]] = firrtl.cat %sin4, %sin4
|
||||
// CHECK-NEXT: firrtl.strictconnect %outu8, %[[fixedsign]]
|
||||
%tcast = firrtl.asUInt %sin4 : (!firrtl.sint<4>) -> !firrtl.uint<4>
|
||||
%11 = firrtl.cat %tcast, %tcast : (!firrtl.uint<4>, !firrtl.uint<4>) -> !firrtl.uint<8>
|
||||
firrtl.strictconnect %outu8, %11 : !firrtl.uint<8>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: firrtl.module @Bits
|
||||
|
|
Loading…
Reference in New Issue