Skip to content

Commit

Permalink
ASM: suggest block arg name for secret.generic
Browse files Browse the repository at this point in the history
  • Loading branch information
ZenithalHourlyRate committed Dec 29, 2024
1 parent 5afeaf4 commit 473c87f
Show file tree
Hide file tree
Showing 27 changed files with 139 additions and 117 deletions.
24 changes: 23 additions & 1 deletion lib/Dialect/Secret/IR/SecretOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
include "SecretDialect.td"
include "SecretTypes.td"
include "mlir/IR/BuiltinAttributeInterfaces.td"
include "mlir/IR/OpAsmInterface.td"
include "mlir/Interfaces/ControlFlowInterfaces.td"
include "mlir/Interfaces/InferTypeOpInterface.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
Expand Down Expand Up @@ -110,7 +111,8 @@ def Secret_YieldOp : Secret_Op<"yield", [

def Secret_GenericOp : Secret_Op<"generic", [
SingleBlock,
SingleBlockImplicitTerminator<"YieldOp">
SingleBlockImplicitTerminator<"YieldOp">,
OpAsmOpInterface
]> {
let summary = "Lift a plaintext computation to operate on secrets.";
let description = [{
Expand Down Expand Up @@ -303,6 +305,26 @@ def Secret_GenericOp : Secret_Op<"generic", [
}
return attr;
}

//===------------------------------------------------------------------===//
// OpAsmOpInterface Methods
//===------------------------------------------------------------------===//

void getAsmBlockArgumentNames(::mlir::Region &region,
::mlir::OpAsmSetValueNameFn setNameFn) {
for (auto &block : region) {
for (auto arg : block.getArguments()) {
setNameFn(arg, "input" + std::to_string(arg.getArgNumber()));
}
}
}

void getAsmBlockNames(::mlir::OpAsmSetBlockNameFn setNameFn) {
// single block
for (auto &block : getRegion().getBlocks()) {
setNameFn(&block, "body");
}
}
}];

let hasCanonicalizer = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// CHECK-SAME: 1.7{{0*}}e+01, 1.8{{0*}}e+01, 1.9{{0*}}e+01, 2.{{0*}}e+01
// CHECK-SAME{LITERAL}: ]]>
// CHECK: %[[OUT:.*]] = secret.generic ins(%[[ARG]] : !secret.secret<tensor<1x4xf16>>)
// CHECK: ^bb0(%[[ARG_CONVERTED:.*]]: tensor<1x4xf16>):
// CHECK: ^body(%[[ARG_CONVERTED:.*]]: tensor<1x4xf16>):
// CHECK: %[[FOR_LOOP_OUT:.*]]:2 = affine.for %[[I:.*]] = 0 to 3 iter_args(%[[RUNNING_SUM:.*]] = %[[BIAS]], %[[ROTATED_VEC:.*]] = %[[ARG_CONVERTED]])
// CHECK: %[[SLICE:.*]] = tensor.extract_slice %[[DIAGONALIZED_MATRIX]][%[[I]], 0] [1, 4] [1, 1]
// CHECK: %[[MUL:.*]] = arith.mulf %[[ROTATED_VEC]], %[[SLICE]]
Expand All @@ -28,7 +28,7 @@ func.func @test_float_vector_square_matrix_linalg_to_arith(%vec : !secret.secret
%matrix = arith.constant dense<[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0], [13.0, 14.0, 15.0, 16.0]]> : tensor<4x4xf16>
%bias = arith.constant dense<[[17.0, 18.0, 19.0, 20.0]]> : tensor<1x4xf16>
%out = secret.generic ins (%vec : !secret.secret<tensor<1x4xf16>>) {
^bb0(%converted_vec: tensor<1x4xf16>):
^body(%converted_vec: tensor<1x4xf16>):
%0 = linalg.matmul ins(%converted_vec, %matrix : tensor<1x4xf16>, tensor<4x4xf16>) outs(%bias : tensor<1x4xf16>) -> tensor<1x4xf16>
secret.yield %0 : tensor<1x4xf16>
} -> !secret.secret<tensor<1x4xf16>>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// CHECK: %[[BIAS:.*]] = arith.constant dense
// CHECK-SAME{LITERAL}: <[[17], [18], [19], [20]]> : tensor<4x1xi16>
// CHECK: %[[OUT:.*]] = secret.generic ins(%[[ARG]] : !secret.secret<tensor<4x1xi16>>)
// CHECK: ^bb0(%[[ARG_CONVERTED:.*]]: tensor<4x1xi16>):
// CHECK: ^body(%[[ARG_CONVERTED:.*]]: tensor<4x1xi16>):
// CHECK: %[[FOR_LOOP_OUT:.*]]:2 = affine.for %[[I:.*]] = 0 to 3 iter_args(%[[RUNNING_SUM:.*]] = %[[BIAS]], %[[ROTATED_VEC:.*]] = %[[ARG_CONVERTED]])
// CHECK: %[[SLICE:.*]] = tensor.extract_slice %[[DIAGONALIZED_MATRIX]][0, %[[I]]] [4, 1] [1, 1]
// CHECK: %[[MUL:.*]] = arith.muli %[[ROTATED_VEC]], %[[SLICE]]
Expand All @@ -24,7 +24,7 @@ func.func @test_integer_square_matrix_vector_linalg_to_arith(%vec : !secret.secr
%matrix = arith.constant dense<[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]> : tensor<4x4xi16>
%bias = arith.constant dense<[[17], [18], [19], [20]]> : tensor<4x1xi16>
%out = secret.generic ins (%vec : !secret.secret<tensor<4x1xi16>>) {
^bb0(%converted_vec: tensor<4x1xi16>):
^body(%converted_vec: tensor<4x1xi16>):
%0 = linalg.matmul ins(%matrix, %converted_vec : tensor<4x4xi16>, tensor<4x1xi16>) outs(%bias : tensor<4x1xi16>) -> tensor<4x1xi16>
secret.yield %0 : tensor<4x1xi16>
} -> !secret.secret<tensor<4x1xi16>>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// CHECK: %[[BIAS:.*]] = arith.constant dense
// CHECK-SAME{LITERAL}: <[[17, 18, 19, 20]]> : tensor<1x4xi16>
// CHECK: %[[OUT:.*]] = secret.generic ins(%[[ARG]] : !secret.secret<tensor<1x4xi16>>)
// CHECK: ^bb0(%[[ARG_CONVERTED:.*]]: tensor<1x4xi16>):
// CHECK: ^body(%[[ARG_CONVERTED:.*]]: tensor<1x4xi16>):
// CHECK: %[[FOR_LOOP_OUT:.*]]:2 = affine.for %[[I:.*]] = 0 to 3 iter_args(%[[RUNNING_SUM:.*]] = %[[BIAS]], %[[ROTATED_VEC:.*]] = %[[ARG_CONVERTED]])
// CHECK: %[[SLICE:.*]] = tensor.extract_slice %[[DIAGONALIZED_MATRIX]][%[[I]], 0] [1, 4] [1, 1]
// CHECK: %[[MUL:.*]] = arith.muli %[[ROTATED_VEC]], %[[SLICE]]
Expand All @@ -24,7 +24,7 @@ func.func @test_integer_vector_square_matrix_linalg_to_arith(%vec : !secret.secr
%matrix = arith.constant dense<[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]> : tensor<4x4xi16>
%bias = arith.constant dense<[[17, 18, 19, 20]]> : tensor<1x4xi16>
%out = secret.generic ins (%vec : !secret.secret<tensor<1x4xi16>>) {
^bb0(%converted_vec: tensor<1x4xi16>):
^body(%converted_vec: tensor<1x4xi16>):
%0 = linalg.matmul ins(%converted_vec, %matrix : tensor<1x4xi16>, tensor<4x4xi16>) outs(%bias : tensor<1x4xi16>) -> tensor<1x4xi16>
secret.yield %0 : tensor<1x4xi16>
} -> !secret.secret<tensor<1x4xi16>>
Expand Down
16 changes: 8 additions & 8 deletions tests/Dialect/Secret/Transforms/extract_generic_body.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// CHECK-SAME: ) {
// CHECK-NEXT: secret.conceal %[[ARG]]
// CHECK-NEXT: secret.generic
// CHECK-NEXT: ^bb0(%[[SARG:.*]]: i32)
// CHECK-NEXT: ^body(%[[SARG:.*]]: i32)
// CHECK-NEXT: %[[V0:.*]] = func.call [[F0:.*]](%[[SARG]]) : (i32) -> i32
// CHECK-NEXT: secret.yield %[[V0]]
// CHECK: return
Expand All @@ -14,7 +14,7 @@ module {
func.func @test_add(%value : i32) {
%Y = secret.conceal %value : i32 -> !secret.secret<i32>
%Z = secret.generic ins(%Y : !secret.secret<i32>) {
^bb0(%y: i32) :
^body(%y: i32) :
%c7_i32_0 = arith.constant 7 : i32
%d = arith.addi %c7_i32_0, %y: i32
secret.yield %d : i32
Expand All @@ -30,11 +30,11 @@ module {
// CHECK-SAME: ) {
// CHECK-NEXT: secret.conceal %[[ARG]]
// CHECK-NEXT: secret.generic
// CHECK-NEXT: ^bb0(%[[SARG:.*]]: i32)
// CHECK-NEXT: ^body(%[[SARG:.*]]: i32)
// CHECK-NEXT: %[[V0:.*]] = func.call [[F1:.*]](%[[SARG]]) : (i32) -> i32
// CHECK-NEXT: secret.yield %[[V0]]
// CHECK: secret.generic
// CHECK-NEXT: ^bb0(%[[SARG1:.*]]: i32)
// CHECK-NEXT: ^body(%[[SARG1:.*]]: i32)
// CHECK-NEXT: %[[V1:.*]] = func.call [[F2:.*]](%[[SARG1]]) : (i32) -> i32
// CHECK-NEXT: secret.yield %[[V1]]
// CHECK: return
Expand All @@ -43,13 +43,13 @@ module {
func.func @test_multiple(%value : i32) {
%Y = secret.conceal %value : i32 -> !secret.secret<i32>
%Z = secret.generic ins(%Y : !secret.secret<i32>) {
^bb0(%y: i32) :
^body(%y: i32) :
%c7_i32_0 = arith.constant 7 : i32
%d = arith.addi %c7_i32_0, %y: i32
secret.yield %d : i32
} -> (!secret.secret<i32>)
%A = secret.generic ins(%Z : !secret.secret<i32>) {
^bb0(%y: i32) :
^body(%y: i32) :
%c12_i32_0 = arith.constant 12 : i32
%d = arith.addi %c12_i32_0, %y: i32
secret.yield %d : i32
Expand All @@ -75,7 +75,7 @@ module {
// CHECK-SAME: ) {
// CHECK-NEXT: secret.conceal %[[ARG]]
// CHECK-NEXT: secret.generic
// CHECK-NEXT: ^bb0(%[[SARG:.*]]: memref<1xi32>)
// CHECK-NEXT: ^body(%[[SARG:.*]]: memref<1xi32>)
// CHECK-NEXT: %[[V0:.*]] = func.call [[F1:.*]](%[[SARG]]) : (memref<1xi32>) -> memref<1xi32>
// CHECK-NEXT: secret.yield %[[V0]]
// CHECK: return
Expand All @@ -84,7 +84,7 @@ module {
func.func @test_region(%value : memref<1xi32>) {
%Y = secret.conceal %value : memref<1xi32> -> !secret.secret<memref<1xi32>>
%Z = secret.generic ins(%Y : !secret.secret<memref<1xi32>>) {
^bb0(%y: memref<1xi32>) :
^body(%y: memref<1xi32>) :
%c7_i32_0 = arith.constant 7 : i32
affine.for %i = 0 to 1 {
%0 = affine.load %y[%i] : memref<1xi32>
Expand Down
18 changes: 9 additions & 9 deletions tests/Dialect/Secret/Transforms/merge_adjacent_generics.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ func.func @test_chained_input_output(%value : !ty) -> !ty {
// CHECK: %[[c1:.*]] = arith.constant 1
%c1 = arith.constant 1 : i32
// CHECK: secret.generic ins(%[[value]]
// CHECK-NEXT: ^bb{{[0-9]}}(%[[clear_value:.*]]: i32):
// CHECK-NEXT: ^body(%[[clear_value:.*]]: i32):
// CHECK-NEXT: %[[res:.*]] = arith.addi %[[clear_value]], %[[c1]]
// CHECK-NEXT: %[[res2:.*]] = arith.addi %[[res]], %[[c1]]
// CHECK-NEXT: secret.yield %[[res2:.*]]
// CHECK-NOT: secret.generic
%0 = secret.generic ins(%value : !ty) {
^bb0(%x: i32) :
^body(%x: i32) :
%res = arith.addi %x, %c1: i32
secret.yield %res : i32
} -> (!ty)
%1 = secret.generic ins(%0 : !ty) {
^bb0(%x: i32) :
^body(%x: i32) :
%res = arith.addi %x, %c1: i32
secret.yield %res : i32
} -> (!ty)
Expand All @@ -32,18 +32,18 @@ func.func @test_chained_input_output(%value : !ty) -> !ty {
!ty = !secret.secret<i32>
func.func @test_shared_input(%v1: !ty, %v2: !ty, %v3: !ty) -> !ty {
// CHECK: secret.generic ins(%[[v1]], %[[v2]], %[[v3]]
// CHECK-NEXT: ^bb{{[0-9]}}(%[[cv1:.*]]: i32, %[[cv2:.*]]: i32, %[[cv3:.*]]: i32
// CHECK-NEXT: ^body(%[[cv1:.*]]: i32, %[[cv2:.*]]: i32, %[[cv3:.*]]: i32
// CHECK-NEXT: %[[r1:.*]] = arith.addi %[[cv1]], %[[cv2]]
// CHECK-NEXT: %[[r2:.*]] = arith.addi %[[cv2]], %[[cv3]]
// CHECK-NEXT: secret.yield %[[r1]], %[[r2]]
// CHECK-NOT: secret.generic
%0 = secret.generic ins(%v1, %v2 : !ty, !ty) {
^bb0(%clear1: i32, %clear2: i32) :
^body(%clear1: i32, %clear2: i32) :
%res = arith.addi %clear1, %clear2: i32
secret.yield %res : i32
} -> (!ty)
%1 = secret.generic ins(%v2, %v3 : !ty, !ty) {
^bb0(%clear2: i32, %clear3: i32) :
^body(%clear2: i32, %clear3: i32) :
%res = arith.addi %clear2, %clear3: i32
secret.yield %res : i32
} -> (!ty)
Expand All @@ -59,18 +59,18 @@ func.func @test_unshared_input(%v1: !ty, %v2: !ty, %v3: !ty) -> !ty {
// CHECK: %[[c1:.*]] = arith.constant 1
%c1 = arith.constant 1 : i32
// CHECK: secret.generic ins(%[[v1]], %[[v2]], %[[v3]]
// CHECK-NEXT: ^bb{{[0-9]}}(%[[cv1:.*]]: i32, %[[cv2:.*]]: i32, %[[cv3:.*]]: i32
// CHECK-NEXT: ^body(%[[cv1:.*]]: i32, %[[cv2:.*]]: i32, %[[cv3:.*]]: i32
// CHECK-NEXT: %[[r1:.*]] = arith.addi %[[cv1]], %[[c1]]
// CHECK-NEXT: %[[r2:.*]] = arith.addi %[[cv2]], %[[cv3]]
// CHECK-NEXT: secret.yield %[[r1]], %[[r2]]
// CHECK-NOT: secret.generic
%0 = secret.generic ins(%v1 : !ty) {
^bb0(%clear1: i32) :
^body(%clear1: i32) :
%res = arith.addi %clear1, %c1: i32
secret.yield %res : i32
} -> (!ty)
%1 = secret.generic ins(%v2, %v3 : !ty, !ty) {
^bb0(%clear2: i32, %clear3: i32) :
^body(%clear2: i32, %clear3: i32) :
%res = arith.addi %clear2, %clear3: i32
secret.yield %res : i32
} -> (!ty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ func.func @test_affine_for(
%data: !secret.secret<memref<10xi32>>) -> !secret.secret<memref<10xi32>> {
// CHECK: affine.for
// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: affine.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: affine.store
Expand All @@ -17,7 +17,7 @@ func.func @test_affine_for(
// CHECK: return %[[data]]
secret.generic
ins(%value, %data : !secret.secret<i32>, !secret.secret<memref<10xi32>>) {
^bb0(%clear_value: i32, %clear_data : memref<10xi32>):
^body(%clear_value: i32, %clear_data : memref<10xi32>):
affine.for %i = 0 to 10 {
%2 = affine.load %clear_data[%i] : memref<10xi32>
%3 = arith.addi %2, %clear_value : i32
Expand All @@ -36,14 +36,14 @@ func.func @test_affine_for_split_end(
%data: !secret.secret<memref<10xi32>>) -> !secret.secret<memref<10xi32>> {
secret.generic
ins(%value, %data : !secret.secret<i32>, !secret.secret<memref<10xi32>>) {
^bb0(%clear_value: i32, %clear_data : memref<10xi32>):
^body(%clear_value: i32, %clear_data : memref<10xi32>):
// CHECK: arith.constant
// CHECK: arith.constant
%c7 = arith.constant 7 : i32
%c0 = arith.constant 0 : index

// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: memref.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: memref.store
Expand All @@ -54,7 +54,7 @@ func.func @test_affine_for_split_end(

// CHECK: affine.for
// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: affine.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: arith.addi
Expand All @@ -81,14 +81,14 @@ func.func @test_affine_for_split_middle(
%data: !secret.secret<memref<10xi32>>) -> !secret.secret<memref<10xi32>> {
secret.generic
ins(%value, %data : !secret.secret<i32>, !secret.secret<memref<10xi32>>) {
^bb0(%clear_value: i32, %clear_data : memref<10xi32>):
^body(%clear_value: i32, %clear_data : memref<10xi32>):
// CHECK: arith.constant
// CHECK: arith.constant
%c7 = arith.constant 7 : i32
%c0 = arith.constant 0 : index

// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: memref.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: memref.store
Expand All @@ -99,7 +99,7 @@ func.func @test_affine_for_split_middle(

// CHECK: affine.for
// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: affine.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: arith.addi
Expand All @@ -113,7 +113,7 @@ func.func @test_affine_for_split_middle(
}

// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: memref.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: memref.store
Expand All @@ -132,15 +132,15 @@ func.func @test_affine_for_split_middle(
// CHECK-SAME: %[[data:.*]]: !secret.secret<memref<10xi8>>
func.func @affine_for_yielding_memref(%arg0: !secret.secret<memref<10xi8>>) -> !secret.secret<memref<10xi8>> {
%0 = secret.generic ins(%arg0 : !secret.secret<memref<10xi8>>) {
^bb0(%arg1: memref<10xi8>):
^body(%arg1: memref<10xi8>):
// CHECK: secret.generic
// CHECK-NEXT: memref.alloc
// CHECK-NEXT: secret.yield
%alloc = memref.alloc() {alignment = 64 : i64} : memref<10xi8>

// CHECK: affine.for
// CHECK: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: affine.load
// CHECK-NEXT: affine.store
// CHECK-NEXT: secret.yield
Expand All @@ -157,7 +157,7 @@ func.func @affine_for_yielding_memref(%arg0: !secret.secret<memref<10xi8>>) -> !
// CHECK-SAME: %[[data:.*]]: !secret.secret<memref<1x80xi8>>
func.func @affine_for_hello_world_reproducer(%arg0: !secret.secret<memref<1x80xi8>>) -> !secret.secret<memref<1x80xi8>> {
%0 = secret.generic ins(%arg0 : !secret.secret<memref<1x80xi8>>) {
^bb0(%arg1: memref<1x80xi8>):
^body(%arg1: memref<1x80xi8>):
// CHECK: arith.constant
%c-128_i8 = arith.constant -128 : i8

Expand All @@ -169,7 +169,7 @@ func.func @affine_for_hello_world_reproducer(%arg0: !secret.secret<memref<1x80xi
// CHECK: affine.for
// CHECK-NEXT: affine.for
// CHECK-NEXT: secret.generic
// CHECK-NEXT: bb
// CHECK-NEXT: ^body
// CHECK-NEXT: affine.load
// CHECK-NEXT: arith.addi
// CHECK-NEXT: affine.store
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func.func @simple_sum_secret_bound(%arg0: tensor<32xi16> { secret.secret }, %arg
%c0_i16 = arith.constant 0 : i16
%c1 = arith.constant 1 : index
// CHECK: secret.generic ins(%[[data]], %[[arg1]] : !secret.secret<tensor<32xi16>>, !secret.secret<index>)
// CHECK-NEXT: ^bb0(%[[DATA:.*]]: tensor<32xi16>, %[[ARG1:.*]]: index):
// CHECK-NEXT: ^body(%[[DATA:.*]]: tensor<32xi16>, %[[ARG1:.*]]: index):
// CHECK-NEXT: %[[sum:.*]] = scf.for
// CHECK-SAME: to %[[ARG1]]
%1 = scf.for %arg4 = %c0 to %arg1 step %c1 iter_args(%arg5 = %c0_i16) -> (i16) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func.func @test_separator(
%c0_i32 = arith.constant 0 : i32
%0 = secret.generic
ins(%value : !secret.secret<i32>) {
^bb0(%clear_value: i32):
^body(%clear_value: i32):
%alloc_0 = memref.alloc() : memref<10xi32>
affine.for %i = 0 to 10 {
affine.store %c0_i32, %alloc_0[%i] : memref<10xi32>
Expand All @@ -33,7 +33,7 @@ func.func @test_separator(
func.func @test_operand_defined_in_region(
%value: !secret.secret<memref<10xi32>>) -> !secret.secret<memref<10xi32>> {
// CHECK: %[[data:.*]] = secret.generic
// CHECK-NEXT: ^bb0
// CHECK-NEXT: ^body
// CHECK-NEXT: memref.alloc
// CHECK: affine.for
// CHECK-NEXT: affine.load
Expand All @@ -43,7 +43,7 @@ func.func @test_operand_defined_in_region(
// CHECK: return %[[data]]
%0 = secret.generic
ins(%value : !secret.secret<memref<10xi32>>) {
^bb0(%clear_value: memref<10xi32>):
^body(%clear_value: memref<10xi32>):
%alloc_0 = memref.alloc() : memref<10xi32>
affine.for %i = 0 to 10 {
%1 = affine.load %clear_value[%i] : memref<10xi32>
Expand Down
Loading

0 comments on commit 473c87f

Please sign in to comment.