2024-07-18 15:20:57 +02:00

554 lines
21 KiB
C

//===- rewrite.c - Test of the rewriting C API ----------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// RUN: mlir-capi-rewrite-test 2>&1 | FileCheck %s
#include "mlir-c/Rewrite.h"
#include "mlir-c/BuiltinTypes.h"
#include "mlir-c/IR.h"
#include <assert.h>
#include <stdio.h>
MlirOperation createOperationWithName(MlirContext ctx, const char *name) {
MlirStringRef nameRef = mlirStringRefCreateFromCString(name);
MlirLocation loc = mlirLocationUnknownGet(ctx);
MlirOperationState state = mlirOperationStateGet(nameRef, loc);
MlirType indexType = mlirIndexTypeGet(ctx);
mlirOperationStateAddResults(&state, 1, &indexType);
return mlirOperationCreate(&state);
}
void testInsertionPoint(MlirContext ctx) {
// CHECK-LABEL: @testInsertionPoint
fprintf(stderr, "@testInsertionPoint\n");
const char *moduleString = "\"dialect.op1\"() : () -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
MlirOperation op1 = mlirBlockGetFirstOperation(body);
// IRRewriter create
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
// Insert before op
mlirRewriterBaseSetInsertionPointBefore(rewriter, op1);
MlirOperation op2 = createOperationWithName(ctx, "dialect.op2");
mlirRewriterBaseInsert(rewriter, op2);
// Insert after op
mlirRewriterBaseSetInsertionPointAfter(rewriter, op2);
MlirOperation op3 = createOperationWithName(ctx, "dialect.op3");
mlirRewriterBaseInsert(rewriter, op3);
MlirValue op3Res = mlirOperationGetResult(op3, 0);
// Insert after value
mlirRewriterBaseSetInsertionPointAfterValue(rewriter, op3Res);
MlirOperation op4 = createOperationWithName(ctx, "dialect.op4");
mlirRewriterBaseInsert(rewriter, op4);
// Insert at beginning of block
mlirRewriterBaseSetInsertionPointToStart(rewriter, body);
MlirOperation op5 = createOperationWithName(ctx, "dialect.op5");
mlirRewriterBaseInsert(rewriter, op5);
// Insert at end of block
mlirRewriterBaseSetInsertionPointToEnd(rewriter, body);
MlirOperation op6 = createOperationWithName(ctx, "dialect.op6");
mlirRewriterBaseInsert(rewriter, op6);
// Get insertion blocks
MlirBlock block1 = mlirRewriterBaseGetBlock(rewriter);
MlirBlock block2 = mlirRewriterBaseGetInsertionBlock(rewriter);
(void)block1;
(void)block2;
assert(body.ptr == block1.ptr);
assert(body.ptr == block2.ptr);
// clang-format off
// CHECK-NEXT: module {
// CHECK-NEXT: %{{.*}} = "dialect.op5"() : () -> index
// CHECK-NEXT: %{{.*}} = "dialect.op2"() : () -> index
// CHECK-NEXT: %{{.*}} = "dialect.op3"() : () -> index
// CHECK-NEXT: %{{.*}} = "dialect.op4"() : () -> index
// CHECK-NEXT: "dialect.op1"() : () -> ()
// CHECK-NEXT: %{{.*}} = "dialect.op6"() : () -> index
// CHECK-NEXT: }
// clang-format on
mlirOperationDump(op);
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testCreateBlock(MlirContext ctx) {
// CHECK-LABEL: @testCreateBlock
fprintf(stderr, "@testCreateBlock\n");
const char *moduleString = "\"dialect.op1\"() ({^bb0:}) : () -> ()\n"
"\"dialect.op2\"() ({^bb0:}) : () -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
MlirOperation op1 = mlirBlockGetFirstOperation(body);
MlirRegion region1 = mlirOperationGetRegion(op1, 0);
MlirBlock block1 = mlirRegionGetFirstBlock(region1);
MlirOperation op2 = mlirOperationGetNextInBlock(op1);
MlirRegion region2 = mlirOperationGetRegion(op2, 0);
MlirBlock block2 = mlirRegionGetFirstBlock(region2);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
// Create block before
MlirType indexType = mlirIndexTypeGet(ctx);
MlirLocation unknown = mlirLocationUnknownGet(ctx);
mlirRewriterBaseCreateBlockBefore(rewriter, block1, 1, &indexType, &unknown);
mlirRewriterBaseSetInsertionPointToEnd(rewriter, body);
// Clone operation
mlirRewriterBaseClone(rewriter, op1);
// Clone without regions
mlirRewriterBaseCloneWithoutRegions(rewriter, op1);
// Clone region before
mlirRewriterBaseCloneRegionBefore(rewriter, region1, block2);
mlirOperationDump(op);
// clang-format off
// CHECK-NEXT: "builtin.module"() ({
// CHECK-NEXT: "dialect.op1"() ({
// CHECK-NEXT: ^{{.*}}(%{{.*}}: index):
// CHECK-NEXT: ^{{.*}}:
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op2"() ({
// CHECK-NEXT: ^{{.*}}(%{{.*}}: index):
// CHECK-NEXT: ^{{.*}}:
// CHECK-NEXT: ^{{.*}}:
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op1"() ({
// CHECK-NEXT: ^{{.*}}(%{{.*}}: index):
// CHECK-NEXT: ^{{.*}}:
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op1"() ({
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: }) : () -> ()
// clang-format on
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testInlineRegionBlock(MlirContext ctx) {
// CHECK-LABEL: @testInlineRegionBlock
fprintf(stderr, "@testInlineRegionBlock\n");
const char *moduleString =
"\"dialect.op1\"() ({\n"
" ^bb0(%arg0: index):\n"
" \"dialect.op1_in1\"(%arg0) [^bb1] : (index) -> ()\n"
" ^bb1():\n"
" \"dialect.op1_in2\"() : () -> ()\n"
"}) : () -> ()\n"
"\"dialect.op2\"() ({^bb0:}) : () -> ()\n"
"\"dialect.op3\"() ({\n"
" ^bb0(%arg0: index):\n"
" \"dialect.op3_in1\"(%arg0) : (index) -> ()\n"
" ^bb1():\n"
" %x = \"dialect.op3_in2\"() : () -> index\n"
" %y = \"dialect.op3_in3\"() : () -> index\n"
"}) : () -> ()\n"
"\"dialect.op4\"() ({\n"
" ^bb0():\n"
" \"dialect.op4_in1\"() : () -> index\n"
" ^bb1(%arg0: index):\n"
" \"dialect.op4_in2\"(%arg0) : (index) -> ()\n"
"}) : () -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
MlirOperation op1 = mlirBlockGetFirstOperation(body);
MlirRegion region1 = mlirOperationGetRegion(op1, 0);
MlirOperation op2 = mlirOperationGetNextInBlock(op1);
MlirRegion region2 = mlirOperationGetRegion(op2, 0);
MlirBlock block2 = mlirRegionGetFirstBlock(region2);
MlirOperation op3 = mlirOperationGetNextInBlock(op2);
MlirRegion region3 = mlirOperationGetRegion(op3, 0);
MlirBlock block3_1 = mlirRegionGetFirstBlock(region3);
MlirBlock block3_2 = mlirBlockGetNextInRegion(block3_1);
MlirOperation op3_in2 = mlirBlockGetFirstOperation(block3_2);
MlirValue op3_in2_res = mlirOperationGetResult(op3_in2, 0);
MlirOperation op3_in3 = mlirOperationGetNextInBlock(op3_in2);
MlirOperation op4 = mlirOperationGetNextInBlock(op3);
MlirRegion region4 = mlirOperationGetRegion(op4, 0);
MlirBlock block4_1 = mlirRegionGetFirstBlock(region4);
MlirOperation op4_in1 = mlirBlockGetFirstOperation(block4_1);
MlirValue op4_in1_res = mlirOperationGetResult(op4_in1, 0);
MlirBlock block4_2 = mlirBlockGetNextInRegion(block4_1);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
// Test these three functions
mlirRewriterBaseInlineRegionBefore(rewriter, region1, block2);
mlirRewriterBaseInlineBlockBefore(rewriter, block3_1, op3_in3, 1,
&op3_in2_res);
mlirRewriterBaseMergeBlocks(rewriter, block4_2, block4_1, 1, &op4_in1_res);
mlirOperationDump(op);
// clang-format off
// CHECK-NEXT: "builtin.module"() ({
// CHECK-NEXT: "dialect.op1"() ({
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op2"() ({
// CHECK-NEXT: ^{{.*}}(%{{.*}}: index):
// CHECK-NEXT: "dialect.op1_in1"(%{{.*}})[^[[bb:.*]]] : (index) -> ()
// CHECK-NEXT: ^[[bb]]:
// CHECK-NEXT: "dialect.op1_in2"() : () -> ()
// CHECK-NEXT: ^{{.*}}: // no predecessors
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op3"() ({
// CHECK-NEXT: %{{.*}} = "dialect.op3_in2"() : () -> index
// CHECK-NEXT: "dialect.op3_in1"(%{{.*}}) : (index) -> ()
// CHECK-NEXT: %{{.*}} = "dialect.op3_in3"() : () -> index
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op4"() ({
// CHECK-NEXT: %{{.*}} = "dialect.op4_in1"() : () -> index
// CHECK-NEXT: "dialect.op4_in2"(%{{.*}}) : (index) -> ()
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: }) : () -> ()
// clang-format on
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testReplaceOp(MlirContext ctx) {
// CHECK-LABEL: @testReplaceOp
fprintf(stderr, "@testReplaceOp\n");
const char *moduleString =
"%x, %y, %z = \"dialect.create_values\"() : () -> (index, index, index)\n"
"%x_1, %y_1 = \"dialect.op1\"() : () -> (index, index)\n"
"\"dialect.use_op1\"(%x_1, %y_1) : (index, index) -> ()\n"
"%x_2, %y_2 = \"dialect.op2\"() : () -> (index, index)\n"
"%x_3, %y_3 = \"dialect.op3\"() : () -> (index, index)\n"
"\"dialect.use_op2\"(%x_2, %y_2) : (index, index) -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
// get a handle to all operations/values
MlirOperation createValues = mlirBlockGetFirstOperation(body);
MlirValue x = mlirOperationGetResult(createValues, 0);
MlirValue z = mlirOperationGetResult(createValues, 2);
MlirOperation op1 = mlirOperationGetNextInBlock(createValues);
MlirOperation useOp1 = mlirOperationGetNextInBlock(op1);
MlirOperation op2 = mlirOperationGetNextInBlock(useOp1);
MlirOperation op3 = mlirOperationGetNextInBlock(op2);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
// Test replace op with values
MlirValue xz[2] = {x, z};
mlirRewriterBaseReplaceOpWithValues(rewriter, op1, 2, xz);
// Test replace op with op
mlirRewriterBaseReplaceOpWithOperation(rewriter, op2, op3);
mlirOperationDump(op);
// clang-format off
// CHECK-NEXT: module {
// CHECK-NEXT: %[[res:.*]]:3 = "dialect.create_values"() : () -> (index, index, index)
// CHECK-NEXT: "dialect.use_op1"(%[[res]]#0, %[[res]]#2) : (index, index) -> ()
// CHECK-NEXT: %[[res2:.*]]:2 = "dialect.op3"() : () -> (index, index)
// CHECK-NEXT: "dialect.use_op2"(%[[res2]]#0, %[[res2]]#1) : (index, index) -> ()
// CHECK-NEXT: }
// clang-format on
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testErase(MlirContext ctx) {
// CHECK-LABEL: @testErase
fprintf(stderr, "@testErase\n");
const char *moduleString = "\"dialect.op_to_erase\"() : () -> ()\n"
"\"dialect.op2\"() ({\n"
"^bb0():\n"
" \"dialect.op2_nested\"() : () -> ()"
"^block_to_erase():\n"
" \"dialect.op2_nested\"() : () -> ()"
"^bb1():\n"
" \"dialect.op2_nested\"() : () -> ()"
"}) : () -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
// get a handle to all operations/values
MlirOperation opToErase = mlirBlockGetFirstOperation(body);
MlirOperation op2 = mlirOperationGetNextInBlock(opToErase);
MlirRegion op2Region = mlirOperationGetRegion(op2, 0);
MlirBlock bb0 = mlirRegionGetFirstBlock(op2Region);
MlirBlock blockToErase = mlirBlockGetNextInRegion(bb0);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
mlirRewriterBaseEraseOp(rewriter, opToErase);
mlirRewriterBaseEraseBlock(rewriter, blockToErase);
mlirOperationDump(op);
// CHECK-NEXT: module {
// CHECK-NEXT: "dialect.op2"() ({
// CHECK-NEXT: "dialect.op2_nested"() : () -> ()
// CHECK-NEXT: ^{{.*}}:
// CHECK-NEXT: "dialect.op2_nested"() : () -> ()
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: }
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testMove(MlirContext ctx) {
// CHECK-LABEL: @testMove
fprintf(stderr, "@testMove\n");
const char *moduleString = "\"dialect.op1\"() : () -> ()\n"
"\"dialect.op2\"() ({\n"
"^bb0(%arg0: index):\n"
" \"dialect.op2_1\"(%arg0) : (index) -> ()"
"^bb1(%arg1: index):\n"
" \"dialect.op2_2\"(%arg1) : (index) -> ()"
"}) : () -> ()\n"
"\"dialect.op3\"() : () -> ()\n"
"\"dialect.op4\"() : () -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
// get a handle to all operations/values
MlirOperation op1 = mlirBlockGetFirstOperation(body);
MlirOperation op2 = mlirOperationGetNextInBlock(op1);
MlirOperation op3 = mlirOperationGetNextInBlock(op2);
MlirOperation op4 = mlirOperationGetNextInBlock(op3);
MlirRegion region2 = mlirOperationGetRegion(op2, 0);
MlirBlock block0 = mlirRegionGetFirstBlock(region2);
MlirBlock block1 = mlirBlockGetNextInRegion(block0);
// Test move operations.
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
mlirRewriterBaseMoveOpBefore(rewriter, op3, op1);
mlirRewriterBaseMoveOpAfter(rewriter, op4, op1);
mlirRewriterBaseMoveBlockBefore(rewriter, block1, block0);
mlirOperationDump(op);
// CHECK-NEXT: module {
// CHECK-NEXT: "dialect.op3"() : () -> ()
// CHECK-NEXT: "dialect.op1"() : () -> ()
// CHECK-NEXT: "dialect.op4"() : () -> ()
// CHECK-NEXT: "dialect.op2"() ({
// CHECK-NEXT: ^{{.*}}(%[[arg0:.*]]: index):
// CHECK-NEXT: "dialect.op2_2"(%[[arg0]]) : (index) -> ()
// CHECK-NEXT: ^{{.*}}(%[[arg1:.*]]: index): // no predecessors
// CHECK-NEXT: "dialect.op2_1"(%[[arg1]]) : (index) -> ()
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: }
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testOpModification(MlirContext ctx) {
// CHECK-LABEL: @testOpModification
fprintf(stderr, "@testOpModification\n");
const char *moduleString =
"%x, %y = \"dialect.op1\"() : () -> (index, index)\n"
"\"dialect.op2\"(%x) : (index) -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
// get a handle to all operations/values
MlirOperation op1 = mlirBlockGetFirstOperation(body);
MlirValue y = mlirOperationGetResult(op1, 1);
MlirOperation op2 = mlirOperationGetNextInBlock(op1);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
mlirRewriterBaseStartOpModification(rewriter, op1);
mlirRewriterBaseCancelOpModification(rewriter, op1);
mlirRewriterBaseStartOpModification(rewriter, op2);
mlirOperationSetOperand(op2, 0, y);
mlirRewriterBaseFinalizeOpModification(rewriter, op2);
mlirOperationDump(op);
// CHECK-NEXT: module {
// CHECK-NEXT: %[[xy:.*]]:2 = "dialect.op1"() : () -> (index, index)
// CHECK-NEXT: "dialect.op2"(%[[xy]]#1) : (index) -> ()
// CHECK-NEXT: }
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
void testReplaceUses(MlirContext ctx) {
// CHECK-LABEL: @testReplaceUses
fprintf(stderr, "@testReplaceUses\n");
const char *moduleString =
// Replace values with values
"%x1, %y1, %z1 = \"dialect.op1\"() : () -> (index, index, index)\n"
"%x2, %y2, %z2 = \"dialect.op2\"() : () -> (index, index, index)\n"
"\"dialect.op1_uses\"(%x1, %y1, %z1) : (index, index, index) -> ()\n"
// Replace op with values
"%x3 = \"dialect.op3\"() : () -> index\n"
"%x4 = \"dialect.op4\"() : () -> index\n"
"\"dialect.op3_uses\"(%x3) : (index) -> ()\n"
// Replace op with op
"%x5 = \"dialect.op5\"() : () -> index\n"
"%x6 = \"dialect.op6\"() : () -> index\n"
"\"dialect.op5_uses\"(%x5) : (index) -> ()\n"
// Replace op in block;
"%x7 = \"dialect.op7\"() : () -> index\n"
"%x8 = \"dialect.op8\"() : () -> index\n"
"\"dialect.op9\"() ({\n"
"^bb0:\n"
" \"dialect.op7_uses\"(%x7) : (index) -> ()\n"
"}): () -> ()\n"
"\"dialect.op7_uses\"(%x7) : (index) -> ()\n"
// Replace value with value except in op
"%x10 = \"dialect.op10\"() : () -> index\n"
"%x11 = \"dialect.op11\"() : () -> index\n"
"\"dialect.op10_uses\"(%x10) : (index) -> ()\n"
"\"dialect.op10_uses\"(%x10) : (index) -> ()\n";
MlirModule module =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
MlirOperation op = mlirModuleGetOperation(module);
MlirBlock body = mlirModuleGetBody(module);
// get a handle to all operations/values
MlirOperation op1 = mlirBlockGetFirstOperation(body);
MlirValue x1 = mlirOperationGetResult(op1, 0);
MlirValue y1 = mlirOperationGetResult(op1, 1);
MlirValue z1 = mlirOperationGetResult(op1, 2);
MlirOperation op2 = mlirOperationGetNextInBlock(op1);
MlirValue x2 = mlirOperationGetResult(op2, 0);
MlirValue y2 = mlirOperationGetResult(op2, 1);
MlirValue z2 = mlirOperationGetResult(op2, 2);
MlirOperation op1Uses = mlirOperationGetNextInBlock(op2);
MlirOperation op3 = mlirOperationGetNextInBlock(op1Uses);
MlirOperation op4 = mlirOperationGetNextInBlock(op3);
MlirValue x4 = mlirOperationGetResult(op4, 0);
MlirOperation op3Uses = mlirOperationGetNextInBlock(op4);
MlirOperation op5 = mlirOperationGetNextInBlock(op3Uses);
MlirOperation op6 = mlirOperationGetNextInBlock(op5);
MlirOperation op5Uses = mlirOperationGetNextInBlock(op6);
MlirOperation op7 = mlirOperationGetNextInBlock(op5Uses);
MlirOperation op8 = mlirOperationGetNextInBlock(op7);
MlirValue x8 = mlirOperationGetResult(op8, 0);
MlirOperation op9 = mlirOperationGetNextInBlock(op8);
MlirRegion region9 = mlirOperationGetRegion(op9, 0);
MlirBlock block9 = mlirRegionGetFirstBlock(region9);
MlirOperation op7Uses = mlirOperationGetNextInBlock(op9);
MlirOperation op10 = mlirOperationGetNextInBlock(op7Uses);
MlirValue x10 = mlirOperationGetResult(op10, 0);
MlirOperation op11 = mlirOperationGetNextInBlock(op10);
MlirValue x11 = mlirOperationGetResult(op11, 0);
MlirOperation op10Uses1 = mlirOperationGetNextInBlock(op11);
MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);
// Replace values
mlirRewriterBaseReplaceAllUsesWith(rewriter, x1, x2);
MlirValue y1z1[2] = {y1, z1};
MlirValue y2z2[2] = {y2, z2};
mlirRewriterBaseReplaceAllValueRangeUsesWith(rewriter, 2, y1z1, y2z2);
// Replace op with values
mlirRewriterBaseReplaceOpWithValues(rewriter, op3, 1, &x4);
// Replace op with op
mlirRewriterBaseReplaceOpWithOperation(rewriter, op5, op6);
// Replace op with op in block
mlirRewriterBaseReplaceOpUsesWithinBlock(rewriter, op7, 1, &x8, block9);
// Replace value with value except in op
mlirRewriterBaseReplaceAllUsesExcept(rewriter, x10, x11, op10Uses1);
mlirOperationDump(op);
// clang-format off
// CHECK-NEXT: module {
// CHECK-NEXT: %{{.*}}:3 = "dialect.op1"() : () -> (index, index, index)
// CHECK-NEXT: %[[res2:.*]]:3 = "dialect.op2"() : () -> (index, index, index)
// CHECK-NEXT: "dialect.op1_uses"(%[[res2]]#0, %[[res2]]#1, %[[res2]]#2) : (index, index, index) -> ()
// CHECK-NEXT: %[[res4:.*]] = "dialect.op4"() : () -> index
// CHECK-NEXT: "dialect.op3_uses"(%[[res4]]) : (index) -> ()
// CHECK-NEXT: %[[res6:.*]] = "dialect.op6"() : () -> index
// CHECK-NEXT: "dialect.op5_uses"(%[[res6]]) : (index) -> ()
// CHECK-NEXT: %[[res7:.*]] = "dialect.op7"() : () -> index
// CHECK-NEXT: %[[res8:.*]] = "dialect.op8"() : () -> index
// CHECK-NEXT: "dialect.op9"() ({
// CHECK-NEXT: "dialect.op7_uses"(%[[res8]]) : (index) -> ()
// CHECK-NEXT: }) : () -> ()
// CHECK-NEXT: "dialect.op7_uses"(%[[res7]]) : (index) -> ()
// CHECK-NEXT: %[[res10:.*]] = "dialect.op10"() : () -> index
// CHECK-NEXT: %[[res11:.*]] = "dialect.op11"() : () -> index
// CHECK-NEXT: "dialect.op10_uses"(%[[res10]]) : (index) -> ()
// CHECK-NEXT: "dialect.op10_uses"(%[[res11]]) : (index) -> ()
// CHECK-NEXT: }
// clang-format on
mlirIRRewriterDestroy(rewriter);
mlirModuleDestroy(module);
}
int main(void) {
MlirContext ctx = mlirContextCreate();
mlirContextSetAllowUnregisteredDialects(ctx, true);
mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("builtin"));
testInsertionPoint(ctx);
testCreateBlock(ctx);
testInlineRegionBlock(ctx);
testReplaceOp(ctx);
testErase(ctx);
testMove(ctx);
testOpModification(ctx);
testReplaceUses(ctx);
mlirContextDestroy(ctx);
return 0;
}