aco: check for duplicate opcode numbers
authorRhys Perry <pendingchaos02@gmail.com>
Tue, 24 Sep 2019 14:46:37 +0000 (15:46 +0100)
committerRhys Perry <pendingchaos02@gmail.com>
Wed, 25 Sep 2019 15:28:44 +0000 (15:28 +0000)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/compiler/aco_opcodes.py

index 1b9c3c7a155cbad7aa8470ba5a5dcf764704518d..a5b4eb9a54e18853427840cebfdf8445bd1d9414 100644 (file)
@@ -27,6 +27,7 @@
 # Class that represents all the information we have about the opcode
 # NOTE: this must be kept in sync with aco_op_info
 
+import sys
 from enum import Enum
 
 class Format(Enum):
@@ -1550,3 +1551,27 @@ SCRATCH = {
 }
 for (gfx8, gfx10, name) in SCRATCH:
     opcode(name, gfx8, gfx10, Format.SCRATCH)
+
+# check for duplicate opcode numbers
+for ver in ['gfx9', 'gfx10']:
+    op_to_name = {}
+    for op in opcodes.values():
+        if op.format in [Format.PSEUDO, Format.PSEUDO_BRANCH, Format.PSEUDO_BARRIER, Format.PSEUDO_REDUCTION]:
+            continue
+
+        num = getattr(op, 'opcode_' + ver)
+        if num == -1:
+            continue
+
+        key = (op.format, num)
+
+        if key in op_to_name:
+            # exceptions
+            names = set([op_to_name[key], op.name])
+            if ver in ['gfx8', 'gfx9'] and names == set(['v_mul_lo_i32', 'v_mul_lo_u32']):
+                continue
+
+            print('%s and %s share the same opcode number (%s)' % (op_to_name[key], op.name, ver))
+            sys.exit(1)
+        else:
+            op_to_name[key] = op.name