Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion include/NeuraDialect/Architecture/Architecture.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,12 @@ class Link : public BasicResource {

class Register : public BasicResource {
public:
Register(int id);
Register(int id, int local_id);

int getId() const override;

int getLocalId() const;
void setLocalId(int local_id);

std::string getType() const override { return "register"; }

Expand All @@ -280,6 +283,7 @@ class Register : public BasicResource {

private:
int id;
int local_id;
RegisterFile *register_file;
};

Expand Down
5 changes: 5 additions & 0 deletions lib/Conversion/LlvmToNeura/LlvmToNeuraPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,11 @@ struct LlvmReturnToNeuraReturn : public OpRewritePattern<LLVM::ReturnOp> {
}
};






struct FuncReturnToNeuraReturn : public OpRewritePattern<func::ReturnOp> {
using OpRewritePattern::OpRewritePattern;

Expand Down
12 changes: 9 additions & 3 deletions lib/NeuraDialect/Architecture/Architecture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,10 +252,14 @@ Tile *FunctionUnit::getTile() const { return this->tile; }
// Register
//===----------------------------------------------------------------------===//

Register::Register(int id) { this->id = id; }
Register::Register(int id, int local_id) : id(id), local_id(local_id) {}

int Register::getId() const { return id; }

int Register::getLocalId() const { return local_id; }

void Register::setLocalId(int local_id) { this->local_id = local_id; }

Tile *Register::getTile() const {
return this->register_file ? register_file->getTile() : nullptr;
}
Expand Down Expand Up @@ -344,10 +348,11 @@ void Architecture::createRegisterFileCluster(Tile *tile, int num_registers, int
RegisterFileCluster *register_file_cluster = new RegisterFileCluster(tile->getId());

// Creates registers as a register file.
int local_reg_id = 0;
for (int file_idx = 0; file_idx < k_num_regfiles_per_cluster; ++file_idx) {
RegisterFile *register_file = new RegisterFile(file_idx);
for (int reg_idx = 0; reg_idx < k_num_regs_per_regfile; ++reg_idx) {
Register *reg = new Register(reg_id++);
Register *reg = new Register(reg_id++, local_reg_id++);
register_file->addRegister(reg);
}
register_file_cluster->addRegisterFile(register_file);
Expand Down Expand Up @@ -388,10 +393,11 @@ void Architecture::recreateRegisterFileCluster(Tile *tile, int num_registers) {

// Creates registers with new capacity.
int reg_id = tile->getId() * 1000; // Use tile ID as base to avoid conflicts.
int local_reg_id = 0;
for (int file_idx = 0; file_idx < kNumRegfilesPerCluster; ++file_idx) {
RegisterFile *register_file = new RegisterFile(file_idx);
for (int reg_idx = 0; reg_idx < kNumRegsPerRegfile; ++reg_idx) {
Register *reg = new Register(reg_id++);
Register *reg = new Register(reg_id++, local_reg_id++);
register_file->addRegister(reg);
}
new_register_file_cluster->addRegisterFile(register_file);
Expand Down
10 changes: 9 additions & 1 deletion lib/NeuraDialect/Mapping/MappingState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,13 +263,21 @@ void MappingState::encodeMappingState() {
mapping_entries.push_back(dict);
} else if (loc.resource->getKind() == ResourceKind::Register) {
kind_str = "register";
Register *reg = static_cast<Register *>(loc.resource);
int global_id = loc.resource->getId();
int local_register_id = reg->getLocalId();

auto dict = mlir::DictionaryAttr::get(
ctx, {mlir::NamedAttribute(mlir::StringAttr::get(ctx, "resource"),
mlir::StringAttr::get(ctx, kind_str)),
mlir::NamedAttribute(
mlir::StringAttr::get(ctx, "id"),
mlir::IntegerAttr::get(mlir::IntegerType::get(ctx, 32),
loc.resource->getId())),
global_id)),
mlir::NamedAttribute(
mlir::StringAttr::get(ctx, "local_register_id"),
mlir::IntegerAttr::get(mlir::IntegerType::get(ctx, 32),
local_register_id)),
mlir::NamedAttribute(
mlir::StringAttr::get(ctx, "time_step"),
mlir::IntegerAttr::get(mlir::IntegerType::get(ctx, 32),
Expand Down
38 changes: 29 additions & 9 deletions lib/NeuraDialect/Transforms/GenerateCodePass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ struct Tile {
struct ArrayConfig {
int columns;
int rows;
int compiled_ii = -1;
std::vector<Tile> cores;
};

Expand Down Expand Up @@ -109,8 +110,9 @@ static std::optional<int> getMappedRegId(Operation *op) {
auto resource_attr = dyn_cast_or_null<StringAttr>(location_dict.get("resource"));
if (!resource_attr) continue;
if (resource_attr.getValue() == "register" || resource_attr.getValue() == "reg") {
if (auto register_id = dyn_cast_or_null<IntegerAttr>(location_dict.get("id")))
return register_id.getInt();
if (auto local_register_id = dyn_cast_or_null<IntegerAttr>(location_dict.get("local_register_id"))) {
return local_register_id.getInt();
}
}
}
}
Expand Down Expand Up @@ -248,10 +250,10 @@ static SmallVector<RegStep, 4> collectRegSteps(Operation *op) {
auto resource_attr = dyn_cast_or_null<StringAttr>(location_dict.get("resource"));
if (!resource_attr) continue;
if (resource_attr.getValue() == "register" || resource_attr.getValue() == "reg") {
auto register_id = dyn_cast_or_null<IntegerAttr>(location_dict.get("id"));
auto local_register_id = dyn_cast_or_null<IntegerAttr>(location_dict.get("local_register_id"));
auto time_step = dyn_cast_or_null<IntegerAttr>(location_dict.get("time_step"));
if (!register_id || !time_step) continue;
steps.push_back({(int)register_id.getInt(), (int)time_step.getInt()});
if (!local_register_id || !time_step) continue;
steps.push_back({(int)local_register_id.getInt(), (int)time_step.getInt()});
}
}
}
Expand Down Expand Up @@ -317,6 +319,15 @@ struct GenerateCodePass
return {columns, rows};
}

int getCompiledII(func::FuncOp function) {
if (auto mapping_info = function->getAttrOfType<DictionaryAttr>("mapping_info")) {
if (auto compiled_ii = dyn_cast_or_null<IntegerAttr>(mapping_info.get("compiled_ii"))) {
return compiled_ii.getInt();
}
}
return -1;
}

// ---------- Single-walk indexing ----------.
// Do everything that needs walks in a single pass:.
// - record operation_placements.
Expand Down Expand Up @@ -571,8 +582,8 @@ struct GenerateCodePass
}
}

ArrayConfig buildArrayConfig(int columns, int rows) {
ArrayConfig config{columns, rows, {}};
ArrayConfig buildArrayConfig(int columns, int rows, int compiled_ii = -1) {
ArrayConfig config{columns, rows, compiled_ii, {}};
std::map<std::pair<int,int>, std::vector<Instruction>> tile_insts;

// Flattens and sorts by timesteps.
Expand Down Expand Up @@ -600,7 +611,11 @@ struct GenerateCodePass
llvm::raw_fd_ostream yaml_out("tmp-generated-instructions.yaml", ec);
if (ec) return;

yaml_out << "array_config:\n columns: " << config.columns << "\n rows: " << config.rows << "\n cores:\n";
yaml_out << "array_config:\n columns: " << config.columns << "\n rows: " << config.rows;
if (config.compiled_ii >= 0) {
yaml_out << "\n compiled_ii: " << config.compiled_ii;
}
yaml_out << "\n cores:\n";
for (const Tile &core : config.cores) {
yaml_out << " - column: " << core.col_idx << "\n row: " << core.row_idx
<< "\n core_id: \"" << core.core_id << "\"\n entries:\n";
Expand Down Expand Up @@ -657,6 +672,10 @@ struct GenerateCodePass
llvm::raw_fd_ostream asm_out("tmp-generated-instructions.asm", ec);
if (ec) return;

if (config.compiled_ii >= 0) {
asm_out << "# Compiled II: " << config.compiled_ii << "\n\n";
}

for (const Tile &core : config.cores) {
asm_out << "PE(" << core.col_idx << "," << core.row_idx << "):\n";

Expand Down Expand Up @@ -765,7 +784,8 @@ struct GenerateCodePass
expandMovImpl<true>(op, topo, reserve_to_phi_map);
logUnresolvedOperands();

ArrayConfig config = buildArrayConfig(columns, rows);
int compiled_ii = getCompiledII(func);
ArrayConfig config = buildArrayConfig(columns, rows, compiled_ii);
writeYAMLOutput(config);
writeASMOutput(config);
}
Expand Down
24 changes: 12 additions & 12 deletions test/e2e/fir/fir_kernel.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -33,41 +33,41 @@
// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data<i64, i1>
// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i32}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data<i32, i1>
// MAPPING-NEXT: %2 = neura.reserve : !neura.data<i32, i1>
// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {mapping_locs = [{id = 128 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {mapping_locs = [{id = 128 : i32, local_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %4 = "neura.phi"(%2, %3) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data<i32, i1>, !neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %5 = neura.reserve : !neura.data<i64, i1>
// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {mapping_locs = [{id = 352 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {mapping_locs = [{id = 352 : i32, local_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %7 = "neura.phi"(%5, %6) {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data<i64, i1>, !neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 37 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %9 = "neura.gep"(%8) <{operandSegmentSizes = array<i32: 0, 1>}> {lhs_value = "%arg0", mapping_locs = [{id = 15 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<!llvm.ptr, i1>
// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 480 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data<!llvm.ptr, i1>) -> !neura.data<!llvm.ptr, i1>
// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 480 : i32, local_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data<!llvm.ptr, i1>) -> !neura.data<!llvm.ptr, i1>
// MAPPING-NEXT: %11 = "neura.load"(%10) {mapping_locs = [{id = 15 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data<!llvm.ptr, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %12 = "neura.data_mov"(%7) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %13 = "neura.gep"(%12) <{operandSegmentSizes = array<i32: 0, 1>}> {lhs_value = "%arg2", mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<!llvm.ptr, i1>
// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data<!llvm.ptr, i1>) -> !neura.data<!llvm.ptr, i1>
// MAPPING-NEXT: %15 = "neura.load"(%14) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data<!llvm.ptr, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 3 : i32}, {id = 34 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {mapping_locs = [{id = 46 : i32, resource = "link", time_step = 3 : i32}, {id = 448 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {mapping_locs = [{id = 46 : i32, resource = "link", time_step = 3 : i32}, {id = 448 : i32, local_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %18 = "neura.mul"(%16, %17) {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data<i32, i1>, !neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {mapping_locs = [{id = 43 : i32, resource = "link", time_step = 5 : i32}, {id = 42 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, resource = "link", time_step = 5 : i32}, {id = 288 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, resource = "link", time_step = 5 : i32}, {id = 288 : i32, local_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %21 = "neura.add"(%19, %20) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data<i32, i1>, !neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {mapping_locs = [{id = 352 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {mapping_locs = [{id = 352 : i32, local_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %23 = "neura.add"(%22) {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 1 : i64} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %25 = "neura.icmp"(%24) <{cmpType = "eq"}> {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 32 : i64} : (!neura.data<i64, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {mapping_locs = [{id = 320 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {mapping_locs = [{id = 320 : i32, local_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %27 = "neura.not"(%26) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {mapping_locs = [{id = 352 : i32, resource = "register", time_step = 2 : i32}, {id = 35 : i32, resource = "link", time_step = 3 : i32}, {id = 320 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {mapping_locs = [{id = 321 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {mapping_locs = [{id = 352 : i32, local_register_id = 0 : i32, resource = "register", time_step = 2 : i32}, {id = 35 : i32, resource = "link", time_step = 3 : i32}, {id = 320 : i32, local_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i64, i1>) -> !neura.data<i64, i1>
// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {mapping_locs = [{id = 321 : i32, local_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %30 = neura.grant_predicate %28, %29 {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data<i64, i1>, !neura.data<i1, i1> -> !neura.data<i64, i1>
// MAPPING-NEXT: neura.ctrl_mov %30 -> %5 {mapping_locs = [{id = 32 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data<i64, i1> !neura.data<i64, i1>
// MAPPING-NEXT: %31 = "neura.data_mov"(%21) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 4 : i32}, {id = 27 : i32, resource = "link", time_step = 5 : i32}, {id = 256 : i32, resource = "register", time_step = 6 : i32}, {id = 256 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 4 : i32}, {id = 27 : i32, resource = "link", time_step = 5 : i32}, {id = 256 : i32, local_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 256 : i32, local_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data<i32, i1>, !neura.data<i1, i1> -> !neura.data<i32, i1>
// MAPPING-NEXT: neura.ctrl_mov %33 -> %2 {mapping_locs = [{id = 25 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data<i32, i1> !neura.data<i32, i1>
// MAPPING-NEXT: %34 = "neura.data_mov"(%21) {mapping_locs = [{id = 29 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 160 : i32, resource = "register", time_step = 5 : i32}, {id = 160 : i32, resource = "register", time_step = 6 : i32}, {id = 160 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 160 : i32, local_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 160 : i32, local_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 160 : i32, local_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data<i1, i1>) -> !neura.data<i1, i1>
// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data<i32, i1>, !neura.data<i1, i1> -> !neura.data<i32, i1>
// MAPPING-NEXT: %37 = "neura.data_mov"(%36) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data<i32, i1>) -> !neura.data<i32, i1>
// MAPPING-NEXT: "neura.return"(%37) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 9 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data<i32, i1>) -> ()
Expand All @@ -78,5 +78,5 @@

// ASM: PE(0,1):
// ASM-NEXT: {
// ASM-NEXT: GRANT_ONCE, [#0] -> [$128]
// ASM-NEXT: GRANT_ONCE, [#0] -> [$0]
// ASM-NEXT: } (t=3)
Loading