From d35075a7be7a2b9c7ad1c7e28b6496b3c11accf4 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 4 Jan 2021 18:54:41 -0500 Subject: [PATCH] pan/bi: Union modifiers from across variants itertools.groupby depends on sorting, so this code was quietly broken on cases like FADD.v2f16. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bifrost_isa.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/panfrost/bifrost/bifrost_isa.py b/src/panfrost/bifrost/bifrost_isa.py index b2c22864026..31bb5620ce9 100644 --- a/src/panfrost/bifrost/bifrost_isa.py +++ b/src/panfrost/bifrost/bifrost_isa.py @@ -245,13 +245,15 @@ def simplify_to_ir(ins): } -def combine_ir_variants(instructions, v): - variants = sum([[simplify_to_ir(Q[1]) for Q in instructions[x]] for x in v], []) +def combine_ir_variants(instructions, key): + seen = [op for op in instructions.keys() if op[1:] == key] + variant_objs = [[simplify_to_ir(Q[1]) for Q in instructions[x]] for x in seen] + variants = sum(variant_objs, []) # Accumulate modifiers across variants modifiers = {} - for s in variants: + for s in variants[0:]: # Check consistency assert(s['srcs'] == variants[0]['srcs']) assert(s['dests'] == variants[0]['dests']) @@ -271,15 +273,19 @@ def combine_ir_variants(instructions, v): 'dests': variants[0]['dests'], 'staging': variants[0]['staging'], 'immediates': sorted(variants[0]['immediates']), - 'modifiers': modifiers + 'modifiers': modifiers, + 'v': len(variants), + 'ir': variants } # Partition instructions to mnemonics, considering units and variants # equivalent. def partition_mnemonics(instructions): - partitions = itertools.groupby(instructions, lambda x: x[1:]) - return { k: combine_ir_variants(instructions, v) for (k, v) in partitions } + key_func = lambda x: x[1:] + sorted_instrs = sorted(instructions.keys(), key = key_func) + partitions = itertools.groupby(sorted_instrs, key_func) + return { k: combine_ir_variants(instructions, k) for k, v in partitions } # Generate modifier lists, by accumulating all the possible modifiers, and # deduplicating thus assigning canonical enum values. We don't try _too_ hard