brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.0 KiB · b33d225 Raw
554 lines · c
1//===- rewrite.c - Test of the rewriting C API ----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM4// Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10// RUN: mlir-capi-rewrite-test 2>&1 | FileCheck %s11 12#include "mlir-c/Rewrite.h"13#include "mlir-c/BuiltinTypes.h"14#include "mlir-c/IR.h"15 16#include <assert.h>17#include <stdio.h>18 19MlirOperation createOperationWithName(MlirContext ctx, const char *name) {20  MlirStringRef nameRef = mlirStringRefCreateFromCString(name);21  MlirLocation loc = mlirLocationUnknownGet(ctx);22  MlirOperationState state = mlirOperationStateGet(nameRef, loc);23  MlirType indexType = mlirIndexTypeGet(ctx);24  mlirOperationStateAddResults(&state, 1, &indexType);25  return mlirOperationCreate(&state);26}27 28void testInsertionPoint(MlirContext ctx) {29  // CHECK-LABEL: @testInsertionPoint30  fprintf(stderr, "@testInsertionPoint\n");31 32  const char *moduleString = "\"dialect.op1\"() : () -> ()\n";33  MlirModule module =34      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));35  MlirOperation op = mlirModuleGetOperation(module);36  MlirBlock body = mlirModuleGetBody(module);37  MlirOperation op1 = mlirBlockGetFirstOperation(body);38 39  // IRRewriter create40  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);41 42  // Insert before op43  mlirRewriterBaseSetInsertionPointBefore(rewriter, op1);44  MlirOperation op2 = createOperationWithName(ctx, "dialect.op2");45  mlirRewriterBaseInsert(rewriter, op2);46 47  // Insert after op48  mlirRewriterBaseSetInsertionPointAfter(rewriter, op2);49  MlirOperation op3 = createOperationWithName(ctx, "dialect.op3");50  mlirRewriterBaseInsert(rewriter, op3);51  MlirValue op3Res = mlirOperationGetResult(op3, 0);52 53  // Insert after value54  mlirRewriterBaseSetInsertionPointAfterValue(rewriter, op3Res);55  MlirOperation op4 = createOperationWithName(ctx, "dialect.op4");56  mlirRewriterBaseInsert(rewriter, op4);57 58  // Insert at beginning of block59  mlirRewriterBaseSetInsertionPointToStart(rewriter, body);60  MlirOperation op5 = createOperationWithName(ctx, "dialect.op5");61  mlirRewriterBaseInsert(rewriter, op5);62 63  // Insert at end of block64  mlirRewriterBaseSetInsertionPointToEnd(rewriter, body);65  MlirOperation op6 = createOperationWithName(ctx, "dialect.op6");66  mlirRewriterBaseInsert(rewriter, op6);67 68  // Get insertion blocks69  MlirBlock block1 = mlirRewriterBaseGetBlock(rewriter);70  MlirBlock block2 = mlirRewriterBaseGetInsertionBlock(rewriter);71  (void)block1;72  (void)block2;73  assert(body.ptr == block1.ptr);74  assert(body.ptr == block2.ptr);75 76  // clang-format off77  // CHECK-NEXT: module {78  // CHECK-NEXT:   %{{.*}} = "dialect.op5"() : () -> index79  // CHECK-NEXT:   %{{.*}} = "dialect.op2"() : () -> index80  // CHECK-NEXT:   %{{.*}} = "dialect.op3"() : () -> index81  // CHECK-NEXT:   %{{.*}} = "dialect.op4"() : () -> index82  // CHECK-NEXT:   "dialect.op1"() : () -> ()83  // CHECK-NEXT:   %{{.*}} = "dialect.op6"() : () -> index84  // CHECK-NEXT: }85  // clang-format on86  mlirOperationDump(op);87 88  mlirIRRewriterDestroy(rewriter);89  mlirModuleDestroy(module);90}91 92void testCreateBlock(MlirContext ctx) {93  // CHECK-LABEL: @testCreateBlock94  fprintf(stderr, "@testCreateBlock\n");95 96  const char *moduleString = "\"dialect.op1\"() ({^bb0:}) : () -> ()\n"97                             "\"dialect.op2\"() ({^bb0:}) : () -> ()\n";98  MlirModule module =99      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));100  MlirOperation op = mlirModuleGetOperation(module);101  MlirBlock body = mlirModuleGetBody(module);102 103  MlirOperation op1 = mlirBlockGetFirstOperation(body);104  MlirRegion region1 = mlirOperationGetRegion(op1, 0);105  MlirBlock block1 = mlirRegionGetFirstBlock(region1);106 107  MlirOperation op2 = mlirOperationGetNextInBlock(op1);108  MlirRegion region2 = mlirOperationGetRegion(op2, 0);109  MlirBlock block2 = mlirRegionGetFirstBlock(region2);110 111  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);112 113  // Create block before114  MlirType indexType = mlirIndexTypeGet(ctx);115  MlirLocation unknown = mlirLocationUnknownGet(ctx);116  mlirRewriterBaseCreateBlockBefore(rewriter, block1, 1, &indexType, &unknown);117 118  mlirRewriterBaseSetInsertionPointToEnd(rewriter, body);119 120  // Clone operation121  mlirRewriterBaseClone(rewriter, op1);122 123  // Clone without regions124  mlirRewriterBaseCloneWithoutRegions(rewriter, op1);125 126  // Clone region before127  mlirRewriterBaseCloneRegionBefore(rewriter, region1, block2);128 129  mlirOperationDump(op);130  // clang-format off131  // CHECK-NEXT: "builtin.module"() ({132  // CHECK-NEXT:   "dialect.op1"() ({133  // CHECK-NEXT:   ^{{.*}}(%{{.*}}: index):134  // CHECK-NEXT:   ^{{.*}}:135  // CHECK-NEXT:   }) : () -> ()136  // CHECK-NEXT:   "dialect.op2"() ({137  // CHECK-NEXT:   ^{{.*}}(%{{.*}}: index):138  // CHECK-NEXT:   ^{{.*}}:139  // CHECK-NEXT:   ^{{.*}}:140  // CHECK-NEXT:   }) : () -> ()141  // CHECK-NEXT:   "dialect.op1"() ({142  // CHECK-NEXT:   ^{{.*}}(%{{.*}}: index):143  // CHECK-NEXT:   ^{{.*}}:144  // CHECK-NEXT:   }) : () -> ()145  // CHECK-NEXT:   "dialect.op1"() ({146  // CHECK-NEXT:   }) : () -> ()147  // CHECK-NEXT: }) : () -> ()148  // clang-format on149 150  mlirIRRewriterDestroy(rewriter);151  mlirModuleDestroy(module);152}153 154void testInlineRegionBlock(MlirContext ctx) {155  // CHECK-LABEL: @testInlineRegionBlock156  fprintf(stderr, "@testInlineRegionBlock\n");157 158  const char *moduleString =159      "\"dialect.op1\"() ({\n"160      "  ^bb0(%arg0: index):\n"161      "    \"dialect.op1_in1\"(%arg0) [^bb1] : (index) -> ()\n"162      "  ^bb1():\n"163      "    \"dialect.op1_in2\"() : () -> ()\n"164      "}) : () -> ()\n"165      "\"dialect.op2\"() ({^bb0:}) : () -> ()\n"166      "\"dialect.op3\"() ({\n"167      "  ^bb0(%arg0: index):\n"168      "    \"dialect.op3_in1\"(%arg0) : (index) -> ()\n"169      "  ^bb1():\n"170      "    %x = \"dialect.op3_in2\"() : () -> index\n"171      "    %y = \"dialect.op3_in3\"() : () -> index\n"172      "}) : () -> ()\n"173      "\"dialect.op4\"() ({\n"174      "  ^bb0():\n"175      "    \"dialect.op4_in1\"() : () -> index\n"176      "  ^bb1(%arg0: index):\n"177      "    \"dialect.op4_in2\"(%arg0) : (index) -> ()\n"178      "}) : () -> ()\n";179  MlirModule module =180      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));181  MlirOperation op = mlirModuleGetOperation(module);182  MlirBlock body = mlirModuleGetBody(module);183 184  MlirOperation op1 = mlirBlockGetFirstOperation(body);185  MlirRegion region1 = mlirOperationGetRegion(op1, 0);186 187  MlirOperation op2 = mlirOperationGetNextInBlock(op1);188  MlirRegion region2 = mlirOperationGetRegion(op2, 0);189  MlirBlock block2 = mlirRegionGetFirstBlock(region2);190 191  MlirOperation op3 = mlirOperationGetNextInBlock(op2);192  MlirRegion region3 = mlirOperationGetRegion(op3, 0);193  MlirBlock block3_1 = mlirRegionGetFirstBlock(region3);194  MlirBlock block3_2 = mlirBlockGetNextInRegion(block3_1);195  MlirOperation op3_in2 = mlirBlockGetFirstOperation(block3_2);196  MlirValue op3_in2_res = mlirOperationGetResult(op3_in2, 0);197  MlirOperation op3_in3 = mlirOperationGetNextInBlock(op3_in2);198 199  MlirOperation op4 = mlirOperationGetNextInBlock(op3);200  MlirRegion region4 = mlirOperationGetRegion(op4, 0);201  MlirBlock block4_1 = mlirRegionGetFirstBlock(region4);202  MlirOperation op4_in1 = mlirBlockGetFirstOperation(block4_1);203  MlirValue op4_in1_res = mlirOperationGetResult(op4_in1, 0);204  MlirBlock block4_2 = mlirBlockGetNextInRegion(block4_1);205 206  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);207 208  // Test these three functions209  mlirRewriterBaseInlineRegionBefore(rewriter, region1, block2);210  mlirRewriterBaseInlineBlockBefore(rewriter, block3_1, op3_in3, 1,211                                    &op3_in2_res);212  mlirRewriterBaseMergeBlocks(rewriter, block4_2, block4_1, 1, &op4_in1_res);213 214  mlirOperationDump(op);215  // clang-format off216  // CHECK-NEXT: "builtin.module"() ({217  // CHECK-NEXT:   "dialect.op1"() ({218  // CHECK-NEXT:   }) : () -> ()219  // CHECK-NEXT:   "dialect.op2"() ({220  // CHECK-NEXT:   ^{{.*}}(%{{.*}}: index):221  // CHECK-NEXT:     "dialect.op1_in1"(%{{.*}})[^[[bb:.*]]] : (index) -> ()222  // CHECK-NEXT:   ^[[bb]]:223  // CHECK-NEXT:     "dialect.op1_in2"() : () -> ()224  // CHECK-NEXT:   ^{{.*}}:  // no predecessors225  // CHECK-NEXT:   }) : () -> ()226  // CHECK-NEXT:   "dialect.op3"() ({227  // CHECK-NEXT:     %{{.*}} = "dialect.op3_in2"() : () -> index228  // CHECK-NEXT:     "dialect.op3_in1"(%{{.*}}) : (index) -> ()229  // CHECK-NEXT:     %{{.*}} = "dialect.op3_in3"() : () -> index230  // CHECK-NEXT:   }) : () -> ()231  // CHECK-NEXT:   "dialect.op4"() ({232  // CHECK-NEXT:     %{{.*}} = "dialect.op4_in1"() : () -> index233  // CHECK-NEXT:     "dialect.op4_in2"(%{{.*}}) : (index) -> ()234  // CHECK-NEXT:   }) : () -> ()235  // CHECK-NEXT: }) : () -> ()236  // clang-format on237 238  mlirIRRewriterDestroy(rewriter);239  mlirModuleDestroy(module);240}241 242void testReplaceOp(MlirContext ctx) {243  // CHECK-LABEL: @testReplaceOp244  fprintf(stderr, "@testReplaceOp\n");245 246  const char *moduleString =247      "%x, %y, %z = \"dialect.create_values\"() : () -> (index, index, index)\n"248      "%x_1, %y_1 = \"dialect.op1\"() : () -> (index, index)\n"249      "\"dialect.use_op1\"(%x_1, %y_1) : (index, index) -> ()\n"250      "%x_2, %y_2 = \"dialect.op2\"() : () -> (index, index)\n"251      "%x_3, %y_3 = \"dialect.op3\"() : () -> (index, index)\n"252      "\"dialect.use_op2\"(%x_2, %y_2) : (index, index) -> ()\n";253  MlirModule module =254      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));255  MlirOperation op = mlirModuleGetOperation(module);256  MlirBlock body = mlirModuleGetBody(module);257 258  // get a handle to all operations/values259  MlirOperation createValues = mlirBlockGetFirstOperation(body);260  MlirValue x = mlirOperationGetResult(createValues, 0);261  MlirValue z = mlirOperationGetResult(createValues, 2);262  MlirOperation op1 = mlirOperationGetNextInBlock(createValues);263  MlirOperation useOp1 = mlirOperationGetNextInBlock(op1);264  MlirOperation op2 = mlirOperationGetNextInBlock(useOp1);265  MlirOperation op3 = mlirOperationGetNextInBlock(op2);266 267  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);268 269  // Test replace op with values270  MlirValue xz[2] = {x, z};271  mlirRewriterBaseReplaceOpWithValues(rewriter, op1, 2, xz);272 273  // Test replace op with op274  mlirRewriterBaseReplaceOpWithOperation(rewriter, op2, op3);275 276  mlirOperationDump(op);277  // clang-format off278  // CHECK-NEXT: module {279  // CHECK-NEXT:   %[[res:.*]]:3 = "dialect.create_values"() : () -> (index, index, index)280  // CHECK-NEXT:   "dialect.use_op1"(%[[res]]#0, %[[res]]#2) : (index, index) -> ()281  // CHECK-NEXT:   %[[res2:.*]]:2 = "dialect.op3"() : () -> (index, index)282  // CHECK-NEXT:   "dialect.use_op2"(%[[res2]]#0, %[[res2]]#1) : (index, index) -> ()283  // CHECK-NEXT: }284  // clang-format on285 286  mlirIRRewriterDestroy(rewriter);287  mlirModuleDestroy(module);288}289 290void testErase(MlirContext ctx) {291  // CHECK-LABEL: @testErase292  fprintf(stderr, "@testErase\n");293 294  const char *moduleString = "\"dialect.op_to_erase\"() : () -> ()\n"295                             "\"dialect.op2\"() ({\n"296                             "^bb0():\n"297                             "  \"dialect.op2_nested\"() : () -> ()"298                             "^block_to_erase():\n"299                             "  \"dialect.op2_nested\"() : () -> ()"300                             "^bb1():\n"301                             "  \"dialect.op2_nested\"() : () -> ()"302                             "}) : () -> ()\n";303  MlirModule module =304      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));305  MlirOperation op = mlirModuleGetOperation(module);306  MlirBlock body = mlirModuleGetBody(module);307 308  // get a handle to all operations/values309  MlirOperation opToErase = mlirBlockGetFirstOperation(body);310  MlirOperation op2 = mlirOperationGetNextInBlock(opToErase);311  MlirRegion op2Region = mlirOperationGetRegion(op2, 0);312  MlirBlock bb0 = mlirRegionGetFirstBlock(op2Region);313  MlirBlock blockToErase = mlirBlockGetNextInRegion(bb0);314 315  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);316  mlirRewriterBaseEraseOp(rewriter, opToErase);317  mlirRewriterBaseEraseBlock(rewriter, blockToErase);318 319  mlirOperationDump(op);320  // CHECK-NEXT: module {321  // CHECK-NEXT: "dialect.op2"() ({322  // CHECK-NEXT:   "dialect.op2_nested"() : () -> ()323  // CHECK-NEXT: ^{{.*}}:324  // CHECK-NEXT:   "dialect.op2_nested"() : () -> ()325  // CHECK-NEXT: }) : () -> ()326  // CHECK-NEXT: }327 328  mlirIRRewriterDestroy(rewriter);329  mlirModuleDestroy(module);330}331 332void testMove(MlirContext ctx) {333  // CHECK-LABEL: @testMove334  fprintf(stderr, "@testMove\n");335 336  const char *moduleString = "\"dialect.op1\"() : () -> ()\n"337                             "\"dialect.op2\"() ({\n"338                             "^bb0(%arg0: index):\n"339                             "  \"dialect.op2_1\"(%arg0) : (index) -> ()"340                             "^bb1(%arg1: index):\n"341                             "  \"dialect.op2_2\"(%arg1) : (index) -> ()"342                             "}) : () -> ()\n"343                             "\"dialect.op3\"() : () -> ()\n"344                             "\"dialect.op4\"() : () -> ()\n";345 346  MlirModule module =347      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));348  MlirOperation op = mlirModuleGetOperation(module);349  MlirBlock body = mlirModuleGetBody(module);350 351  // get a handle to all operations/values352  MlirOperation op1 = mlirBlockGetFirstOperation(body);353  MlirOperation op2 = mlirOperationGetNextInBlock(op1);354  MlirOperation op3 = mlirOperationGetNextInBlock(op2);355  MlirOperation op4 = mlirOperationGetNextInBlock(op3);356 357  MlirRegion region2 = mlirOperationGetRegion(op2, 0);358  MlirBlock block0 = mlirRegionGetFirstBlock(region2);359  MlirBlock block1 = mlirBlockGetNextInRegion(block0);360 361  // Test move operations.362  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);363  mlirRewriterBaseMoveOpBefore(rewriter, op3, op1);364  mlirRewriterBaseMoveOpAfter(rewriter, op4, op1);365  mlirRewriterBaseMoveBlockBefore(rewriter, block1, block0);366 367  mlirOperationDump(op);368  // CHECK-NEXT: module {369  // CHECK-NEXT:   "dialect.op3"() : () -> ()370  // CHECK-NEXT:   "dialect.op1"() : () -> ()371  // CHECK-NEXT:   "dialect.op4"() : () -> ()372  // CHECK-NEXT:   "dialect.op2"() ({373  // CHECK-NEXT:   ^{{.*}}(%[[arg0:.*]]: index):374  // CHECK-NEXT:     "dialect.op2_2"(%[[arg0]]) : (index) -> ()375  // CHECK-NEXT:   ^{{.*}}(%[[arg1:.*]]: index):  // no predecessors376  // CHECK-NEXT:     "dialect.op2_1"(%[[arg1]]) : (index) -> ()377  // CHECK-NEXT:   }) : () -> ()378  // CHECK-NEXT: }379 380  mlirIRRewriterDestroy(rewriter);381  mlirModuleDestroy(module);382}383 384void testOpModification(MlirContext ctx) {385  // CHECK-LABEL: @testOpModification386  fprintf(stderr, "@testOpModification\n");387 388  const char *moduleString =389      "%x, %y = \"dialect.op1\"() : () -> (index, index)\n"390      "\"dialect.op2\"(%x) : (index) -> ()\n";391 392  MlirModule module =393      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));394  MlirOperation op = mlirModuleGetOperation(module);395  MlirBlock body = mlirModuleGetBody(module);396 397  // get a handle to all operations/values398  MlirOperation op1 = mlirBlockGetFirstOperation(body);399  MlirValue y = mlirOperationGetResult(op1, 1);400  MlirOperation op2 = mlirOperationGetNextInBlock(op1);401 402  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);403  mlirRewriterBaseStartOpModification(rewriter, op1);404  mlirRewriterBaseCancelOpModification(rewriter, op1);405 406  mlirRewriterBaseStartOpModification(rewriter, op2);407  mlirOperationSetOperand(op2, 0, y);408  mlirRewriterBaseFinalizeOpModification(rewriter, op2);409 410  mlirOperationDump(op);411  // CHECK-NEXT: module {412  // CHECK-NEXT: %[[xy:.*]]:2 = "dialect.op1"() : () -> (index, index)413  // CHECK-NEXT: "dialect.op2"(%[[xy]]#1) : (index) -> ()414  // CHECK-NEXT: }415 416  mlirIRRewriterDestroy(rewriter);417  mlirModuleDestroy(module);418}419 420void testReplaceUses(MlirContext ctx) {421  // CHECK-LABEL: @testReplaceUses422  fprintf(stderr, "@testReplaceUses\n");423 424  const char *moduleString =425      // Replace values with values426      "%x1, %y1, %z1 = \"dialect.op1\"() : () -> (index, index, index)\n"427      "%x2, %y2, %z2 = \"dialect.op2\"() : () -> (index, index, index)\n"428      "\"dialect.op1_uses\"(%x1, %y1, %z1) : (index, index, index) -> ()\n"429      // Replace op with values430      "%x3 = \"dialect.op3\"() : () -> index\n"431      "%x4 = \"dialect.op4\"() : () -> index\n"432      "\"dialect.op3_uses\"(%x3) : (index) -> ()\n"433      // Replace op with op434      "%x5 = \"dialect.op5\"() : () -> index\n"435      "%x6 = \"dialect.op6\"() : () -> index\n"436      "\"dialect.op5_uses\"(%x5) : (index) -> ()\n"437      // Replace op in block;438      "%x7 = \"dialect.op7\"() : () -> index\n"439      "%x8 = \"dialect.op8\"() : () -> index\n"440      "\"dialect.op9\"() ({\n"441      "^bb0:\n"442      "   \"dialect.op7_uses\"(%x7) : (index) -> ()\n"443      "}): () -> ()\n"444      "\"dialect.op7_uses\"(%x7) : (index) -> ()\n"445      // Replace value with value except in op446      "%x10 = \"dialect.op10\"() : () -> index\n"447      "%x11 = \"dialect.op11\"() : () -> index\n"448      "\"dialect.op10_uses\"(%x10) : (index) -> ()\n"449      "\"dialect.op10_uses\"(%x10) : (index) -> ()\n";450 451  MlirModule module =452      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));453  MlirOperation op = mlirModuleGetOperation(module);454  MlirBlock body = mlirModuleGetBody(module);455 456  // get a handle to all operations/values457  MlirOperation op1 = mlirBlockGetFirstOperation(body);458  MlirValue x1 = mlirOperationGetResult(op1, 0);459  MlirValue y1 = mlirOperationGetResult(op1, 1);460  MlirValue z1 = mlirOperationGetResult(op1, 2);461  MlirOperation op2 = mlirOperationGetNextInBlock(op1);462  MlirValue x2 = mlirOperationGetResult(op2, 0);463  MlirValue y2 = mlirOperationGetResult(op2, 1);464  MlirValue z2 = mlirOperationGetResult(op2, 2);465  MlirOperation op1Uses = mlirOperationGetNextInBlock(op2);466 467  MlirOperation op3 = mlirOperationGetNextInBlock(op1Uses);468  MlirOperation op4 = mlirOperationGetNextInBlock(op3);469  MlirValue x4 = mlirOperationGetResult(op4, 0);470  MlirOperation op3Uses = mlirOperationGetNextInBlock(op4);471 472  MlirOperation op5 = mlirOperationGetNextInBlock(op3Uses);473  MlirOperation op6 = mlirOperationGetNextInBlock(op5);474  MlirOperation op5Uses = mlirOperationGetNextInBlock(op6);475 476  MlirOperation op7 = mlirOperationGetNextInBlock(op5Uses);477  MlirOperation op8 = mlirOperationGetNextInBlock(op7);478  MlirValue x8 = mlirOperationGetResult(op8, 0);479  MlirOperation op9 = mlirOperationGetNextInBlock(op8);480  MlirRegion region9 = mlirOperationGetRegion(op9, 0);481  MlirBlock block9 = mlirRegionGetFirstBlock(region9);482  MlirOperation op7Uses = mlirOperationGetNextInBlock(op9);483 484  MlirOperation op10 = mlirOperationGetNextInBlock(op7Uses);485  MlirValue x10 = mlirOperationGetResult(op10, 0);486  MlirOperation op11 = mlirOperationGetNextInBlock(op10);487  MlirValue x11 = mlirOperationGetResult(op11, 0);488  MlirOperation op10Uses1 = mlirOperationGetNextInBlock(op11);489 490  MlirRewriterBase rewriter = mlirIRRewriterCreate(ctx);491 492  // Replace values493  mlirRewriterBaseReplaceAllUsesWith(rewriter, x1, x2);494  MlirValue y1z1[2] = {y1, z1};495  MlirValue y2z2[2] = {y2, z2};496  mlirRewriterBaseReplaceAllValueRangeUsesWith(rewriter, 2, y1z1, y2z2);497 498  // Replace op with values499  mlirRewriterBaseReplaceOpWithValues(rewriter, op3, 1, &x4);500 501  // Replace op with op502  mlirRewriterBaseReplaceOpWithOperation(rewriter, op5, op6);503 504  // Replace op with op in block505  mlirRewriterBaseReplaceOpUsesWithinBlock(rewriter, op7, 1, &x8, block9);506 507  // Replace value with value except in op508  mlirRewriterBaseReplaceAllUsesExcept(rewriter, x10, x11, op10Uses1);509 510  mlirOperationDump(op);511  // clang-format off512  // CHECK-NEXT: module {513  // CHECK-NEXT:   %{{.*}}:3 = "dialect.op1"() : () -> (index, index, index)514  // CHECK-NEXT:   %[[res2:.*]]:3 = "dialect.op2"() : () -> (index, index, index)515  // CHECK-NEXT:   "dialect.op1_uses"(%[[res2]]#0, %[[res2]]#1, %[[res2]]#2) : (index, index, index) -> ()516  // CHECK-NEXT:   %[[res4:.*]] = "dialect.op4"() : () -> index517  // CHECK-NEXT:   "dialect.op3_uses"(%[[res4]]) : (index) -> ()518  // CHECK-NEXT:   %[[res6:.*]] = "dialect.op6"() : () -> index519  // CHECK-NEXT:   "dialect.op5_uses"(%[[res6]]) : (index) -> ()520  // CHECK-NEXT:   %[[res7:.*]] = "dialect.op7"() : () -> index521  // CHECK-NEXT:   %[[res8:.*]] = "dialect.op8"() : () -> index522  // CHECK-NEXT:   "dialect.op9"() ({523  // CHECK-NEXT:     "dialect.op7_uses"(%[[res8]]) : (index) -> ()524  // CHECK-NEXT:   }) : () -> ()525  // CHECK-NEXT:   "dialect.op7_uses"(%[[res7]]) : (index) -> ()526  // CHECK-NEXT:   %[[res10:.*]] = "dialect.op10"() : () -> index527  // CHECK-NEXT:   %[[res11:.*]] = "dialect.op11"() : () -> index528  // CHECK-NEXT:   "dialect.op10_uses"(%[[res10]]) : (index) -> ()529  // CHECK-NEXT:   "dialect.op10_uses"(%[[res11]]) : (index) -> ()530  // CHECK-NEXT: }531  // clang-format on532 533  mlirIRRewriterDestroy(rewriter);534  mlirModuleDestroy(module);535}536 537int main(void) {538  MlirContext ctx = mlirContextCreate();539  mlirContextSetAllowUnregisteredDialects(ctx, true);540  mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("builtin"));541 542  testInsertionPoint(ctx);543  testCreateBlock(ctx);544  testInlineRegionBlock(ctx);545  testReplaceOp(ctx);546  testErase(ctx);547  testMove(ctx);548  testOpModification(ctx);549  testReplaceUses(ctx);550 551  mlirContextDestroy(ctx);552  return 0;553}554