Skip to content

Commit

Permalink
[MLIR][EmitC] Remove struct related macros from ops_emitc.h (iree-org…
Browse files Browse the repository at this point in the history
…#18081)

This removes struct related helper macros by using the member operations
of the EmitC dialect which were added with
llvm/llvm-project#98460.

Signed-off-by: Simon Camphausen <[email protected]>
  • Loading branch information
simon-camp committed Aug 8, 2024
1 parent 4bea50e commit 8545650
Show file tree
Hide file tree
Showing 14 changed files with 295 additions and 276 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1095,10 +1095,15 @@ LogicalResult createAPIFunctions(IREE::VM::ModuleOp moduleOp,
// Set function pointers
for (std::string funcName :
{"destroy", "alloc_state", "free_state", "resolve_import"}) {
// The type doesn't matter, the result gets inlined into it's uses anyway.
Type type = emitc::PointerType::get(emitc::OpaqueType::get(ctx, "void"));

Value funcPtr = builder.create<emitc::LiteralOp>(
loc, type, moduleName + "_" + funcName);
emitc_builders::structMemberAssign(builder, loc,
/*memberName=*/funcName,
/*operand=*/vmModule,
/*value=*/moduleName + "_" + funcName);
/*value=*/funcPtr);
}

std::string descriptorPtr = "&" + moduleName + "_descriptor_";
Expand Down Expand Up @@ -1910,23 +1915,17 @@ class ExportOpConversion : public EmitCConversionPattern<IREE::VM::ExportOp> {
auto value = argumentStruct.value.value();

if (llvm::isa<IREE::VM::RefType>(input.value())) {
Type ptrType = emitc::PointerType::get(
auto ptrType = emitc::PointerType::get(
emitc::OpaqueType::get(ctx, "iree_vm_ref_t"));
std::string memberName = "arg" + std::to_string(input.index());
auto memberPtr = rewriter.create<emitc::CallOpaqueOp>(
/*location=*/loc,
/*type=*/ptrType,
/*callee=*/"EMITC_STRUCT_PTR_MEMBER_ADDRESS",
/*operands=*/ArrayRef<Value>{value},
/*args=*/
ArrayAttr::get(ctx, {rewriter.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName)}));
auto memberPtr = emitc_builders::structPtrMemberAddress(
rewriter, loc, ptrType, memberName, value);
rewriter.create<emitc::CallOpaqueOp>(
/*location=*/memberPtr.getLoc(),
/*type=*/TypeRange{},
/*callee=*/"iree_vm_ref_retain_inplace",
/*operands=*/ArrayRef<Value>{memberPtr.getResult(0)});
argumentStruct.callArguments.push_back(memberPtr.getResult(0));
/*operands=*/ArrayRef<Value>{memberPtr});
argumentStruct.callArguments.push_back(memberPtr);
} else {
Type memberType = input.value();
std::string memberName = "arg" + std::to_string(input.index());
Expand All @@ -1945,7 +1944,6 @@ class ExportOpConversion : public EmitCConversionPattern<IREE::VM::ExportOp> {
LogicalResult unpackResults(ConversionPatternRewriter &rewriter,
IREE::VM::ExportOp &exportOp,
GeneratedStruct &resultStruct) const {
auto ctx = exportOp.getContext();
auto loc = exportOp.getLoc();

// The struct is empty, nothing to do.
Expand All @@ -1966,18 +1964,12 @@ class ExportOpConversion : public EmitCConversionPattern<IREE::VM::ExportOp> {
assert(resultStruct.value.has_value());
auto value = resultStruct.value.value();

Type ptrType = typeConverter->convertTypeAsPointer(result.value());
auto ptrType = typeConverter->convertTypeAsPointer(result.value());

std::string memberName = "res" + std::to_string(result.index());
auto memberPtr = rewriter.create<emitc::CallOpaqueOp>(
/*location=*/loc,
/*type=*/ptrType,
/*callee=*/"EMITC_STRUCT_PTR_MEMBER_ADDRESS",
/*operands=*/ArrayRef<Value>{value},
/*args=*/
ArrayAttr::get(ctx, {rewriter.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName)}));
resultStruct.callArguments.push_back(memberPtr.getResult(0));
Value memberPtr = emitc_builders::structPtrMemberAddress(
rewriter, loc, ptrType, memberName, value);
resultStruct.callArguments.push_back(memberPtr);
}

return success();
Expand Down Expand Up @@ -2272,19 +2264,11 @@ class ImportOpConverter {
auto ctx = builder.getContext();

// byteSpan = call.<memberName>;
auto byteSpan =
builder
.create<emitc::CallOpaqueOp>(
/*location=*/loc,
/*type=*/
emitc::PointerType::get(
emitc::OpaqueType::get(ctx, "iree_byte_span_t")),
/*callee=*/"EMITC_STRUCT_MEMBER_ADDRESS",
/*operands=*/ArrayRef<Value>{call},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName)}))
.getResult(0);
auto byteSpan = emitc_builders::structMemberAddress(
builder, loc,
emitc::PointerType::get(
emitc::OpaqueType::get(ctx, "iree_byte_span_t")),
memberName, call);

// void *byteSpan_data_void = iree_alloca(size);
auto byteSpanDataVoid =
Expand Down Expand Up @@ -2480,20 +2464,19 @@ class ImportOpConverter {
/*memberName=*/"module",
/*operand=*/import);

// The type doesn't matter, the result gets inlined into it's uses anyway.
emitc::PointerType type =
emitc::PointerType::get(emitc::OpaqueType::get(ctx, "void"));

Value beginCall = builder.create<emitc::MemberOfPtrOp>(
loc, type, "begin_call", importModule);

returnIfError(
/*rewriter=*/builder,
/*location=*/loc,
/*callee=*/"EMITC_STRUCT_PTR_MEMBER_CALL",
/*args=*/
ArrayAttr::get(ctx,
{
builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, "begin_call"),
builder.getIndexAttr(0),
builder.getIndexAttr(1),
builder.getIndexAttr(2),
}),
/*operands=*/ArrayRef<Value>{importModule, stack, call},
/*callee=*/"EMITC_CALL_INDIRECT",
/*args=*/{},
/*operands=*/ArrayRef<Value>{beginCall, importModule, stack, call},
typeConverter.analysis);

return success();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,74 +211,50 @@ void structDefinition(OpBuilder builder, Location location,

Value structMember(OpBuilder builder, Location location, Type type,
StringRef memberName, Value operand) {
auto ctx = builder.getContext();
return builder
.create<emitc::CallOpaqueOp>(
/*location=*/location,
/*type=*/type,
/*callee=*/"EMITC_STRUCT_MEMBER",
/*operands=*/ArrayRef<Value>{operand},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName)}))
.getResult(0);
Value var = allocateVariable(builder, location, type);
Value member =
builder.create<emitc::MemberOp>(location, type, memberName, operand);
builder.create<emitc::AssignOp>(location, var, member);
return var;
}

void structMemberAssign(OpBuilder builder, Location location,
StringRef memberName, Value operand, Value data) {
auto ctx = builder.getContext();
builder.create<emitc::CallOpaqueOp>(
/*location=*/location,
/*type=*/TypeRange{},
/*callee=*/"EMITC_STRUCT_MEMBER_ASSIGN",
/*operands=*/ArrayRef<Value>{operand, data},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName),
builder.getIndexAttr(1)}));
Value structMemberAddress(OpBuilder builder, Location location,
emitc::PointerType type, StringRef memberName,
Value operand) {
Value member = builder.create<emitc::MemberOp>(location, type.getPointee(),
memberName, operand);
return addressOf(builder, location, member);
}

void structMemberAssign(OpBuilder builder, Location location,
StringRef memberName, Value operand, StringRef data) {
auto ctx = builder.getContext();
builder.create<emitc::CallOpaqueOp>(
/*location=*/location,
/*type=*/TypeRange{},
/*callee=*/"EMITC_STRUCT_MEMBER_ASSIGN",
/*operands=*/ArrayRef<Value>{operand},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName),
emitc::OpaqueAttr::get(ctx, data)}));
StringRef memberName, Value operand, Value data) {
Value member = builder.create<emitc::MemberOp>(location, data.getType(),
memberName, operand);
builder.create<emitc::AssignOp>(location, member, data);
}

Value structPtrMember(OpBuilder builder, Location location, Type type,
StringRef memberName, Value operand) {
auto ctx = builder.getContext();
return builder
.create<emitc::CallOpaqueOp>(
/*location=*/location,
/*type=*/type,
/*callee=*/"EMITC_STRUCT_PTR_MEMBER",
/*operands=*/ArrayRef<Value>{operand},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName)}))
.getResult(0);
Value var = allocateVariable(builder, location, type);
Value member =
builder.create<emitc::MemberOfPtrOp>(location, type, memberName, operand);
builder.create<emitc::AssignOp>(location, var, member);
return var;
}

Value structPtrMemberAddress(OpBuilder builder, Location location,
emitc::PointerType type, StringRef memberName,
Value operand) {
Value member = builder.create<emitc::MemberOfPtrOp>(
location, type.getPointee(), memberName, operand);
return addressOf(builder, location, member);
}

void structPtrMemberAssign(OpBuilder builder, Location location,
StringRef memberName, Value operand, Value data) {
auto ctx = builder.getContext();
builder.create<emitc::CallOpaqueOp>(
/*location=*/location,
/*type=*/TypeRange{},
/*callee=*/"EMITC_STRUCT_PTR_MEMBER_ASSIGN",
/*operands=*/ArrayRef<Value>{operand, data},
/*args=*/
ArrayAttr::get(ctx, {builder.getIndexAttr(0),
emitc::OpaqueAttr::get(ctx, memberName),
builder.getIndexAttr(1)}));
Value member = builder.create<emitc::MemberOfPtrOp>(location, data.getType(),
memberName, operand);
builder.create<emitc::AssignOp>(location, member, data);
}

Value ireeMakeCstringView(OpBuilder builder, Location location,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ void structDefinition(OpBuilder builder, Location location,
Value structMember(OpBuilder builder, Location location, Type type,
StringRef memberName, Value operand);

Value structMemberAddress(OpBuilder builder, Location location,
emitc::PointerType type, StringRef memberName,
Value operand);

void structMemberAssign(OpBuilder builder, Location location,
StringRef memberName, Value operand, Value data);

Expand All @@ -128,6 +132,10 @@ void structMemberAssign(OpBuilder builder, Location location,
Value structPtrMember(OpBuilder builder, Location location, Type type,
StringRef memberName, Value operand);

Value structPtrMemberAddress(OpBuilder builder, Location location,
emitc::PointerType type, StringRef memberName,
Value operand);

void structPtrMemberAssign(OpBuilder builder, Location location,
StringRef memberName, Value operand, Value data);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Type EmitCTypeConverter::convertTypeAsNonPointer(Type type) const {
return convertedType;
}

Type EmitCTypeConverter::convertTypeAsPointer(Type type) const {
emitc::PointerType EmitCTypeConverter::convertTypeAsPointer(Type type) const {
return emitc::PointerType::get(convertTypeAsNonPointer(type));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class EmitCTypeConverter : public mlir::TypeConverter {
// This is the same as convertType, but returns `iree_vm_ref_t` rather than a
// pointer to it for `vm.ref` types.
Type convertTypeAsNonPointer(Type type) const;
Type convertTypeAsPointer(Type type) const;
emitc::PointerType convertTypeAsPointer(Type type) const;
emitc::OpaqueType convertTypeAsCType(Type type) const;

SetVector<Operation *> sourceMaterializations;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ vm.module @my_module {
// CHECK-DAG: %[[ALIGNMENT:.+]] = "emitc.constant"() <{value = 32 : i32}> : () -> i32
// CHECK-DAG: %[[BUFFER:.+]] = "emitc.variable"() <{value = #emitc.opaque<"NULL">}> : () -> !emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>
// CHECK-DAG: %[[BUFFER_PTR:.+]] = emitc.apply "&"(%[[BUFFER]]) : (!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>) -> !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>
// CHECK-DAG: %[[ALLOCTOR:.+]] = emitc.call_opaque "EMITC_STRUCT_PTR_MEMBER"(%arg2) {args = [0 : index, #emitc.opaque<"allocator">]} : (!emitc.ptr<!emitc.opaque<"struct my_module_state_t">>) -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[ALLOCATOR_VAR:.+]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[ALLOCATOR:.+]] = "emitc.member_of_ptr"(%arg2) <{member = "allocator"}> : (!emitc.ptr<!emitc.opaque<"struct my_module_state_t">>) -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: emitc.assign %[[ALLOCATOR]] : !emitc.opaque<"iree_allocator_t"> to %[[ALLOCATOR_VAR]] : !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[BUFFER_ACCESS:.+]] = "emitc.constant"() <{value = #emitc.opaque<"IREE_VM_BUFFER_ACCESS_MUTABLE | IREE_VM_BUFFER_ACCESS_ORIGIN_GUEST">}> : () -> !emitc.opaque<"iree_vm_buffer_access_t">
// CHECK-NEXT: %[[STATUS:.+]] = emitc.call_opaque "iree_vm_buffer_create"(%[[BUFFER_ACCESS]], %[[SIZE]], %[[ALIGNMENT]], %[[ALLOCTOR]], %[[BUFFER_PTR]]) : (!emitc.opaque<"iree_vm_buffer_access_t">, i64, i32, !emitc.opaque<"iree_allocator_t">, !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>) -> !emitc.opaque<"iree_status_t">
// CHECK-NEXT: %[[STATUS:.+]] = emitc.call_opaque "iree_vm_buffer_create"(%[[BUFFER_ACCESS]], %[[SIZE]], %[[ALIGNMENT]], %[[ALLOCATOR_VAR]], %[[BUFFER_PTR]]) : (!emitc.opaque<"iree_vm_buffer_access_t">, i64, i32, !emitc.opaque<"iree_allocator_t">, !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>) -> !emitc.opaque<"iree_status_t">

// CHECK: %[[BUFFER_TYPE_ID:.+]] = emitc.call_opaque "iree_vm_buffer_type"() : () -> !emitc.opaque<"iree_vm_ref_type_t">
// CHECK-NEXT: %[[STATUS2:.+]] = emitc.call_opaque "iree_vm_ref_wrap_assign"(%[[BUFFER]], %[[BUFFER_TYPE_ID]], %1) : (!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>, !emitc.opaque<"iree_vm_ref_type_t">, !emitc.ptr<!emitc.opaque<"iree_vm_ref_t">>) -> !emitc.opaque<"iree_status_t">
Expand All @@ -32,12 +34,13 @@ vm.module @my_module {

// CHECK: %[[BUFFER:.+]] = "emitc.variable"() <{value = #emitc.opaque<"NULL">}> : () -> !emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>
// CHECK-DAG: %[[BUFFER_PTR:.+]] = emitc.apply "&"(%[[BUFFER]]) : (!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>) -> !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>
// CHECK-DAG: %[[ALLOCATOR:.+]] = emitc.call_opaque "EMITC_STRUCT_PTR_MEMBER"(%arg2) {args = [0 : index, #emitc.opaque<"allocator">]} : (!emitc.ptr<!emitc.opaque<"struct my_module_state_t">>) -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[ALLOCATOR_VAR:.+]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[ALLOCATOR:.+]] = "emitc.member_of_ptr"(%arg2) <{member = "allocator"}> : (!emitc.ptr<!emitc.opaque<"struct my_module_state_t">>) -> !emitc.opaque<"iree_allocator_t">
// CHECK-DAG: %[[BUFFER_ACCESS:.+]] = "emitc.constant"() <{value = #emitc.opaque<"IREE_VM_BUFFER_ACCESS_MUTABLE | IREE_VM_BUFFER_ACCESS_ORIGIN_GUEST">}> : () -> !emitc.opaque<"iree_vm_buffer_access_t">
// CHECK-DAG: %[[BUFFER_REF2:.+]] = emitc.apply "*"(%arg3) : (!emitc.ptr<!emitc.opaque<"iree_vm_ref_t">>) -> !emitc.opaque<"iree_vm_ref_t">
// CHECK-DAG: %[[BUFFER_PTR2:.+]] = emitc.call_opaque "iree_vm_buffer_deref"(%[[BUFFER_REF2]]) : (!emitc.opaque<"iree_vm_ref_t">) -> !emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>

// CHECK: %[[STATUS:.+]] = emitc.call_opaque "iree_vm_buffer_clone"(%[[BUFFER_ACCESS]], %[[BUFFER_PTR2]], %[[C0]], %[[C32]], %[[ALIGNMENT]], %[[ALLOCATOR]], %[[BUFFER_PTR]]) : (!emitc.opaque<"iree_vm_buffer_access_t">, !emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>, i64, i64, i32, !emitc.opaque<"iree_allocator_t">, !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>) -> !emitc.opaque<"iree_status_t">
// CHECK: %[[STATUS:.+]] = emitc.call_opaque "iree_vm_buffer_clone"(%[[BUFFER_ACCESS]], %[[BUFFER_PTR2]], %[[C0]], %[[C32]], %[[ALIGNMENT]], %[[ALLOCATOR_VAR]], %[[BUFFER_PTR]]) : (!emitc.opaque<"iree_vm_buffer_access_t">, !emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>, i64, i64, i32, !emitc.opaque<"iree_allocator_t">, !emitc.ptr<!emitc.ptr<!emitc.opaque<"iree_vm_buffer_t">>>) -> !emitc.opaque<"iree_status_t">
%c0 = vm.const.i64 0
%c32 = vm.const.i64 32
%alignment = vm.const.i32 64
Expand Down
Loading

0 comments on commit 8545650

Please sign in to comment.