| 713 | } |
| 714 | |
| 715 | ValueRefList CompiledTransformation::apply_op( |
| 716 | const ApplyOp& apply_op, Span<ValueRef> inputs) { |
| 717 | auto& item = next_instruction(); |
| 718 | trace_assert(inputs.size() == item.inputs.size(), "input size mismatch"); |
| 719 | trace_assert(apply_op.op().is_same(*item.op), "operator mismatch"); |
| 720 | ValueRefList outputs(item.outputs.size()); |
| 721 | if (!m_imperative) { |
| 722 | for (size_t i = 0; i < inputs.size(); ++i) { |
| 723 | trace_input(item.inputs[i], inputs[i]); |
| 724 | } |
| 725 | for (size_t i = 0; i < item.outputs.size(); ++i) { |
| 726 | outputs[i] = trace_output(item.outputs[i], {}); |
| 727 | } |
| 728 | } else { |
| 729 | SmallVector<ValueRef> input_values; |
| 730 | for (size_t i = 0; i < inputs.size(); ++i) { |
| 731 | input_values.push_back(trace_input(item.inputs[i], inputs[i])); |
| 732 | } |
| 733 | auto&& output_values = imperative::apply(apply_op, input_values); |
| 734 | mgb_assert(output_values.size() == outputs.size()); |
| 735 | for (size_t i = 0; i < item.outputs.size(); ++i) { |
| 736 | outputs[i] = trace_output(item.outputs[i], output_values[i]); |
| 737 | } |
| 738 | } |
| 739 | return outputs; |
| 740 | } |
| 741 | |
| 742 | ValueRefList CompiledTransformation::apply_get_attr( |
| 743 | const GetAttr& get_attr, Span<ValueRef> inputs) { |