Skip to content

Commit

Permalink
[LLHD] Replace llhd.neg with comb.sub (#1654) (#1678)
Browse files Browse the repository at this point in the history
* [LLHD] Replace llhd.neg with comb.sub (#1654)

* [LLHD][test] remove repeated test for `comb.sub`
  • Loading branch information
anurudhp authored Aug 31, 2021
1 parent ba9c344 commit 34832f4
Show file tree
Hide file tree
Showing 8 changed files with 1 addition and 94 deletions.
27 changes: 0 additions & 27 deletions include/circt/Dialect/LLHD/IR/ArithmeticOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,6 @@
//
//===----------------------------------------------------------------------===//

def LLHD_NegOp : LLHD_ArithmeticOrBitwiseOp<"neg", []> {
let summary = "Negate a value.";
let description = [{
The operand and result always have the same type. The type has to be a
signless integer of any width. Although, only signless integers are
allowed, this instruction applies two's complement negation of the
integer, basically treating it as a signed integer.

Syntax:

```
neg-op ::= ssa-id `=` `llhd.neg` ssa-value attr-dict `:` type
```

Example:

```mlir
%0 = llhd.const 42 : i32
%1 = llhd.neg %0 : i32
```
}];

let arguments = (ins HWIntegerType:$value);

let hasFolder = 1;
}

def LLHD_EqOp : LLHD_Op<"eq", [
NoSideEffect,
Commutative,
Expand Down
27 changes: 1 addition & 26 deletions lib/Conversion/LLHDToLLVM/LLHDToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2062,30 +2062,6 @@ struct CombParityOpConversion : public ConvertToLLVMPattern {

} // namespace

namespace {
/// Convert a NegOp to LLVM dialect.
struct NegOpConversion : public ConvertToLLVMPattern {
explicit NegOpConversion(MLIRContext *ctx, LLVMTypeConverter &typeConverter)
: ConvertToLLVMPattern(llhd::NegOp::getOperationName(), ctx,
typeConverter) {}

LogicalResult
matchAndRewrite(Operation *op, ArrayRef<Value> operands,
ConversionPatternRewriter &rewriter) const override {
NegOpAdaptor transformed(operands);

auto negOne = rewriter.create<LLVM::ConstantOp>(
op->getLoc(), transformed.value().getType(),
rewriter.getI32IntegerAttr(-1));
rewriter.replaceOpWithNewOp<LLVM::MulOp>(op, transformed.value().getType(),
negOne, transformed.value());

return success();
}
};

} // namespace

namespace {
/// Convert an EqOp to LLVM dialect.
struct EqOpConversion : public ConvertToLLVMPattern {
Expand Down Expand Up @@ -2856,8 +2832,7 @@ void circt::populateLLHDToLLVMConversionPatterns(LLVMTypeConverter &converter,
converter);

// Arithmetic conversion patterns.
patterns.add<NegOpConversion, EqOpConversion, NeqOpConversion>(ctx,
converter);
patterns.add<EqOpConversion, NeqOpConversion>(ctx, converter);
patterns.add<CombAddOpConversion, CombSubOpConversion, CombMulOpConversion,
CombDivUOpConversion, CombDivSOpConversion, CombModUOpConversion,
CombModSOpConversion, CombICmpOpConversion, CombSExtOpConversion,
Expand Down
2 changes: 0 additions & 2 deletions lib/Dialect/LLHD/Export/TranslateToVerilog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,6 @@ LogicalResult VerilogPrinter::printOperation(Operation *inst,

return success();
}
if (auto op = dyn_cast<llhd::NegOp>(inst))
return printUnaryOp(inst, "-", indentAmount);
if (auto op = dyn_cast<comb::AddOp>(inst))
return printVariadicOp(inst, "+", indentAmount);
if (auto op = dyn_cast<comb::SubOp>(inst))
Expand Down
8 changes: 0 additions & 8 deletions lib/Dialect/LLHD/IR/LLHDOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,14 +199,6 @@ OpFoldResult llhd::ConstOp::fold(ArrayRef<Attribute> operands) {
return value();
}

//===----------------------------------------------------------------------===//
// NegOp
//===----------------------------------------------------------------------===//

OpFoldResult llhd::NegOp::fold(ArrayRef<Attribute> operands) {
return constFoldUnaryOp<IntegerAttr>(operands, [](APInt a) { return -a; });
}

//===----------------------------------------------------------------------===//
// EqOp
//===----------------------------------------------------------------------===//
Expand Down
16 changes: 0 additions & 16 deletions test/Conversion/LLHDToLLVM/convert_arithmetic.mlir
Original file line number Diff line number Diff line change
@@ -1,22 +1,6 @@
// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py
// RUN: circt-opt %s --convert-llhd-to-llvm | FileCheck %s

// CHECK-LABEL: llvm.func @convert_neg(
// CHECK-SAME: %[[VAL_0:.*]]: i1,
// CHECK-SAME: %[[VAL_1:.*]]: i32) {
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(-1 : i32) : i1
// CHECK: %[[VAL_3:.*]] = llvm.mul %[[VAL_2]], %[[VAL_0]] : i1
// CHECK: %[[VAL_4:.*]] = llvm.mlir.constant(-1 : i32) : i32
// CHECK: %[[VAL_5:.*]] = llvm.mul %[[VAL_4]], %[[VAL_1]] : i32
// CHECK: llvm.return
// CHECK: }
func @convert_neg(%i1 : i1, %i32 : i32) {
%0 = llhd.neg %i1 : i1
%1 = llhd.neg %i32 : i32

return
}

// CHECK-LABEL: llvm.func @convert_eq(
// CHECK-SAME: %[[VAL_0:.*]]: i32,
// CHECK-SAME: %[[VAL_1:.*]]: i32) -> i1 {
Expand Down
10 changes: 0 additions & 10 deletions test/Dialect/LLHD/Canonicalization/arithmetic.mlir
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
// RUN: circt-opt %s -canonicalize='top-down=true region-simplify=true' | FileCheck %s

// CHECK-LABEL: @check_neg_folding
func @check_neg_folding() -> (i16) {
// CHECK-NEXT: %[[NEG:.*]] = llhd.const -5 : i16
%a = llhd.const 5 : i16
%0 = llhd.neg %a : i16

// CHECK-NEXT: return %[[NEG]] : i16
return %0 : i16
}

// CHECK-LABEL: @check_eq_folding
// CHECK-SAME: %[[VAL_0:.*]]: i64,
// CHECK-SAME: %[[VAL_1:.*]]: i1,
Expand Down
2 changes: 0 additions & 2 deletions test/Dialect/LLHD/Export/verilog_arithmetic.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
llhd.entity @check_arithmetic() -> () {
// CHECK-NEXT: wire [63:0] _[[A:.*]] = 64'd42;
%a = llhd.const 42 : i64
// CHECK-NEXT: wire [63:0] _{{.*}} = -_[[A]];
%0 = llhd.neg %a : i64

// CHECK-NEXT: wire [63:0] _{{.*}} = _[[A]];
%1 = comb.add %a : i64
Expand Down
3 changes: 0 additions & 3 deletions test/Dialect/LLHD/IR/arithmetic.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
// CHECK-SAME: %[[ARR:.*]]: !hw.array<3xi32>
// CHECK-SAME: %[[TUP:.*]]: !hw.struct<foo: i1, bar: i2, baz: i3>
func @check_arithmetic(%a : i64, %array : !hw.array<3xi32>, %tup : !hw.struct<foo: i1, bar: i2, baz: i3>) -> () {
// CHECK-NEXT: %{{.*}} = llhd.neg %[[A]] : i64
%0 = llhd.neg %a : i64

// CHECK-NEXT: %{{.*}} = llhd.neq %[[A]], %[[A]] : i64
%2 = llhd.neq %a, %a : i64
// CHECK-NEXT: %{{.*}} = llhd.neq %[[ARR]], %[[ARR]] : !hw.array<3xi32>
Expand Down

0 comments on commit 34832f4

Please sign in to comment.