Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
54 changes: 43 additions & 11 deletions lib/NeuraDialect/Transforms/GenerateCodePass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -523,21 +523,53 @@ struct GenerateCodePass
// Checks if operation has constant_value attribute (for non-CONSTANT operations).
inst.src_operands.emplace_back(getConstantLiteral(op), "RED");
} else {
// Handles normal operands, including operations with rhs_value attribute.
// Handles normal operands and folded constants (lhs_value/rhs_value).
SmallVector<Value> operands; operands.reserve(op->getNumOperands());

// Processes actual Value operands (if any).
for (Value v : op->getOperands()) {

auto appendLiteralSlot = [&](Attribute attr) -> bool {
// If there is no attribute, there is no folded constant.
if (!attr) return false;
std::string literal = extractConstantLiteralFromAttr(attr);
if (literal.empty()) {
// Attribute exists but cannot be serialized to current literal form.
// Keep slot alignment and surface a clear diagnostic.
op->emitError("unsupported constant attribute in lhs_value/rhs_value")
<< ": " << attr;
literal = "UNSUPPORTED_CONSTANT";
}
inst.src_operands.emplace_back(literal, "RED");
// Keeps index alignment with operation_to_operands for rewiring.
operands.push_back(Value());
return true;
};
auto appendValueSlot = [&](Value v) {
operands.push_back(v);
inst.src_operands.emplace_back("UNRESOLVED", "RED");
}

// Handles cases where binary operations have the RHS constant stored as an attribute.
if (auto rhs_value_attr = op->getAttr(attr::kRhsValue)) {
std::string rhs_literal = extractConstantLiteralFromAttr(rhs_value_attr);
if (!rhs_literal.empty()) {
inst.src_operands.emplace_back(rhs_literal, "RED");
};

// StoreIndexed has operand order: value(lhs) -> base(rhs) -> indices.
// rhs_value must be inserted before indices (not appended at tail).
if (auto store_indexed_op = dyn_cast<StoreIndexedOp>(op)) {
bool lhs_folded = appendLiteralSlot(op->getAttr(attr::kLhsValue));
if (!lhs_folded) appendValueSlot(store_indexed_op.getValue());

bool rhs_folded = appendLiteralSlot(op->getAttr(attr::kRhsValue));
if (!rhs_folded) {
Value base = store_indexed_op.getBase();
if (base) appendValueSlot(base);
}

for (Value index : store_indexed_op.getIndices()) {
appendValueSlot(index);
}
} else {
// Generic handling:
// - lhs_value is the leading source slot.
// - remaining Value operands keep original order.
// - rhs_value is the trailing source slot.
appendLiteralSlot(op->getAttr(attr::kLhsValue));
for (Value v : op->getOperands()) appendValueSlot(v);
appendLiteralSlot(op->getAttr(attr::kRhsValue));
}

operation_to_operands[op] = std::move(operands);
Expand Down
2 changes: 1 addition & 1 deletion test/benchmark/Zeonica_Testbench
Submodule Zeonica_Testbench updated 51 files
+0 −0 kernel/axpy/tmp-generated-dfg.dot
+0 −0 kernel/axpy/tmp-generated-dfg.yaml
+2 −2 kernel/axpy/tmp-generated-instructions.asm
+4 −0 kernel/axpy/tmp-generated-instructions.yaml
+0 −0 kernel/bicg/tmp-generated-dfg.dot
+0 −0 kernel/bicg/tmp-generated-dfg.yaml
+6 −6 kernel/bicg/tmp-generated-instructions.asm
+12 −0 kernel/bicg/tmp-generated-instructions.yaml
+76 −0 kernel/conv/conv-dfg.dot
+242 −0 kernel/conv/conv-dfg.yaml
+102 −0 kernel/conv/conv-instructions.asm
+466 −0 kernel/conv/conv-instructions.yaml
+139 −0 kernel/conv/conv.c
+80 −0 kernel/conv/conv.h
+217 −0 kernel/conv/polybench.h
+80 −0 kernel/conv/tmp-generated-dfg.dot
+256 −0 kernel/conv/tmp-generated-dfg.yaml
+108 −0 kernel/conv/tmp-generated-instructions.asm
+494 −0 kernel/conv/tmp-generated-instructions.yaml
+0 −0 kernel/fft/tmp-generated-dfg.dot
+0 −0 kernel/fft/tmp-generated-dfg.yaml
+6 −6 kernel/fft/tmp-generated-instructions.asm
+12 −0 kernel/fft/tmp-generated-instructions.yaml
+3 −5 kernel/fir/tmp-generated-dfg.dot
+4 −11 kernel/fir/tmp-generated-dfg.yaml
+10 −13 kernel/fir/tmp-generated-instructions.asm
+18 −30 kernel/fir/tmp-generated-instructions.yaml
+0 −0 kernel/gemm/tmp-generated-dfg.dot
+0 −0 kernel/gemm/tmp-generated-dfg.yaml
+3 −3 kernel/gemm/tmp-generated-instructions.asm
+6 −0 kernel/gemm/tmp-generated-instructions.yaml
+0 −0 kernel/gemv/tmp-generated-dfg.dot
+0 −0 kernel/gemv/tmp-generated-dfg.yaml
+3 −3 kernel/gemv/tmp-generated-instructions.asm
+6 −0 kernel/gemv/tmp-generated-instructions.yaml
+0 −51 kernel/histogram/histogram-dfg.dot
+0 −76 kernel/histogram/histogram-instructions.asm
+51 −0 kernel/histogram/tmp-generated-dfg.dot
+58 −58 kernel/histogram/tmp-generated-dfg.yaml
+72 −0 kernel/histogram/tmp-generated-instructions.asm
+151 −155 kernel/histogram/tmp-generated-instructions.yaml
+0 −0 kernel/relu/tmp-generated-dfg.dot
+0 −0 kernel/relu/tmp-generated-dfg.yaml
+2 −2 kernel/relu/tmp-generated-instructions.asm
+4 −0 kernel/relu/tmp-generated-instructions.yaml
+0 −513 kernel/spmv/spmv-dfg.dot
+0 −570 kernel/spmv/spmv-instructions.asm
+622 −0 kernel/spmv/tmp-generated-dfg.dot
+1,143 −760 kernel/spmv/tmp-generated-dfg.yaml
+651 −0 kernel/spmv/tmp-generated-instructions.asm
+1,761 −1,129 kernel/spmv/tmp-generated-instructions.yaml
Loading
Loading