| //===- 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; |
| } |