mirror of https://github.com/llvm/circt.git
108 lines
3.0 KiB
MLIR
108 lines
3.0 KiB
MLIR
// RUN: circt-opt -inline %s | FileCheck %s
|
|
|
|
// Test whether the _pure_ ops in the `hw` dialect can be inlined by the
|
|
// upstream pass. See: `HWInlinerInterface::isLegalToInline`
|
|
|
|
!struct = !hw.struct<a: i4, b: i4>
|
|
!enum = !hw.enum<A, B>
|
|
!array = !hw.array<4xi1>
|
|
!double_array = !hw.array<8xi1>
|
|
!union = !hw.union<a: i4, b: i8>
|
|
|
|
func.func @constant() -> i4 {
|
|
%0 = hw.constant 1 : i4
|
|
return %0 : i4
|
|
}
|
|
|
|
func.func @aggregate_constant() -> !struct {
|
|
%0 = hw.aggregate_constant [0 : i4, 1 : i4] : !struct
|
|
return %0 : !struct
|
|
}
|
|
|
|
func.func @enum_constant() -> !enum {
|
|
%0 = hw.enum.constant A : !enum
|
|
return %0 : !enum
|
|
}
|
|
|
|
func.func @bitcast(%arg : i4) -> !array {
|
|
%0 = hw.bitcast %arg : (i4) -> !array
|
|
return %0 : !array
|
|
}
|
|
|
|
func.func @array_create(%arg : i1) -> !array {
|
|
%0 = hw.array_create %arg, %arg, %arg, %arg : i1
|
|
return %0 : !array
|
|
}
|
|
|
|
func.func @array_concat(%arg : !array) -> !double_array {
|
|
%0 = hw.array_concat %arg, %arg : !array, !array
|
|
return %0 : !double_array
|
|
}
|
|
|
|
func.func @array_slice(%arg : !double_array) -> !array {
|
|
%0 = hw.constant 2 : i3
|
|
%1 = hw.array_slice %arg[%0] : (!double_array) -> !array
|
|
return %1 : !array
|
|
}
|
|
|
|
func.func @array_get(%arg : !array) -> i1 {
|
|
%0 = hw.constant 0 : i2
|
|
%1 = hw.array_get %arg[%0] : !array, i2
|
|
return %1 : i1
|
|
}
|
|
|
|
func.func @struct_create(%arg : i4) -> !struct {
|
|
%0 = hw.struct_create(%arg, %arg) : !struct
|
|
return %0 : !struct
|
|
}
|
|
|
|
func.func @struct_explode(%arg : !struct) -> i4 {
|
|
%0:2 = hw.struct_explode %arg : !struct
|
|
return %0#1 : i4
|
|
}
|
|
|
|
func.func @struct_extract(%arg : !struct) -> i4 {
|
|
%0 = hw.struct_extract %arg["a"] : !struct
|
|
return %0 : i4
|
|
}
|
|
|
|
func.func @struct_inject(%arg0 : !struct, %arg1 : i4) -> !struct {
|
|
%0 = hw.struct_inject %arg0["b"], %arg1 : !struct
|
|
return %0 : !struct
|
|
}
|
|
|
|
func.func @union_create(%arg : i4) -> !union {
|
|
%0 = hw.union_create "a", %arg : !union
|
|
return %0 : !union
|
|
}
|
|
|
|
func.func @union_extract(%arg : !union) -> i4 {
|
|
%0 = hw.union_extract %arg["a"] : !union
|
|
return %0 : i4
|
|
}
|
|
|
|
// CHECK-LABEL: @test_inliner
|
|
func.func @test_inliner() ->
|
|
(i4, !struct, !enum, !array, !array, !double_array, !array, i1, !struct,
|
|
i4, i4, !struct, !union, i4) {
|
|
// CHECK-NOT: {{.*}} = call
|
|
%true = hw.constant true
|
|
%0 = call @constant() : () -> i4
|
|
%1 = call @aggregate_constant() : () -> !struct
|
|
%2 = call @enum_constant() : () -> !enum
|
|
%3 = call @bitcast(%0) : (i4) -> !array
|
|
%4 = call @array_create(%true) : (i1) -> !array
|
|
%5 = call @array_concat(%4) : (!array) -> !double_array
|
|
%6 = call @array_slice(%5) : (!double_array) -> !array
|
|
%7 = call @array_get(%6) : (!array) -> i1
|
|
%8 = call @struct_create(%0) : (i4) -> !struct
|
|
%9 = call @struct_explode(%8) : (!struct) -> i4
|
|
%10 = call @struct_extract(%8) : (!struct) -> i4
|
|
%11 = call @struct_inject(%8, %9) : (!struct, i4) -> !struct
|
|
%12 = call @union_create(%0) : (i4) -> !union
|
|
%13 = call @union_extract(%12) : (!union) -> i4
|
|
return %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13 :
|
|
i4, !struct, !enum, !array, !array, !double_array, !array, i1, !struct,
|
|
i4, i4, !struct, !union, i4
|
|
}
|