Files
RedBear-OS/local/recipes/dev/libclc/source/mlir/test/CAPI/rewrite.c
T
vasilito cb424d7448 build: static patch-sanity linter (shift-left the malformed-patch class)
verify-patch-sanity.py validates every active recipe .patch has internally-
consistent hunk line counts — catching the 'malformed patch at line N' failure
at commit/CI/preflight time instead of hours into a cook. This cycle hit that
class three times (qtwaylandscanner, sddm, xwayland), each only discovered when
cookbook tried to apply the patch.

Running it across the repo found 29 latent malformed patches (validated against
GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22').
They were harmless only because they sit in vendored recipes (baked, not re-
applied) — but would fail on any version-bump re-derivation. --fix recounts the
hunk headers (body untouched) and repaired all 29.

Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test
(test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats
(empty placeholders, bare-@@ git hunks).
2026-08-01 05:13:02 +03: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;
}