Skip to documentation
SLOP

tiny.choir.OperationEquivalence

Reference tiny.choir OperationEquivalence

Defined in ir.equivalence.

API (6)

Actions

Public operations.

Types and contracts

Public types and contracts.

No direct callersNo direct callsir.equivalenceOperationEquivalence
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/choir/src/core/equivalence.zig:12

zig
pub const OperationEquivalence = struct {    pub const ValueMapper = *const fn (?*const anyopaque, *Value) *Value;    pub const AttributeFilter = *const fn (?*const anyopaque, *Operation, NamedAttribute) bool;    pub const Options = struct {        value_mapper: ?ValueMapper = null,        value_mapper_context: ?*const anyopaque = null,        attribute_filter: ?AttributeFilter = null,        attribute_filter_context: ?*const anyopaque = null,        commute_operands: bool = false,        include_locations: bool = false,    };    pub fn computeHash(        op: *Operation,        options: Options,    ) u64 {        var hasher = std.hash.Wyhash.init(0);        updateBytes(&hasher, op.name.name);        updateU64(&hasher, op.regions.items.len);        updateU64(&hasher, op.successors.items.len);        updateU64(&hasher, op.result_types.len);        for (op.result_types) |typ| {            updateU64(&hasher, typ.uniqueId());        }        if (options.include_locations) {            updateLocation(&hasher, op.location);        }        const operands = op.operand_values;        updateU64(&hasher, operands.len);        if (options.commute_operands and operands.len > 1) {            var operand_hash: u64 = 0;            for (operands) |operand| {                operand_hash +%= valueHash(options, operand);            }            updateU64(&hasher, operand_hash);        } else {            for (operands) |operand| {                updateU64(&hasher, valueHash(options, operand));            }        }        var hash_iter = op.getAttrs();        while (hash_iter.next()) |attr| {            if (!attributeIncluded(options, op, attr)) continue;            updateBytes(&hasher, attr.name);            updateAttribute(&hasher, attr.value);        }        return hasher.final();    }    pub fn isEquivalentTo(        lhs: *Operation,        rhs: *Operation,        options: Options,    ) bool {        if (lhs == rhs) return true;        if (!sameName(lhs.name.name, rhs.name.name)) return false;        if (lhs.regions.items.len != rhs.regions.items.len) return false;        if (lhs.successors.items.len != rhs.successors.items.len) return false;        if (lhs.operands.items.len != rhs.operands.items.len) return false;        if (lhs.result_types.len != rhs.result_types.len) return false;        if (options.include_locations and !lhs.location.eql(rhs.location)) return false;        for (lhs.result_types, rhs.result_types) |lhs_type, rhs_type| {            if (!lhs_type.eql(rhs_type)) return false;        }        if (!operandsEquivalent(lhs.operand_values, rhs.operand_values, options)) {            return false;        }        return attrsEquivalent(lhs, rhs, options);    }    pub fn exactValueMapper(_: ?*const anyopaque, value: *Value) *Value {        return value;    }    fn valueHash(options: Options, value: *Value) u64 {        return @intFromPtr(mapValue(options, value));    }    fn mapValue(options: Options, value: *Value) *Value {        if (options.value_mapper) |mapper| {            return mapper(options.value_mapper_context, value);        }        return value;    }    fn attributeIncluded(options: Options, op: *Operation, attr: NamedAttribute) bool {        if (options.attribute_filter) |filter| {            return filter(options.attribute_filter_context, op, attr);        }        return true;    }};

Source: lib/choir/src/root.zig:38

zig
pub const OperationEquivalence = ir.OperationEquivalence;
Called byCallstest sourcelib.choir.src.core.equivalencetest: OperationEquivalence commutes o...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence filters no...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence hashes inh...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence keeps dist...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence maps value...+2 moreprivate sourcelib.choir.src.core.equivalence.OperationEquiv...attributeIncludedprivate sourcelib.choir.src.core.equivalence.OperationEquiv...valueHashprivate sourcelib.choir.src.core.equivalenceupdateAttributeprivate sourcelib.choir.src.core.equivalenceupdateBytesprivate sourcelib.choir.src.core.equivalenceupdateLocationprivate sourcelib.choir.src.core.equivalenceupdateU64OperationEquivalencecomputeHash
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallstest sourcelib.choir.src.core.equivalencetest: OperationEquivalence commutes o...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence filters no...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence hashes inh...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence keeps dist...test sourcelib.choir.src.core.equivalencetest: OperationEquivalence maps value...+2 moreprivate sourcelib.choir.src.core.equivalenceattrsEquivalentprivate sourcelib.choir.src.core.equivalenceoperandsEquivalentprivate sourcelib.choir.src.core.equivalencesameNameOperationEquivalenceisEquivalentTo
Static calls · unresolved targets: 0 · external targets: 2.

Also reachable as

backends.wasm.emission.module_encoding.common.ir.OperationEquivalence, backends.wasm.emission.module_encoding.common.ir.equivalence.OperationEquivalence, ir.OperationEquivalence.

Complete caller list for OperationEquivalence.computeHash

7 direct callers.

Complete caller list for OperationEquivalence.isEquivalentTo

7 direct callers.

Audit

Definitions7
Public names35
Members6
Version26.7.0
Revisiondaab053ee433