364c929b9be4 — Leonard Ritter tip 10 hours ago
* src refactor: globals compiles again
M lib/scopes/compiler/retcon/Value.sx +184 -173
@@ 8,10 8,30 @@ 
         scopes -m compiler.retcon.gencc
 
 abstract type Value
-    enum ValueKind
+    as enum ValueKind
+    bitset CompileFlags
+        DumpDisassembly
+        DumpModule
+        DumpFunction
+        DumpTime
+        NoDebugInfo
+        # O0 = default
+        O1
+        O2
+        # O3 = O1 | O2
+        Cache
+        Module
+        IgnoreMissingSymbols
+
+    enum CompileFileKind
+        Object
+        ASM
+        BC
+        LLVM
+
     typedef Values : Array Value
     abstract type Error
-        enum ErrorKind
+        as enum ErrorKind
         by : Anchor
         # parser errors
         type ParserBadTasteError

          
@@ 606,7 626,7 @@ abstract type Value
             begin : usize
             end : usize
         abstract type SourceTrace
-            enum TraceKind
+            as enum TraceKind
             at : SourceLocation
             by : ? Anchor
 

          
@@ 713,7 733,7 @@ abstract type Value
     typedef Scope : ? ScopeCell
 
     #abstract type ScopeTrie
-        enum ScopeKind
+        as enum ScopeKind
         type ScopeL
             by : Anchor
             key : Const

          
@@ 727,7 747,7 @@ abstract type Value
 
     typedef Types : Array Type
     abstract type Type
-        enum TypeKind
+        as enum TypeKind
         scope : Scope
         type QualifyType
             type : Type

          
@@ 822,7 842,7 @@ abstract type Value
 
     typedef Qualifiers : Array Qualifier
     abstract type Qualifier
-        enum QualifierKind
+        as enum QualifierKind
         type ReferQualifier
             flags : PointerTypeFlags
             storage_class : Symbol

          
@@ 859,28 879,29 @@ abstract type Value
             lazy_expression : bool
             docstring : ? String
             recursion : i32
-        abstract type LabelTemplate
-            enum LabelTemplateKind
+        type LabelTemplate
+            enum LabelKind
+                # an user-created label
+                User
+                # the return label of an inline function
+                Inline
+                # the try block of a try/except construct
+                Try
+                # the except block of a try/except construct
+                Except
+                # the else block of a try/else construct
+                ExceptAll
+                # the then block of a try/except construct
+                Then
+                # a break label of a loop
+                Break
+                # a merge label of a branch
+                BranchMerge
+                # a typeof label
+                TypeOf
+            label_kind : LabelKind
             name : Symbol
             value : ? Value
-            # an user-created label
-            type UserLabelTemplate
-            # the return label of an inline function
-            type InlineLabelTemplate
-            # the try block of a try/except construct
-            type TryLabelTemplate
-            # the except block of a try/except construct
-            type ExceptLabelTemplate
-            # the else block of a try/else construct
-            type ExceptAllLabelTemplate
-            # the then block of a try/except construct
-            type ThenLabelTemplate
-            # a break label of a loop
-            type BreakLabelTemplate
-            # a merge label of a branch
-            type BranchMergeLabelTemplate
-            # a typeof label
-            type TypeOfLabelTemplate
         type Loop
             init : Value
             value : Value

          
@@ 908,19 929,19 @@ abstract type Value
         type SwitchTemplate
             expr : Value
             cases : Values
-        abstract type CaseTemplate
+        type CaseTemplate
             enum CaseKind
-            value : Value
-            abstract type LiteralCaseTemplate
-                literal : Value
                 # fully encapsulated case, break with result
-                type Case
+                Case
                 # fall-through case, continue with next case (which must be do or default)
-                type Pass
-            # terminates the last fall-through case, break with result
-            type DoCase
-            # chosen when no other case applies, break with result
-            type DefaultCase
+                Pass
+                # terminates the last fall-through case, break with result
+                Do
+                # chosen when no other case applies, break with result
+                Default
+            case_kind : CaseKind
+            value : Value
+            literal : ? Value
         type MergeTemplate
             label : LabelTemplate
             value : Value

          
@@ 1044,29 1065,11 @@ abstract type Value
         abstract type Instruction
             name : Symbol
             block : ? Block
-            abstract type Label
-                enum LabelKind
+            type Label
+                label_kind : LabelKind
                 body : Block
                 merges : Merges
                 splitpoints : Set TypedValue
-                # an user-created label
-                type UserLabel
-                # the return label of an inline function
-                type InlineLabel
-                # the try block of a try/except construct
-                type TryLabel
-                # the except block of a try/except construct
-                type ExceptLabel
-                # the else block of a try/else construct
-                type ExceptAllLabel
-                # the then block of a try/except construct
-                type ThenLabel
-                # a break label of a loop
-                type BreakLabel
-                # a merge label of a branch
-                type BranchMergeLabel
-                # a typeof label
-                type TypeOfLabel
             type LoopLabel
                 init : TypedValues
                 body : Block

          
@@ 1079,6 1082,7 @@ abstract type Value
             type Switch
                 struct SwitchCase
                     anchor : Anchor
+                    case_kind : CaseKind
                     literal : ? ConstInt
                     body : Block
                 expr : TypedValue

          
@@ 1128,150 1132,157 @@ abstract type Value
                 value : TypedValue
                 target : TypedValue
                 is_volatile : bool
-            abstract type AtomicRMW
+            type AtomicRMW
                 enum AtomicRMWOpKind
+                    Xchg
+                    Add
+                    Sub
+                    BAnd
+                    BNAnd
+                    BOr
+                    BXor
+                    SMin
+                    SMax
+                    UMin
+                    UMax
+                    FAdd
+                    FSub
+                op : AtomicRMWOpKind
                 target : TypedValue
                 value : TypedValue
-                type AtomicXchg
-                type AtomicAdd
-                type AtomicSub
-                type AtomicBAnd
-                type AtomicBNAnd
-                type AtomicBOr
-                type AtomicBXor
-                type AtomicSMin
-                type AtomicSMax
-                type AtomicUMin
-                type AtomicUMax
-                type AtomicFAdd
-                type AtomicFSub
             type CmpXchg
                 target : TypedValue
                 cmp : TypedValue
                 value : TypedValue
-            abstract type Barrier
+            type Barrier
                 enum BarrierKind
-                type BarrierControl
-                type BarrierMemory
-                type BarrierMemoryGroup
-                type BarrierMemoryImage
-                type BarrierMemoryBuffer
-                type BarrierMemoryShared
-            abstract type ICmp
+                    Control
+                    Memory
+                    MemoryGroup
+                    MemoryImage
+                    MemoryBuffer
+                    MemoryShared
+                op : BarrierKind
+            type ICmp
                 enum ICmpKind
+                    EQ
+                    NE
+                    UGT
+                    UGE
+                    ULT
+                    ULE
+                    SGT
+                    SGE
+                    SLT
+                    SLE
+                op : ICmpKind
                 value1 : TypedValue
                 value2 : TypedValue
-                type ICmpEQ
-                type ICmpNE
-                type ICmpUGT
-                type ICmpUGE
-                type ICmpULT
-                type ICmpULE
-                type ICmpSGT
-                type ICmpSGE
-                type ICmpSLT
-                type ICmpSLE
-            abstract type FCmp
+            type FCmp
                 enum FCmpKind
+                    OEQ
+                    ONE
+                    ORD
+                    OGT
+                    OGE
+                    OLT
+                    OLE
+                    UEQ
+                    UNE
+                    UNO
+                    UGT
+                    UGE
+                    ULT
+                    ULE
+                op : FCmpKind
                 value1 : TypedValue
                 value2 : TypedValue
-                type FCmpOEQ
-                type FCmpONE
-                type FCmpORD
-                type FCmpOGT
-                type FCmpOGE
-                type FCmpOLT
-                type FCmpOLE
-                type FCmpUEQ
-                type FCmpUNE
-                type FCmpUNO
-                type FCmpUGT
-                type FCmpUGE
-                type FCmpULT
-                type FCmpULE
-            abstract type UnOp
+            type UnOp
                 enum UnOpKind
+                    BitReverse
+                    BitCount
+                    FindMSB
+                    FindLSB
+                    FNeg
+                    Sin
+                    Cos
+                    Tan
+                    Asin
+                    Acos
+                    Atan
+                    Sinh
+                    Cosh
+                    Tanh
+                    ASinh
+                    ACosh
+                    ATanh
+                    Trunc
+                    Floor
+                    FAbs
+                    Log
+                    Log2
+                    Exp
+                    Exp2
+                    Sqrt
+                op : UnOpKind
                 value : TypedValue
-                type UnOpBitReverse
-                type UnOpBitCount
-                type UnOpFindMSB
-                type UnOpFindLSB
-                type UnOpFNeg
-                type UnOpSin
-                type UnOpCos
-                type UnOpTan
-                type UnOpAsin
-                type UnOpAcos
-                type UnOpAtan
-                type UnOpSinh
-                type UnOpCosh
-                type UnOpTanh
-                type UnOpASinh
-                type UnOpACosh
-                type UnOpATanh
-                type UnOpTrunc
-                type UnOpFloor
-                type UnOpFAbs
-                type UnOpLog
-                type UnOpLog2
-                type UnOpExp
-                type UnOpExp2
-                type UnOpSqrt
-            abstract type BinOp
+            type BinOp
                 enum BinOpKind
+                    Add
+                    AddNUW
+                    AddNSW
+                    Sub
+                    SubNUW
+                    SubNSW
+                    Mul
+                    MulNUW
+                    MulNSW
+                    UDiv
+                    SDiv
+                    URem
+                    SRem
+                    Shl
+                    LShr
+                    AShr
+                    BAnd
+                    BOr
+                    BXor
+                    FAdd
+                    FSub
+                    FMul
+                    FDiv
+                    FRem
+                    Atan2
+                    Pow
+                op : BinOpKind
                 value1 : TypedValue
                 value2 : TypedValue
-                type BinOpAdd
-                type BinOpAddNUW
-                type BinOpAddNSW
-                type BinOpSub
-                type BinOpSubNUW
-                type BinOpSubNSW
-                type BinOpMul
-                type BinOpMulNUW
-                type BinOpMulNSW
-                type BinOpUDiv
-                type BinOpSDiv
-                type BinOpURem
-                type BinOpSRem
-                type BinOpShl
-                type BinOpLShr
-                type BinOpAShr
-                type BinOpBAnd
-                type BinOpBOr
-                type BinOpBXor
-                type BinOpFAdd
-                type BinOpFSub
-                type BinOpFMul
-                type BinOpFDiv
-                type BinOpFRem
-                type BinOpAtan2
-                type BinOpPow
             type Annotate
                 values : TypedValues
             type ExecutionMode
                 typedef i32x3 : array i32 3
                 mode : Symbol
                 values : i32x3
-            abstract type Cast
+            type Cast
                 enum CastKind
+                    Bitcast
+                    IntToPtr
+                    PtrToInt
+                    SExt
+                    ITrunc
+                    ZExt
+                    FPTrunc
+                    FPExt
+                    FPToUI
+                    FPToSI
+                    UIToFP
+                    SIToFP
+                    PtrToRef
+                    RefToPtr
+                    CellToData
+                    DataToCell
+                op : CastKind
                 value : TypedValue
-                type CastBitcast
-                type CastIntToPtr
-                type CastPtrToInt
-                type CastSExt
-                type CastITrunc
-                type CastZExt
-                type CastFPTrunc
-                type CastFPExt
-                type CastFPToUI
-                type CastFPToSI
-                type CastUIToFP
-                type CastSIToFP
-                type CastPtrToRef
-                type CastRefToPtr
-                type CastCellToData
-                type CastDataToCell
             abstract type Terminator
                 values : TypedValues
                 typedef Merges : Array Merge

          
M lib/scopes/compiler/retcon/gencc.sc +51 -3
@@ 16,6 16,7 @@ enum Kind : u8
     IdEnum
     Struct
     Bitset
+    Enum
     Builtin
     BuiltinType
     Typedef

          
@@ 31,7 32,7 @@ Id := Id "gencc.Id" Kind
     # define abstract supersets
     MaybeIdType = Id.Group 'IdType 'Missing
     MaybeIdEnum = Id.Group 'IdEnum 'Missing
-    Type = Id.Group 'IdType 'Struct 'IdEnum 'Bitset 'BuiltinType 'Typedef
+    Type = Id.Group 'IdType 'Struct 'IdEnum 'Bitset 'Enum 'BuiltinType 'Typedef
         \ 'SArray 'DArray 'Optional 'Set 'Map
     Const = Id.Group 'ConstInt 'ConstStr
 

          
@@ 132,6 133,10 @@ struct Ctx
         name = Symbol
         type = Id.IdType
         super = Id.MaybeIdEnum
+    enums : RowIndexedTable
+        id = Id.Enum
+        name = Symbol
+        fields = Array Symbol
     bitsets : RowIndexedTable
         id = Id.Bitset
         name = Symbol

          
@@ 323,6 328,18 @@ struct Ctx
             else
                 'error self expr "symbol expected"
 
+    fn parse-enum-body (self T exprs)
+        returning void
+        row := self.enums @& T
+        for expr in exprs
+            try
+                expr as Symbol
+            then (sym)
+                'append row.fields sym
+                ;
+            else
+                'error self expr "symbol expected"
+
     fn complete-struct-body (self T exprs)
         for expr in exprs
             src-expr := expr

          
@@ 403,7 420,7 @@ struct Ctx
                 # do later
             case ((name as Symbol) '= expr)
                 # do later
-            case ('enum (name as Symbol))
+            case ('as 'enum (name as Symbol))
                 ET := self.id_enums
                     name = name
                     type = T

          
@@ 435,6 452,12 @@ struct Ctx
                 'set self.names name T
                 'parse-bitset-body self T expr...
                 ;
+            case ('enum (name as Symbol) expr...)
+                T := self.enums
+                    name = name
+                'set self.names name T
+                'parse-enum-body self T expr...
+                ;
             case ('abstract 'type (name as Symbol) body...)
                 parent_qual := self.id_types @ T . qual
                 if (parent_qual != 'Abstract)

          
@@ 556,6 579,8 @@ struct Ctx
                     return;
                 case Id.Bitset (T)
                     return;
+                case Id.Enum (T)
+                    return;
                 case Id.BuiltinType (T)
                     return;
                 case Id.DArray (T)

          
@@ 633,6 658,10 @@ fn... print_cc_type (self, T : Id.Type, 
         row := self.bitsets @ T
         print
             row.name as string
+    case Id.Enum (T)
+        row := self.enums @ T
+        print
+            row.name as string
     case Id.IdEnum (T)
         row := self.id_enums @ T
         print

          
@@ 716,6 745,25 @@ fn print_hh (self print header-define-na
             /p
                 row.name as string
 
+    for row in self.enums
+        print "#define TYPE_ENUM_" /..
+            row.name as string
+            /..
+            /p
+                /C:va-args "T"
+            /nolines
+                /do
+                    for i field in (enumerate row.fields)
+                        print "T" /..
+                            /p
+                                /C:va-args
+                                    field as string
+                                    /dec i
+            /n
+        print "SCOPES_DEFINE_TYPE_ENUM" /..
+            /p
+                row.name as string
+
     for srow in self.id_enums
         T := imply srow.type Id.IdType
         print "#define TYPE_ENUM_" /..

          
@@ 753,7 801,7 @@ fn print_hh (self print header-define-na
                             default
                                 break;
             /n
-        print "SCOPES_DEFINE_TYPE_ENUM" /..
+        print "SCOPES_DEFINE_TYPE_ID_ENUM" /..
             /p
                 srow.name as string
 

          
M lib/scopes/compiler/retcon/gensyms.sc +17 -6
@@ 600,8 600,6 @@ inline SCOPES_SYMBOLS(T)
     T 'SYM_Corrupted "?corrupted?"
     T 'SYM_GLSL_std_450 "GLSL.std.450"
 
-    SCOPES_BUILTIN_SYMBOLS T
-
     SCOPES_LIBRARY_SYMBOLS T
 
     # globals

          
@@ 623,8 621,6 @@ inline SCOPES_SYMBOLS(T)
     T 'SYM_Extern "extern"
     T 'SYM_Const "const"
 
-    SCOPES_STYLE_SYMBOLS T
-
     # builtins, forms, etc
     T 'SYM_FnCCForm "form-fn-body"
     T 'SYM_DoForm "form-do"

          
@@ 743,7 739,12 @@ fn... write_entry (print, symbol : strin
             id = /hex id
         /n
 
-inline write_symbols (print write_entry)
+inline write_sub_symbols (f print)
+    inline T (sym name)
+        write_entry print (sym as string) name
+    f T
+
+inline write_symbols (print)
     inline T (sym name)
         write_entry print (sym as string) name
     SCOPES_SYMBOLS T

          
@@ 769,8 770,18 @@ fn /print-module (print)
         header-define-name
         /n
 
+    print "#define SCOPES_BUILTIN_SYMBOLS() \\" /n
+    write_sub_symbols SCOPES_BUILTIN_SYMBOLS print
+    print /n
+
+    print "#define SCOPES_STYLE_SYMBOLS() \\" /n
+    write_sub_symbols SCOPES_STYLE_SYMBOLS print
+    print /n
+
     print "#define SCOPES_SYMBOLS() \\" /n
-    write_symbols print write_entry
+    print "    SCOPES_BUILTIN_SYMBOLS() \\" /n
+    print "    SCOPES_STYLE_SYMBOLS() \\" /n
+    write_symbols print
     print /n
 
     print "#endif //" header-define-name /n

          
M src/boot.cpp +1 -1
@@ 318,7 318,7 @@ skip_regular_load:
     auto stage_func_type = refer_type(raising_function_type(
         arguments_type({TYPE_CompileStage}), {}));
 
-    const int compile_flags = CF_Module;
+    const int compile_flags = CompileFlagsBit::Module;
 
 compile_stage:
     if (fn->type == stage_func_type) {

          
M src/compiler_flags.hpp +3 -1
@@ 9,6 9,7 @@ 
 
 namespace scopes {
 
+#if 0
 #define SCOPES_COMPILER_FLAGS() \
     T(CF_DumpDisassembly, (1 << 0), "compile-flag-dump-disassembly") \
     T(CF_DumpModule, (1 << 1), "compile-flag-dump-module") \

          
@@ 29,9 30,10 @@ enum {
 SCOPES_COMPILER_FLAGS()
 #undef T
 };
+#endif
 
 // which flags are going to be effecting cache invalidation
-#define SCOPES_CACHE_COMPILER_FLAGS (CF_O3 | CF_NoDebugInfo)
+#define SCOPES_CACHE_COMPILER_FLAGS (CompileFlagsBit::O1 | CompileFlagsBit::O2 | CompileFlagsBit::NoDebugInfo)
 
 } // namespace scopes
 

          
M src/execution.cpp +9 -8
@@ 469,7 469,7 @@ SCOPES_RESULT(void) add_module(LLVMModul
     uint64_t compiler_flags) {
     SCOPES_RESULT_TYPE(void);
 #if SCOPES_ALLOW_CACHE
-    bool cache = ((compiler_flags & CF_Cache) == CF_Cache);
+    bool cache = ((compiler_flags & CompileFlagsBit::Cache) == CompileFlagsBit::Cache);
 #else
     const bool cache = false;
 #endif

          
@@ 592,15 592,16 @@ skip_cache:
         auto target_machine = get_jit_target_machine();
         assert(target_machine);
 
-        if (compiler_flags & CF_O3) {
+        auto const O3 = (CompileFlagsBit::O2 | CompileFlagsBit::O1);
+        if (compiler_flags & O3) {
             Timer optimize_timer(TIMER_Optimize);
             int level = 0;
-            if ((compiler_flags & CF_O3) == CF_O1)
-                level = 1;
-            else if ((compiler_flags & CF_O3) == CF_O2)
-                level = 2;
-            else if ((compiler_flags & CF_O3) == CF_O3)
-                level = 3;
+            switch (compiler_flags & O3) {
+            case CompileFlagsBit::O1: level = 1; break;
+            case CompileFlagsBit::O2: level = 2; break;
+            case O3: level = 3; break;
+            default: break;
+            }
             SCOPES_CHECK_RESULT(build_and_run_opt_passes(module, level, target_machine));
         }
 

          
M src/expander.cpp +2 -2
@@ 300,7 300,7 @@ struct Expander {
         list_inc(it);
 
         Scope subenv = scope_from(env);
-        auto label = label_template(LabelKind::UserLabel, name);
+        auto label = label_template(LabelKind::User, name);
         Expander subexpr(subenv);
         subexpr.bind(name, label);
         label->value = SCOPES_GET_RESULT(subexpr.expand_expression(

          
@@ 391,7 391,7 @@ struct Expander {
         }
 
         Loop loop = loop_from(argument_list_template(initargs));
-        LabelTemplate break_label = label_template(LabelKind::BreakLabel, KW_Break, loop);
+        LabelTemplate break_label = label_template(LabelKind::Break, KW_Break, loop);
 
         auto subenv = env;
         ::scopes::bind(subenv, KW_Repeat, const_value(KW_Repeat));

          
M src/gen_llvm.cpp +134 -133
@@ 2028,18 2028,18 @@ struct LLVMIRGenerator {
         auto ptr = SCOPES_GET_RESULT(ref_to_value(builder, node->target));
         auto value = SCOPES_GET_RESULT(ref_to_value(builder, node->value));
         LLVMAtomicRMWBinOp op;
-        switch(node.subkind()) {
-        case AtomicRMWOpKind::AtomicXchg: op = LLVMAtomicRMWBinOpXchg; break;
-        case AtomicRMWOpKind::AtomicAdd: op = LLVMAtomicRMWBinOpAdd; break;
-        case AtomicRMWOpKind::AtomicSub: op = LLVMAtomicRMWBinOpSub; break;
-        case AtomicRMWOpKind::AtomicBAnd: op = LLVMAtomicRMWBinOpAnd; break;
-        case AtomicRMWOpKind::AtomicBNAnd: op = LLVMAtomicRMWBinOpNand; break;
-        case AtomicRMWOpKind::AtomicBOr: op = LLVMAtomicRMWBinOpOr; break;
-        case AtomicRMWOpKind::AtomicBXor: op = LLVMAtomicRMWBinOpXor; break;
-        case AtomicRMWOpKind::AtomicSMin: op = LLVMAtomicRMWBinOpMin; break;
-        case AtomicRMWOpKind::AtomicSMax: op = LLVMAtomicRMWBinOpMax; break;
-        case AtomicRMWOpKind::AtomicUMin: op = LLVMAtomicRMWBinOpUMin; break;
-        case AtomicRMWOpKind::AtomicUMax: op = LLVMAtomicRMWBinOpUMax; break;
+        switch(node->op) {
+        case AtomicRMWOpKind::Xchg: op = LLVMAtomicRMWBinOpXchg; break;
+        case AtomicRMWOpKind::Add: op = LLVMAtomicRMWBinOpAdd; break;
+        case AtomicRMWOpKind::Sub: op = LLVMAtomicRMWBinOpSub; break;
+        case AtomicRMWOpKind::BAnd: op = LLVMAtomicRMWBinOpAnd; break;
+        case AtomicRMWOpKind::BNAnd: op = LLVMAtomicRMWBinOpNand; break;
+        case AtomicRMWOpKind::BOr: op = LLVMAtomicRMWBinOpOr; break;
+        case AtomicRMWOpKind::BXor: op = LLVMAtomicRMWBinOpXor; break;
+        case AtomicRMWOpKind::SMin: op = LLVMAtomicRMWBinOpMin; break;
+        case AtomicRMWOpKind::SMax: op = LLVMAtomicRMWBinOpMax; break;
+        case AtomicRMWOpKind::UMin: op = LLVMAtomicRMWBinOpUMin; break;
+        case AtomicRMWOpKind::UMax: op = LLVMAtomicRMWBinOpUMax; break;
         default: {
             SCOPES_ERROR(CGenUnsupportedAtomicOp);
         } break;

          
@@ 2096,17 2096,17 @@ struct LLVMIRGenerator {
         auto a = SCOPES_GET_RESULT(ref_to_value(builder, node->value1));
         auto b = SCOPES_GET_RESULT(ref_to_value(builder, node->value2));
         LLVMIntPredicate pred = LLVMIntEQ;
-        switch(node.subkind()) {
-        case ICmpKind::ICmpEQ: pred = LLVMIntEQ; break;
-        case ICmpKind::ICmpNE: pred = LLVMIntNE; break;
-        case ICmpKind::ICmpUGT: pred = LLVMIntUGT; break;
-        case ICmpKind::ICmpUGE: pred = LLVMIntUGE; break;
-        case ICmpKind::ICmpULT: pred = LLVMIntULT; break;
-        case ICmpKind::ICmpULE: pred = LLVMIntULE; break;
-        case ICmpKind::ICmpSGT: pred = LLVMIntSGT; break;
-        case ICmpKind::ICmpSGE: pred = LLVMIntSGE; break;
-        case ICmpKind::ICmpSLT: pred = LLVMIntSLT; break;
-        case ICmpKind::ICmpSLE: pred = LLVMIntSLE; break;
+        switch(node->op) {
+        case ICmpKind::EQ: pred = LLVMIntEQ; break;
+        case ICmpKind::NE: pred = LLVMIntNE; break;
+        case ICmpKind::UGT: pred = LLVMIntUGT; break;
+        case ICmpKind::UGE: pred = LLVMIntUGE; break;
+        case ICmpKind::ULT: pred = LLVMIntULT; break;
+        case ICmpKind::ULE: pred = LLVMIntULE; break;
+        case ICmpKind::SGT: pred = LLVMIntSGT; break;
+        case ICmpKind::SGE: pred = LLVMIntSGE; break;
+        case ICmpKind::SLT: pred = LLVMIntSLT; break;
+        case ICmpKind::SLE: pred = LLVMIntSLE; break;
         default: assert(false); break;
         }
         auto val = LLVMBuildICmp(builder, pred, a, b, "");

          
@@ 2119,21 2119,21 @@ struct LLVMIRGenerator {
         auto a = SCOPES_GET_RESULT(ref_to_value(builder, node->value1));
         auto b = SCOPES_GET_RESULT(ref_to_value(builder, node->value2));
         LLVMRealPredicate pred = LLVMRealOEQ;
-        switch(node.subkind()) {
-        case FCmpKind::FCmpOEQ: pred = LLVMRealOEQ; break;
-        case FCmpKind::FCmpONE: pred = LLVMRealONE; break;
-        case FCmpKind::FCmpORD: pred = LLVMRealORD; break;
-        case FCmpKind::FCmpOGT: pred = LLVMRealOGT; break;
-        case FCmpKind::FCmpOGE: pred = LLVMRealOGE; break;
-        case FCmpKind::FCmpOLT: pred = LLVMRealOLT; break;
-        case FCmpKind::FCmpOLE: pred = LLVMRealOLE; break;
-        case FCmpKind::FCmpUEQ: pred = LLVMRealUEQ; break;
-        case FCmpKind::FCmpUNE: pred = LLVMRealUNE; break;
-        case FCmpKind::FCmpUNO: pred = LLVMRealUNO; break;
-        case FCmpKind::FCmpUGT: pred = LLVMRealUGT; break;
-        case FCmpKind::FCmpUGE: pred = LLVMRealUGE; break;
-        case FCmpKind::FCmpULT: pred = LLVMRealULT; break;
-        case FCmpKind::FCmpULE: pred = LLVMRealULE; break;
+        switch(node->op) {
+        case FCmpKind::OEQ: pred = LLVMRealOEQ; break;
+        case FCmpKind::ONE: pred = LLVMRealONE; break;
+        case FCmpKind::ORD: pred = LLVMRealORD; break;
+        case FCmpKind::OGT: pred = LLVMRealOGT; break;
+        case FCmpKind::OGE: pred = LLVMRealOGE; break;
+        case FCmpKind::OLT: pred = LLVMRealOLT; break;
+        case FCmpKind::OLE: pred = LLVMRealOLE; break;
+        case FCmpKind::UEQ: pred = LLVMRealUEQ; break;
+        case FCmpKind::UNE: pred = LLVMRealUNE; break;
+        case FCmpKind::UNO: pred = LLVMRealUNO; break;
+        case FCmpKind::UGT: pred = LLVMRealUGT; break;
+        case FCmpKind::UGE: pred = LLVMRealUGE; break;
+        case FCmpKind::ULT: pred = LLVMRealULT; break;
+        case FCmpKind::ULE: pred = LLVMRealULE; break;
         default: assert(false); break;
         }
         auto val = LLVMBuildFCmp(builder, pred, a, b, "");

          
@@ 2207,15 2207,15 @@ struct LLVMIRGenerator {
         SCOPES_RESULT_TYPE(void);
         auto x = SCOPES_GET_RESULT(ref_to_value(builder, node->value));
         LLVMValueRef val = nullptr;
-        switch(node.subkind()) {
+        switch(node->op) {
 #define UNOP(SRC, FUNC) \
         case UnOpKind::SRC: { val = translate_pm_unop(builder, node, x, FUNC); } break;
-        UNOP(UnOpBitReverse, llvm_bitreverse)
-        UNOP(UnOpBitCount, llvm_ctpop)
-        UNOP(UnOpFindMSB, llvm_ctlz)
-        UNOP(UnOpFindLSB, llvm_cttz)
+        UNOP(BitReverse, llvm_bitreverse)
+        UNOP(BitCount, llvm_ctpop)
+        UNOP(FindMSB, llvm_ctlz)
+        UNOP(FindLSB, llvm_cttz)
 #undef UNOP
-        case UnOpKind::UnOpFNeg: {
+        case UnOpKind::FNeg: {
             val = LLVMBuildFNeg(builder, x, "");
         } break;
         default: {

          
@@ 2226,29 2226,29 @@ struct LLVMIRGenerator {
             }
             LLVMValueRef func = nullptr;
             Intrinsic op = NumIntrinsics;
-            switch(node.subkind()) {
+            switch(node->op) {
 #define UNOP(SRC, FUNC) \
     case UnOpKind::SRC: { op = (ET == f64T)?FUNC ## _f64:FUNC ## _f32; } break;
-            UNOP(UnOpSin, llvm_sin)
-            UNOP(UnOpCos, llvm_cos)
-            UNOP(UnOpTan, libc_tan)
-            UNOP(UnOpAsin, libc_asin)
-            UNOP(UnOpAcos, libc_acos)
-            UNOP(UnOpAtan, libc_atan)
-            UNOP(UnOpSinh, libc_sinh)
-            UNOP(UnOpCosh, libc_cosh)
-            UNOP(UnOpTanh, libc_tanh)
-            UNOP(UnOpASinh, libc_asinh)
-            UNOP(UnOpACosh, libc_acosh)
-            UNOP(UnOpATanh, libc_atanh)
-            UNOP(UnOpSqrt, llvm_sqrt)
-            UNOP(UnOpFAbs, llvm_fabs)
-            UNOP(UnOpTrunc, llvm_trunc)
-            UNOP(UnOpFloor, llvm_floor)
-            UNOP(UnOpExp, llvm_exp)
-            UNOP(UnOpLog, llvm_log)
-            UNOP(UnOpExp2, llvm_exp2)
-            UNOP(UnOpLog2, llvm_log2)
+            UNOP(Sin, llvm_sin)
+            UNOP(Cos, llvm_cos)
+            UNOP(Tan, libc_tan)
+            UNOP(Asin, libc_asin)
+            UNOP(Acos, libc_acos)
+            UNOP(Atan, libc_atan)
+            UNOP(Sinh, libc_sinh)
+            UNOP(Cosh, libc_cosh)
+            UNOP(Tanh, libc_tanh)
+            UNOP(ASinh, libc_asinh)
+            UNOP(ACosh, libc_acosh)
+            UNOP(ATanh, libc_atanh)
+            UNOP(Sqrt, llvm_sqrt)
+            UNOP(FAbs, llvm_fabs)
+            UNOP(Trunc, llvm_trunc)
+            UNOP(Floor, llvm_floor)
+            UNOP(Exp, llvm_exp)
+            UNOP(Log, llvm_log)
+            UNOP(Exp2, llvm_exp2)
+            UNOP(Log2, llvm_log2)
 #undef UNOP
             default:
                 SCOPES_ERROR(CGenUnsupportedUnOp);

          
@@ 2312,36 2312,36 @@ struct LLVMIRGenerator {
             ET = LLVMGetElementType(T);
         }
         LLVMValueRef val = nullptr;
-        switch(node.subkind()) {
+        switch(node->op) {
 #define BINOP(SRC, FUNC) case BinOpKind::SRC: val = FUNC(builder, a, b, ""); break;
 #define INTRINSIC_BINOP(SRC, FUNC) \
     case BinOpKind::SRC: { val = build_intrinsic_binop(builder, (ET == f64T)?FUNC ## _f64:FUNC ## _f32, a, b); } break;
-        BINOP(BinOpAdd, LLVMBuildAdd)
-        BINOP(BinOpAddNUW, LLVMBuildNUWAdd)
-        BINOP(BinOpAddNSW, LLVMBuildNSWAdd)
-        BINOP(BinOpSub, LLVMBuildSub)
-        BINOP(BinOpSubNUW, LLVMBuildNUWSub)
-        BINOP(BinOpSubNSW, LLVMBuildNSWSub)
-        BINOP(BinOpMul, LLVMBuildMul)
-        BINOP(BinOpMulNUW, LLVMBuildNUWMul)
-        BINOP(BinOpMulNSW, LLVMBuildNSWMul)
-        BINOP(BinOpUDiv, LLVMBuildUDiv)
-        BINOP(BinOpSDiv, LLVMBuildSDiv)
-        BINOP(BinOpURem, LLVMBuildURem)
-        BINOP(BinOpSRem, LLVMBuildSRem)
-        BINOP(BinOpShl, LLVMBuildShl)
-        BINOP(BinOpLShr, LLVMBuildLShr)
-        BINOP(BinOpAShr, LLVMBuildAShr)
-        BINOP(BinOpBAnd, LLVMBuildAnd)
-        BINOP(BinOpBOr, LLVMBuildOr)
-        BINOP(BinOpBXor, LLVMBuildXor)
-        BINOP(BinOpFAdd, LLVMBuildFAdd)
-        BINOP(BinOpFSub, LLVMBuildFSub)
-        BINOP(BinOpFMul, LLVMBuildFMul)
-        BINOP(BinOpFDiv, LLVMBuildFDiv)
-        BINOP(BinOpFRem, LLVMBuildFRem)
-        INTRINSIC_BINOP(BinOpAtan2, libc_atan2)
-        INTRINSIC_BINOP(BinOpPow, llvm_pow)
+        BINOP(Add, LLVMBuildAdd)
+        BINOP(AddNUW, LLVMBuildNUWAdd)
+        BINOP(AddNSW, LLVMBuildNSWAdd)
+        BINOP(Sub, LLVMBuildSub)
+        BINOP(SubNUW, LLVMBuildNUWSub)
+        BINOP(SubNSW, LLVMBuildNSWSub)
+        BINOP(Mul, LLVMBuildMul)
+        BINOP(MulNUW, LLVMBuildNUWMul)
+        BINOP(MulNSW, LLVMBuildNSWMul)
+        BINOP(UDiv, LLVMBuildUDiv)
+        BINOP(SDiv, LLVMBuildSDiv)
+        BINOP(URem, LLVMBuildURem)
+        BINOP(SRem, LLVMBuildSRem)
+        BINOP(Shl, LLVMBuildShl)
+        BINOP(LShr, LLVMBuildLShr)
+        BINOP(AShr, LLVMBuildAShr)
+        BINOP(BAnd, LLVMBuildAnd)
+        BINOP(BOr, LLVMBuildOr)
+        BINOP(BXor, LLVMBuildXor)
+        BINOP(FAdd, LLVMBuildFAdd)
+        BINOP(FSub, LLVMBuildFSub)
+        BINOP(FMul, LLVMBuildFMul)
+        BINOP(FDiv, LLVMBuildFDiv)
+        BINOP(FRem, LLVMBuildFRem)
+        INTRINSIC_BINOP(Atan2, libc_atan2)
+        INTRINSIC_BINOP(Pow, llvm_pow)
 #undef BINOP
         default: {
             SCOPES_ERROR(CGenUnsupportedBinOp);

          
@@ 2371,8 2371,8 @@ struct LLVMIRGenerator {
         auto ty = SCOPES_GET_RESULT(type_to_llvm_type(node->type));
         auto T = LLVMTypeOf(val);
         if (T != ty) {
-            switch(node.subkind()) {
-            case CastKind::CastBitcast: {
+            switch(node->op) {
+            case CastKind::Bitcast: {
                 auto newval = build_struct_cast(builder, val, ty);
                 if (newval == val) {
                     val = LLVMBuildBitCast(builder, val, ty, "");

          
@@ 2380,20 2380,20 @@ struct LLVMIRGenerator {
                     val = newval;
                 }
             } break;
-            case CastKind::CastPtrToRef: break;
-            case CastKind::CastRefToPtr: break;
+            case CastKind::PtrToRef: break;
+            case CastKind::RefToPtr: break;
 #define CAST_OP(SRC, OP) case CastKind::SRC: val = OP(builder, val, ty, ""); break;
-            CAST_OP(CastIntToPtr, LLVMBuildIntToPtr);
-            CAST_OP(CastPtrToInt, LLVMBuildPtrToInt);
-            CAST_OP(CastSExt, LLVMBuildSExt);
-            CAST_OP(CastITrunc, LLVMBuildTrunc);
-            CAST_OP(CastZExt, LLVMBuildZExt);
-            CAST_OP(CastFPTrunc, LLVMBuildFPTrunc);
-            CAST_OP(CastFPExt, LLVMBuildFPExt);
-            CAST_OP(CastFPToUI, LLVMBuildFPToUI);
-            CAST_OP(CastFPToSI, LLVMBuildFPToSI);
-            CAST_OP(CastUIToFP, LLVMBuildUIToFP);
-            CAST_OP(CastSIToFP, LLVMBuildSIToFP);
+            CAST_OP(IntToPtr, LLVMBuildIntToPtr);
+            CAST_OP(PtrToInt, LLVMBuildPtrToInt);
+            CAST_OP(SExt, LLVMBuildSExt);
+            CAST_OP(ITrunc, LLVMBuildTrunc);
+            CAST_OP(ZExt, LLVMBuildZExt);
+            CAST_OP(FPTrunc, LLVMBuildFPTrunc);
+            CAST_OP(FPExt, LLVMBuildFPExt);
+            CAST_OP(FPToUI, LLVMBuildFPToUI);
+            CAST_OP(FPToSI, LLVMBuildFPToSI);
+            CAST_OP(UIToFP, LLVMBuildUIToFP);
+            CAST_OP(SIToFP, LLVMBuildSIToFP);
 #undef CAST_OP
             default: {
                 SCOPES_ERROR(CGenUnsupportedCastOp);

          
@@ 2419,7 2419,7 @@ struct LLVMIRGenerator {
         while (i-- > 0) {
             auto &&_case = node->cases[i];
             LLVMBasicBlockRef bbcase = nullptr;
-            if (!_case.literal) {
+            if (_case.case_kind == CaseKind::Default) {
                 builder.position_builder_at_end(bbdefault);
                 bbcase = bbdefault;
             } else if (is_empty(_case.body)) {

          
@@ 3393,13 3393,13 @@ static std::string LLVMConvertMessageStr
 }
 
 SCOPES_RESULT(void) compile_object(String triple,
-    CompilerFileKind kind, String path, Scope scope, uint64_t flags) {
+    CompileFileKind kind, String path, Scope scope, uint64_t flags) {
     SCOPES_RESULT_TYPE(void);
     Timer sum_compile_time(TIMER_Compile);
 
     LLVMIRGenerator ctx;
     ctx.generate_object = true;
-    if (flags & CF_NoDebugInfo) {
+    if (flags & CompileFlagsBit::NoDebugInfo) {
         ctx.use_debug_info = false;
     }
 

          
@@ 3424,36 3424,37 @@ SCOPES_RESULT(void) compile_object(Strin
         LLVMCodeGenLevelDefault, LLVMRelocPIC, LLVMCodeModelJITDefault);
     assert(tm);
 
-    if (flags & CF_O3) {
+    auto const O3 = (CompileFlagsBit::O2 | CompileFlagsBit::O1);
+    if (flags & O3) {
         Timer optimize_timer(TIMER_Optimize);
         int level = 0;
-        if ((flags & CF_O3) == CF_O1)
-            level = 1;
-        else if ((flags & CF_O3) == CF_O2)
-            level = 2;
-        else if ((flags & CF_O3) == CF_O3)
-            level = 3;
+        switch (flags & O3) {
+        case CompileFlagsBit::O1: level = 1; break;
+        case CompileFlagsBit::O2: level = 2; break;
+        case O3: level = 3; break;
+        default: break;
+        }
         SCOPES_CHECK_RESULT(build_and_run_opt_passes(module, level, tm));
     }
-    if (flags & CF_DumpModule) {
+    if (flags & CompileFlagsBit::DumpModule) {
         LLVMDumpModule(module);
     }
 
     std::string path_cstr = path->data;
     LLVMBool failed = false;
     switch(kind) {
-    case CFK_Object: {
+    case CompileFileKind::Object: {
         failed = LLVMTargetMachineEmitToFile(tm, module, path_cstr.data(),
             LLVMObjectFile, &error_message);
     } break;
-    case CFK_ASM: {
+    case CompileFileKind::ASM: {
         failed = LLVMTargetMachineEmitToFile(tm, module, path_cstr.data(),
             LLVMAssemblyFile, &error_message);
     } break;
-    case CFK_BC: {
+    case CompileFileKind::BC: {
         failed = LLVMWriteBitcodeToFile(module, path_cstr.data());
     } break;
-    case CFK_LLVM: {
+    case CompileFileKind::LLVM: {
         failed = LLVMPrintModuleToFile(module, path_cstr.data(), &error_message);
     } break;
     default: {

          
@@ 3482,26 3483,26 @@ SCOPES_RESULT(ConstPointer) compile(Func
     Timer sum_compile_time(TIMER_Compile);
 #if SCOPES_COMPILE_WITH_DEBUG_INFO
 #else
-    flags |= CF_NoDebugInfo;
+    flags |= CompileFlagsBit::NoDebugInfo;
 #endif
-    if (flags & CF_Module) {
-        //flags |= CF_O0;
-        flags |= CF_Cache;
+    if (flags & CompileFlagsBit::Module) {
+        //flags |= CompileFlagsBit::O0;
+        flags |= CompileFlagsBit::Cache;
     }
 
    Type functype = native_opaque_pointer_type(strip_qualifiers(fn->type));
 
     LLVMIRGenerator ctx;
-    if (flags & CF_Cache) {
+    if (flags & CompileFlagsBit::Cache) {
         ctx.serialize_pointers = true;
         ctx.set_pointer_namespace(fn->name.hash());
     } else {
         ctx.set_pointer_namespace(0);
     }
-    if (flags & CF_NoDebugInfo) {
+    if (flags & CompileFlagsBit::NoDebugInfo) {
         ctx.use_debug_info = false;
     }
-    if (flags & CF_IgnoreMissingSymbols) {
+    if (flags & CompileFlagsBit::IgnoreMissingSymbols) {
         ctx.ignore_missing_symbols = true;
     }
 

          
@@ 3529,9 3530,9 @@ SCOPES_RESULT(ConstPointer) compile(Func
     auto func = result.second;
     assert(func);
 
-    if (flags & CF_DumpModule) {
+    if (flags & CompileFlagsBit::DumpModule) {
         LLVMDumpModule(module);
-    } else if (flags & CF_DumpFunction) {
+    } else if (flags & CompileFlagsBit::DumpFunction) {
         LLVMDumpValue(func);
     }
 

          
@@ 3553,7 3554,7 @@ SCOPES_RESULT(ConstPointer) compile(Func
     }
 #endif
 
-    if (flags & CF_DumpDisassembly) {
+    if (flags & CompileFlagsBit::DumpDisassembly) {
         enable_disassembly(true);
     }
 

          
@@ 3568,7 3569,7 @@ SCOPES_RESULT(ConstPointer) compile(Func
 
     //LLVMDumpModule(module);
     void *pfunc = (void *)SCOPES_GET_RESULT(get_address(funcname.c_str()));
-    if (flags & CF_DumpDisassembly) {
+    if (flags & CompileFlagsBit::DumpDisassembly) {
         print_disassembly(funcname, pfunc);
     }
 

          
M src/gen_llvm.hpp +3 -1
@@ 15,6 15,7 @@ 
 
 namespace scopes {
 
+#if 0
 #define SCOPES_COMPILER_FILE_KIND() \
     T(CFK_Object, "compiler-file-kind-object") \
     T(CFK_ASM, "compiler-file-kind-asm") \

          
@@ 26,11 27,12 @@ enum CompilerFileKind {
 SCOPES_COMPILER_FILE_KIND()
 #undef T
 };
+#endif
 
 extern sc_compile_func_t foreign_compile_hook;
 
 SCOPES_RESULT(void) compile_object(String triple,
-    CompilerFileKind kind, String path, Scope scope, uint64_t flags);
+    CompileFileKind kind, String path, Scope scope, uint64_t flags);
 SCOPES_RESULT(ConstPointer) compile(Function fn, uint64_t flags);
 
 uint64_t resolve_global_symbol(Value node);

          
M src/gencc.inc +9 -3
@@ 371,12 371,18 @@ struct std::hash< scopes::Maybe<T> > {
     typedef n_bitset_ ## NAME ## Bit::bitset_ ## NAME ## Bit NAME ## Bit; \
     typedef uint32_t NAME;
 
-#define SCOPES_DEFINE_ENUM_MEMBER(NAME) NAME,
-#define SCOPES_INHERIT_ENUM_MEMBER(NAME, SUPER) NAME = (int)SUPER::NAME,
+#define SCOPES_DEFINE_ENUM_MEMBER(NAME, VALUE) NAME = VALUE,
 #define SCOPES_DEFINE_TYPE_ENUM(NAME) \
+    enum class NAME : uint32_t { \
+    TYPE_ENUM_ ## NAME(SCOPES_DEFINE_ENUM_MEMBER) \
+    };
+
+#define SCOPES_DEFINE_ID_ENUM_MEMBER(NAME) NAME,
+#define SCOPES_INHERIT_ID_ENUM_MEMBER(NAME, SUPER) NAME = (int)SUPER::NAME,
+#define SCOPES_DEFINE_TYPE_ID_ENUM(NAME) \
     enum class NAME : uint16_t { \
         _None, /* for option types */ \
-    TYPE_ENUM_ ## NAME(SCOPES_DEFINE_ENUM_MEMBER, SCOPES_INHERIT_ENUM_MEMBER) \
+    TYPE_ENUM_ ## NAME(SCOPES_DEFINE_ID_ENUM_MEMBER, SCOPES_INHERIT_ID_ENUM_MEMBER) \
     };
 
 #define SCOPES_i32 int32_t

          
M src/global_defs.inc +17 -12
@@ 42,8 42,8 @@ DEFINE_EXTERN_C_FUNCTION(sc_identity, TY
 DEFINE_EXTERN_C_FUNCTION(sc_value_wrap, TYPE_Value, TYPE_Type, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_value_unwrap, TYPE_Value, TYPE_Type, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_value_kind_string, TYPE_String, TYPE_I32)
-DEFINE_EXTERN_C_FUNCTION(sc_value_pack, TYPE_String, TYPE_Value)
-DEFINE_RAISING_EXTERN_C_FUNCTION(sc_value_unpack, TYPE_Value, TYPE_String)
+DEFINE_RAISING_EXTERN_C_FUNCTION(sc_value_serialize, TYPE_Void, TYPE_Value, native_ro_pointer_type(function_type(TYPE_U64, {TYPE_Voidstar, TYPE_U64, TYPE_U64, TYPE_Voidstar})), TYPE_Voidstar)
+DEFINE_RAISING_EXTERN_C_FUNCTION(sc_value_deserialize, TYPE_Value, native_ro_pointer_type(function_type(TYPE_U64, {TYPE_Voidstar, TYPE_U64, TYPE_U64, TYPE_Voidstar})), TYPE_Voidstar)
 DEFINE_EXTERN_C_FUNCTION(sc_keyed_new, TYPE_Value, TYPE_Symbol, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_keyed_key, TYPE_Symbol, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_keyed_value, TYPE_Value, TYPE_Value)

          
@@ 128,13 128,13 @@ DEFINE_EXTERN_C_FUNCTION(sc_loop_argumen
 DEFINE_EXTERN_C_FUNCTION(sc_loop_set_body, TYPE_Void, TYPE_Value, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_const_int_new, TYPE_Value, TYPE_Type, TYPE_U64)
 DEFINE_EXTERN_C_FUNCTION(sc_const_int_extract, TYPE_U64, TYPE_Value)
-DEFINE_EXTERN_C_FUNCTION(sc_const_int_words_new, TYPE_Value, TYPE_Type, TYPE_I32, native_pointer_type(TYPE_U64))
+DEFINE_EXTERN_C_FUNCTION(sc_const_int_words_new, TYPE_Value, TYPE_Type, TYPE_I32, native_ro_pointer_type(TYPE_U64))
 DEFINE_EXTERN_C_FUNCTION(sc_const_int_word_count, TYPE_I32, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_const_int_extract_word, TYPE_U64, TYPE_Value, TYPE_I32)
 DEFINE_EXTERN_C_FUNCTION(sc_const_int_word_ptr, native_pointer_type(TYPE_U64), TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_const_real_new, TYPE_Value, TYPE_Type, TYPE_F64)
 DEFINE_EXTERN_C_FUNCTION(sc_const_real_extract, TYPE_F64, TYPE_Value)
-DEFINE_RAISING_EXTERN_C_FUNCTION(sc_const_aggregate_new, TYPE_Value, TYPE_Type, TYPE_I32, native_pointer_type(TYPE_Value))
+DEFINE_RAISING_EXTERN_C_FUNCTION(sc_const_aggregate_new, TYPE_Value, TYPE_Type, TYPE_I32, native_ro_pointer_type(TYPE_Value))
 DEFINE_EXTERN_C_FUNCTION(sc_const_extract_at, TYPE_Value, TYPE_Value, TYPE_I32)
 DEFINE_EXTERN_C_FUNCTION(sc_const_string_new, TYPE_Value, TYPE_String)
 DEFINE_EXTERN_C_FUNCTION(sc_const_string_extract, TYPE_String, TYPE_Value)

          
@@ 175,6 175,7 @@ DEFINE_EXTERN_C_FUNCTION(sc_abort, TYPE_
 DEFINE_EXTERN_C_FUNCTION(sc_exit, TYPE_Void, TYPE_I32)
 DEFINE_RAISING_EXTERN_C_FUNCTION(sc_map_get, TYPE_Value, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_map_set, TYPE_Void, TYPE_Value, TYPE_Value)
+DEFINE_EXTERN_C_FUNCTION(sc_map_del, TYPE_Void, TYPE_Value)
 DEFINE_RAISING_EXTERN_C_FUNCTION(sc_load_library, TYPE_Void, TYPE_String)
 DEFINE_RAISING_EXTERN_C_FUNCTION(sc_load_object, TYPE_Void, TYPE_String)
 DEFINE_EXTERN_C_FUNCTION(sc_dlfcn_dlopen, TYPE_Voidstar, native_pointer_type(TYPE_I8), TYPE_I32)

          
@@ 194,15 195,18 @@ DEFINE_EXTERN_C_FUNCTION(sc_scope_new_su
 DEFINE_EXTERN_C_FUNCTION(sc_scope_new_subscope_with_docstring, TYPE_Scope, TYPE_Scope, TYPE_String)
 DEFINE_EXTERN_C_FUNCTION(sc_scope_get_parent, TYPE_Scope, TYPE_Scope)
 DEFINE_EXTERN_C_FUNCTION(sc_scope_unbind, TYPE_Scope, TYPE_Scope, TYPE_Value)
-DEFINE_EXTERN_C_FUNCTION(sc_scope_next, arguments_type({TYPE_Value, TYPE_Value, TYPE_I32}), TYPE_Scope, TYPE_I32)
-DEFINE_EXTERN_C_FUNCTION(sc_scope_any_next, arguments_type({TYPE_Scope, TYPE_Value, TYPE_Value, TYPE_I32}), TYPE_Scope, TYPE_I32)
-DEFINE_EXTERN_C_FUNCTION(sc_scope_next_deleted, arguments_type({TYPE_Value, TYPE_I32}), TYPE_Scope, TYPE_I32)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_next, TYPE_Scope, TYPE_Scope, TYPE_Scope)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_local_next, TYPE_Scope, TYPE_Scope, TYPE_Scope)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_local_next_deleted, TYPE_Scope, TYPE_Scope, TYPE_Scope)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_key, TYPE_Value, TYPE_Scope)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_value, TYPE_Value, TYPE_Scope)
+DEFINE_EXTERN_C_FUNCTION(sc_scope_doc, TYPE_String, TYPE_Scope)
 DEFINE_EXTERN_C_FUNCTION(sc_symbol_new, TYPE_Symbol, TYPE_String)
 DEFINE_EXTERN_C_FUNCTION(sc_symbol_new_unique, TYPE_Symbol, TYPE_String)
 DEFINE_EXTERN_C_FUNCTION(sc_symbol_to_string, TYPE_String, TYPE_Symbol)
 DEFINE_EXTERN_C_FUNCTION(sc_symbol_is_variadic, TYPE_Bool, TYPE_Symbol)
 DEFINE_EXTERN_C_FUNCTION(sc_symbol_count, TYPE_U64)
-DEFINE_EXTERN_C_FUNCTION(sc_symbol_style, TYPE_Symbol, TYPE_Symbol)
+DEFINE_EXTERN_C_FUNCTION(sc_symbol_style, TYPE_U32, TYPE_Symbol)
 DEFINE_EXTERN_C_FUNCTION(sc_string_new, TYPE_String, TYPE_Rawstring, TYPE_U64)
 DEFINE_EXTERN_C_FUNCTION(sc_string_new_from_cstr, TYPE_String, TYPE_Rawstring)
 DEFINE_EXTERN_C_FUNCTION(sc_string_join, TYPE_String, TYPE_String, TYPE_String)

          
@@ 228,10 232,10 @@ DEFINE_EXTERN_C_FUNCTION(sc_anchor_new, 
 DEFINE_EXTERN_C_FUNCTION(sc_anchor_path, TYPE_Symbol, TYPE_Anchor)
 DEFINE_EXTERN_C_FUNCTION(sc_anchor_lineno, TYPE_I32, TYPE_Anchor)
 DEFINE_EXTERN_C_FUNCTION(sc_anchor_column, TYPE_I32, TYPE_Anchor)
-DEFINE_EXTERN_C_FUNCTION(sc_anchor_get_offset, TYPE_I32, TYPE_Anchor)
-DEFINE_EXTERN_C_FUNCTION(sc_anchor_offset, TYPE_Anchor, TYPE_Anchor, TYPE_I32)
+DEFINE_EXTERN_C_FUNCTION(sc_anchor_get_offset, TYPE_U64, TYPE_Anchor)
+DEFINE_EXTERN_C_FUNCTION(sc_anchor_last_offset, TYPE_U64, TYPE_Anchor)
+DEFINE_EXTERN_C_FUNCTION(sc_anchor_offset, TYPE_Anchor, TYPE_Anchor, TYPE_U64)
 DEFINE_EXTERN_C_FUNCTION(sc_anchor_range_new, TYPE_Anchor, TYPE_Symbol, TYPE_I32, TYPE_I32, TYPE_I32, TYPE_I32)
-DEFINE_EXTERN_C_FUNCTION(sc_anchor_last_offset, TYPE_I32, TYPE_Anchor)
 DEFINE_EXTERN_C_FUNCTION(sc_closure_get_docstring, TYPE_String, TYPE_Closure)
 DEFINE_EXTERN_C_FUNCTION(sc_closure_get_template, TYPE_Value, TYPE_Closure)
 DEFINE_EXTERN_C_FUNCTION(sc_closure_get_context, TYPE_Value, TYPE_Closure)

          
@@ 258,7 262,8 @@ DEFINE_EXTERN_C_FUNCTION(sc_type_is_supe
 DEFINE_EXTERN_C_FUNCTION(sc_type_compatible, TYPE_Bool, TYPE_Type, TYPE_Type)
 DEFINE_EXTERN_C_FUNCTION(sc_type_is_default_suffix, TYPE_Bool, TYPE_Type)
 DEFINE_EXTERN_C_FUNCTION(sc_type_string, TYPE_String, TYPE_Type)
-DEFINE_EXTERN_C_FUNCTION(sc_type_next, arguments_type({TYPE_Symbol, TYPE_Value}), TYPE_Type, TYPE_Symbol)
+DEFINE_EXTERN_C_FUNCTION(sc_type_scope, TYPE_Scope, TYPE_Type)
+DEFINE_EXTERN_C_FUNCTION(sc_type_set_scope, TYPE_Void, TYPE_Type, TYPE_Scope)
 DEFINE_EXTERN_C_FUNCTION(sc_type_set_symbol, TYPE_Void, TYPE_Type, TYPE_Symbol, TYPE_Value)
 DEFINE_EXTERN_C_FUNCTION(sc_type_del_symbol, TYPE_Void, TYPE_Type, TYPE_Symbol)
 DEFINE_EXTERN_C_FUNCTION(sc_pointer_type, TYPE_Type, TYPE_Type, TYPE_U64, TYPE_Symbol)

          
M src/globals.cpp +151 -155
@@ 263,7 263,7 @@ sc_string_t sc_default_target_triple() {
 sc_void_raises_t sc_compile_object(sc_string_t target_triple,
     int file_kind, sc_string_t path, sc_scope_t table, uint64_t flags) {
     using namespace scopes;
-    return convert_result(compile_object(target_triple, (CompilerFileKind)file_kind, path, table, flags));
+    return convert_result(compile_object(target_triple, (CompileFileKind)file_kind, path, table, flags));
 }
 
 void sc_enter_solver_cli () {

          
@@ 516,12 516,12 @@ struct MemoKeyEqual {
             }
             return true;
         } else if (isa<Pure>(lhs)) {
-            if (isa<ConstPointer>(lhs)
-                && cast<ConstPointer>(lhs)->type == TYPE_List
-                && cast<ConstPointer>(rhs)->type == TYPE_List) {
+            if (isa<ConstValue>(lhs)
+                && cast<ConstValue>(lhs)->type == TYPE_List
+                && cast<ConstValue>(rhs)->type == TYPE_List) {
                 return sc_list_compare(
-                    cast<List>(cast<ConstPointer>(lhs)->value),
-                    cast<List>(cast<ConstPointer>(rhs)->value));
+                    cast<List>(cast<ConstValue>(lhs)->value),
+                    cast<List>(cast<ConstValue>(rhs)->value));
             }
             return key_equal(cast<Pure>(lhs), cast<Pure>(rhs));
         } else {

          
@@ 1124,12 1124,12 @@ sc_type_t sc_value_type (sc_value_t valu
 
 sc_void_raises_t sc_value_serialize(sc_value_t value, sc_fwrite_func_t func, void *ctx) {
     using namespace scopes;
-    SCOPES_RESULT_TYPE(void);
+    //SCOPES_RESULT_TYPE(void);
     return convert_result(serialize(ctx, func, value));
 }
 sc_value_raises_t sc_value_deserialize(sc_fread_func_t func, void *ctx) {
     using namespace scopes;
-    SCOPES_RESULT_TYPE(Value);
+    //SCOPES_RESULT_TYPE(Value);
     return convert_result(deserialize(ctx, func));
 }
 

          
@@ 2670,9 2670,7 @@ int sc_typed_value_body_count(sc_value_t
     case ValueKind::Function:
     case ValueKind::Call:
         return (get_maybe_null_except_body(cast<Call>(value)))?1:0;
-#define T(QUAL, NAME) case ValueKind::NAME:
-    TYPE_SUBTYPES_Label(T)
-#undef T
+    case ValueKind::Label:
     case ValueKind::LoopLabel:
         return 1;
     case ValueKind::CondBr:

          
@@ 2691,9 2689,7 @@ sc_value_t sc_typed_value_body(sc_value_
         assert(body);
         return *body;
     }
-#define T(QUAL, NAME) case ValueKind::NAME: return cast<NAME>(value)->body;
-    TYPE_SUBTYPES_Label(T)
-#undef T
+    case ValueKind::Label: return cast<Label>(value)->body;
     case ValueKind::LoopLabel: return cast<LoopLabel>(value)->body;
     case ValueKind::CondBr: {
         switch(index) {

          
@@ 2713,9 2709,7 @@ sc_symbol_t sc_typed_value_name(sc_value
     switch(value.kind()) {
     case ValueKind::Function: { return cast<Function>(value)->name; } break;
     case ValueKind::Parameter: { return cast<Parameter>(value)->name; } break;
-#define T(QUAL, NAME) case ValueKind::NAME: { return cast<NAME>(value)->name; } break;
-    TYPE_SUBTYPES_Label(T)
-#undef T
+    case ValueKind::Label: { return cast<Label>(value)->name; } break;
     case ValueKind::Keyed: { return cast<Keyed>(value)->key; } break;
     case ValueKind::ExecutionMode: { return cast<ExecutionMode>(value)->mode; } break;
     default: {

          
@@ 2728,13 2722,12 @@ int sc_typed_value_attribute_group_count
     using namespace scopes;
     switch(value.kind()) {
     case ValueKind::Function:
-#define T(QUAL, NAME) case ValueKind::NAME:
-    TYPE_SUBTYPES_ICmp(T)
-    TYPE_SUBTYPES_FCmp(T)
-    TYPE_SUBTYPES_BinOp(T)
-    TYPE_SUBTYPES_UnOp(T)
-    TYPE_SUBTYPES_Cast(T)
-    TYPE_SUBTYPES_AtomicRMW(T)
+    case ValueKind::ICmp:
+    case ValueKind::FCmp:
+    case ValueKind::BinOp:
+    case ValueKind::UnOp:
+    case ValueKind::Cast:
+    case ValueKind::AtomicRMW:
     case ValueKind::PureCast:
     case ValueKind::CondBr:
     case ValueKind::Keyed:

          
@@ 2758,8 2751,7 @@ int sc_typed_value_attribute_group_count
     case ValueKind::Repeat:
     case ValueKind::GetElementPtr:
     case ValueKind::Switch:
-TYPE_SUBTYPES_Label(T)
-#undef T
+    case ValueKind::Label:
         return 2;
     case ValueKind::LoopLabel:
         return 3;

          
@@ 2774,11 2766,10 @@ int sc_typed_value_attribute_count(sc_va
     using namespace scopes;
     switch(value.kind()) {
     case ValueKind::Function: return cast<Function>(value)->params.size();
-#define T(QUAL, NAME) case ValueKind::NAME:
-    TYPE_SUBTYPES_ICmp(T)
-    TYPE_SUBTYPES_FCmp(T)
-    TYPE_SUBTYPES_BinOp(T)
-    TYPE_SUBTYPES_AtomicRMW(T)
+    case ValueKind::ICmp:
+    case ValueKind::FCmp:
+    case ValueKind::BinOp:
+    case ValueKind::AtomicRMW:
     case ValueKind::InsertValue:
     case ValueKind::ExtractElement:
     case ValueKind::ShuffleVector:

          
@@ 2788,8 2779,8 @@ int sc_typed_value_attribute_count(sc_va
     case ValueKind::Select:
     case ValueKind::CmpXchg:
         return 3;
-    TYPE_SUBTYPES_UnOp(T)
-    TYPE_SUBTYPES_Cast(T)
+    case ValueKind::UnOp:
+    case ValueKind::Cast:
     case ValueKind::PureCast:
     case ValueKind::CondBr:
     case ValueKind::Keyed:

          
@@ 2808,8 2799,7 @@ int sc_typed_value_attribute_count(sc_va
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_Label(T)
-#undef T
+    case ValueKind::Label:
     {
         switch(group) {
         case 0: return cast<Label>(value)->merges.size();

          
@@ 2864,8 2854,7 @@ sc_value_t sc_typed_value_attribute_at(s
     using namespace scopes;
     switch(value.kind()) {
     case ValueKind::Function: return cast<Function>(value)->params[index];
-#define T(QUAL, NAME) case ValueKind::NAME:
-    TYPE_SUBTYPES_ICmp(T)
+    case ValueKind::ICmp:
     {
         switch(index) {
         case 0: return cast<ICmp>(value)->value1;

          
@@ 2873,7 2862,7 @@ sc_value_t sc_typed_value_attribute_at(s
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_FCmp(T)
+    case ValueKind::FCmp:
     {
         switch(index) {
         case 0: return cast<FCmp>(value)->value1;

          
@@ 2881,7 2870,7 @@ sc_value_t sc_typed_value_attribute_at(s
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_BinOp(T)
+    case ValueKind::BinOp:
     {
         switch(index) {
         case 0: return cast<BinOp>(value)->value1;

          
@@ 2917,8 2906,7 @@ sc_value_t sc_typed_value_attribute_at(s
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_AtomicRMW(T)
-    {
+    case ValueKind::AtomicRMW: {
         switch(index) {
         case 0: return cast<AtomicRMW>(value)->target;
         case 1: return cast<AtomicRMW>(value)->value;

          
@@ 2949,8 2937,8 @@ sc_value_t sc_typed_value_attribute_at(s
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_UnOp(T) return cast<UnOp>(value)->value;
-    TYPE_SUBTYPES_Cast(T) return cast<Cast>(value)->value;
+    case ValueKind::UnOp: return cast<UnOp>(value)->value;
+    case ValueKind::Cast: return cast<Cast>(value)->value;
     case ValueKind::PureCast: return cast<PureCast>(value)->value;
     case ValueKind::CondBr: return cast<CondBr>(value)->cond;
     case ValueKind::Keyed: return cast<Keyed>(value)->value;

          
@@ 2974,7 2962,7 @@ sc_value_t sc_typed_value_attribute_at(s
         default: break;
         }
     } break;
-    TYPE_SUBTYPES_Label(T) {
+    case ValueKind::Label: {
         switch(group) {
         case 0: return cast<Label>(value)->merges[index];
         case 1: {

          
@@ 3037,7 3025,18 @@ sc_value_t sc_typed_value_attribute_at(s
 
 int sc_typed_value_op_kind(sc_value_t value) {
     using namespace scopes;
-    return (int)value.kind();
+    switch(value.kind()) {
+    case ValueKind::Cast: return (int)cast<Cast>(value)->op;
+    case ValueKind::ICmp: return (int)cast<ICmp>(value)->op;
+    case ValueKind::FCmp: return (int)cast<FCmp>(value)->op;
+    case ValueKind::UnOp: return (int)cast<UnOp>(value)->op;
+    case ValueKind::BinOp: return (int)cast<BinOp>(value)->op;
+    case ValueKind::AtomicRMW: return (int)cast<AtomicRMW>(value)->op;
+    case ValueKind::Barrier: return (int)cast<Barrier>(value)->op;
+    case ValueKind::Label: return (int)cast<Label>(value)->label_kind;
+    default: break;
+    }
+    return -1;
 }
 
 int sc_typed_value_index_count(sc_value_t value) {

          
@@ 3061,13 3060,7 @@ int sc_typed_value_index(sc_value_t valu
     case ValueKind::ExtractValue: return cast<ExtractValue>(value)->index;
     case ValueKind::InsertValue: return cast<InsertValue>(value)->index;
     case ValueKind::ShuffleVector: return cast<ShuffleVector>(value)->mask[index];
-    case ValueKind::Switch: {
-        auto &&c = cast<Switch>(value)->cases[index];
-        if (c.literal)
-            return (int)ValueKind::Pass;
-        else
-            return (int)ValueKind::DefaultCase;
-    }
+    case ValueKind::Switch: return (int)cast<Switch>(value)->cases[index].case_kind;
     case ValueKind::ExecutionMode: return cast<ExecutionMode>(value)->values[index];
     default: break;
     }

          
@@ 3106,22 3099,20 @@ namespace scopes {
 // GLOBALS
 //------------------------------------------------------------------------------
 
-static void bind_extern(Symbol globalsym, Symbol externsym, const Type *T) {
-    globals = Scope::bind_from(ConstInt::symbol_from(globalsym),
-        Global::from(T, externsym, GF_NonWritable),
-        nullptr, globals);
+static void bind_extern(Symbol globalsym, Symbol externsym, Type T) {
+    bind(globals, globalsym,
+        global_from(T, externsym, PointerTypeFlagsBit::NonWritable));
 }
 
 static void bind_new_value(Symbol sym, const Value &value) {
-    globals = Scope::bind_from(ConstInt::symbol_from(sym),
-        value, nullptr, globals);
+    bind(globals, sym, value);
 }
 
 static void bind_symbol(Symbol sym, Symbol value) {
-    bind_new_value(sym, ConstInt::symbol_from(value));
-}
-
-static void bind_extern(Symbol sym, const Type *T) {
+    bind_new_value(sym, const_value(value));
+}
+
+static void bind_extern(Symbol sym, Type T) {
     bind_extern(sym, sym, T);
 }
 

          
@@ 3138,10 3129,10 @@ Scope init_globals() {
 
 #define DEFINE_EXTERN_C_FUNCTION(FUNC, RETTYPE, ...) \
     (void)FUNC; /* ensure that the symbol is there */ \
-    bind_extern(Symbol(#FUNC), function_type(RETTYPE, { __VA_ARGS__ }));
+    bind_extern(symbol(#FUNC), function_type(RETTYPE, { __VA_ARGS__ }));
 #define DEFINE_RAISING_EXTERN_C_FUNCTION(FUNC, RETTYPE, ...) \
     (void)FUNC; /* ensure that the symbol is there */ \
-    bind_extern(Symbol(#FUNC), raising_function_type(RETTYPE, { __VA_ARGS__ }));
+    bind_extern(symbol(#FUNC), raising_function_type(RETTYPE, { __VA_ARGS__ }));
 
 #if 0
     const Type *rawstring = native_ro_pointer_type(TYPE_Char);

          
@@ 3181,138 3172,143 @@ Scope init_globals() {
 #endif
 #endif
 #endif
-    bind_symbol(Symbol("operating-system"), Symbol(SCOPES_SYM_OS));
+    bind_symbol(symbol("operating-system"), symbol(SCOPES_SYM_OS));
 #undef SCOPES_SYM_OS
 
-    bind_new_value(Symbol("unroll-limit"),
-        ConstInt::from(TYPE_I32, SCOPES_MAX_RECURSIONS));
-    bind_new_value(KW_True, ConstInt::from(TYPE_Bool, true));
-    bind_new_value(KW_False, ConstInt::from(TYPE_Bool, false));
-    bind_new_value(Symbol("noreturn"),
-        ConstPointer::type_from(TYPE_NoReturn));
-    bind_new_value(KW_None, ConstAggregate::none_from());
-    bind_symbol(Symbol("unnamed"), Symbol(SYM_Unnamed));
+    bind_new_value(symbol("unroll-limit"),
+        const_int(TYPE_I32, SCOPES_MAX_RECURSIONS));
+    bind_new_value(KW_True, const_int(TYPE_Bool, true));
+    bind_new_value(KW_False, const_int(TYPE_Bool, false));
+    bind_new_value(symbol("noreturn"),
+        const_value(TYPE_NoReturn));
+    bind_new_value(KW_None, const_none());
+    bind_symbol(symbol("unnamed"), SYM_Unnamed);
     bind_new_value(SYM_CacheDir,
-        ConstString::from(String::from_cstr(get_cache_dir())));
+        const_value(string_from_cstr(get_cache_dir())));
     bind_new_value(SYM_CompilerDir,
-        ConstString::from(
-            String::from(scopes_compiler_dir, strlen(scopes_compiler_dir))));
+        const_value(
+            string_from_cstr(scopes_compiler_dir)));
     bind_new_value(SYM_CompilerPath,
-        ConstString::from(
-            String::from(scopes_compiler_path, strlen(scopes_compiler_path))));
+        const_value(
+            string_from_cstr(scopes_compiler_path)));
     bind_new_value(SYM_WorkingDir,
-        ConstString::from(
-            String::from(scopes_working_dir, strlen(scopes_working_dir))));
+        const_value(
+            string_from_cstr(scopes_working_dir)));
 
     bind_new_value(SYM_DebugBuild,
-        ConstInt::from(TYPE_Bool, scopes_is_debug()));
+        const_int(TYPE_Bool, scopes_is_debug()));
     bind_new_value(SYM_CompilerTimestamp,
-        ConstString::from(
-            String::from_cstr(scopes_compile_time_date())));
-
-#define T(NAME, STR) \
-    bind_symbol(Symbol(NAME), Symbol(NAME));
+        const_value(
+            string_from_cstr(scopes_compile_time_date())));
+
+#define T(NAME, STR, HASH) \
+    bind_symbol(NAME, NAME);
 SCOPES_STYLE_SYMBOLS()
 #undef T
 
-    bind_new_value(Symbol("voidstar"),
-        ConstPointer::type_from(voidstar));
 #define T(TYPE, NAME) \
-    bind_new_value(Symbol(NAME), ConstPointer::type_from(TYPE));
+    bind_new_value(symbol(NAME), const_value(TYPE));
 B_TYPES()
 #undef T
 
-#define T(NAME, BNAME, CLASS) \
+
+#define T(NAME, SUPER) \
     { \
-        ConstIntRef tk = ConstInt::from(TYPE_TypeKind, (int32_t)NAME); \
-        bind_new_value(Symbol(BNAME), tk); \
-        TYPE_TypeKind->bind(Symbol(#CLASS), tk); \
+        auto vk = const_int(TYPE_TypeKind, (int32_t)TypeKind::NAME); \
+        bind_new_value(symbol("TypeKind." #NAME), vk); \
+        bind(TYPE_TypeKind, symbol(#NAME), vk); \
     }
-    B_TYPE_KIND()
+    TYPE_ENUM_TypeKind(T, T)
 #undef T
 
-#define T(NAME, BNAME, CLASS) \
+#define T(NAME) \
     { \
-        ConstIntRef vk = ConstInt::from(TYPE_ValueKind, (int32_t)NAME); \
-        bind_new_value(Symbol(BNAME), vk); \
-        TYPE_ValueKind->bind(Symbol(#CLASS), vk); \
+        auto vk = const_int(TYPE_ValueKind, (int32_t)ValueKind::NAME); \
+        bind_new_value(symbol("ValueKind." #NAME), vk); \
+        bind(TYPE_ValueKind, symbol(#NAME), vk); \
     }
-    SCOPES_VALUE_KIND()
+    TYPE_ENUM_ValueKind(T, T)
 #undef T
 
-#define T(NAME, SVERB, VVERB) \
+#define T(NAME, SUPER) \
     { \
-        ConstIntRef vk = ConstInt::from(TYPE_TraceKind, (int32_t)TRCK_ ## NAME); \
-        bind_new_value(Symbol("TraceKind." #NAME), vk); \
-        TYPE_TraceKind->bind(Symbol(#NAME), vk); \
+        auto vk = const_int(TYPE_TraceKind, (int32_t)TraceKind::NAME); \
+        bind_new_value(symbol("TraceKind." #NAME), vk); \
+        bind(TYPE_TraceKind, symbol(#NAME), vk); \
     }
-    SCOPES_TRACE_KIND()
+    TYPE_ENUM_TraceKind(T, T)
 #undef T
 
-#define T(NAME, VALUE, SNAME) \
-    bind_new_value(Symbol("global-flag-" SNAME), \
-        ConstInt::from(TYPE_U32, GF_ ## NAME));
-SCOPES_GLOBAL_FLAGS()
+#define T(NAME, BIT) \
+    bind_new_value(symbol("PointerTypeFlags." #NAME), \
+        const_int(TYPE_U32, PointerTypeFlagsBit::NAME));
+TYPE_BITSET_PointerTypeFlags(T)
 #undef T
 
-#define T(NAME, VALUE, SNAME) \
-    bind_new_value(Symbol("pointer-flag-" SNAME), \
-        ConstInt::from(TYPE_U64, PTF_ ## NAME));
-SCOPES_POINTER_TYPE_FLAGS()
+#define T(NAME, BIT) \
+    bind_new_value(symbol("TypenameFlags." #NAME), \
+        const_int(TYPE_U32, TypenameFlagsBit::NAME));
+TYPE_BITSET_TypenameFlags(T)
+#undef T
+
+#define T(NAME, BIT) \
+    bind_new_value(symbol("CompileFlags." #NAME), \
+        const_int(TYPE_U32, CompileFlagsBit::NAME));
+TYPE_BITSET_CompileFlags(T)
 #undef T
 
-    bind_new_value(Symbol("typename-flag-plain"),
-        ConstInt::from(TYPE_U32, (uint32_t)TNF_Plain));
-
-#define T(NAME, VALUE, SNAME) \
-    bind_new_value(Symbol(SNAME), \
-        ConstInt::from(TYPE_U64, (uint64_t)NAME));
-SCOPES_COMPILER_FLAGS()
+#define T(NAME, BIT) \
+    bind_new_value(symbol("CompileFileKind." #NAME), \
+        const_int(TYPE_U32, (uint32_t)CompileFileKind::NAME));
+TYPE_ENUM_CompileFileKind(T)
+#undef T
+
+    Scope inspect_enums = scope_from();
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("ICmpKind." #NAME), const_int(TYPE_I32, (int)ICmpKind::NAME));
+TYPE_ENUM_ICmpKind(T)
 #undef T
-
-#define T(NAME, SNAME) \
-    bind_new_value(Symbol(SNAME), \
-        ConstInt::from(TYPE_I32, NAME));
-SCOPES_COMPILER_FILE_KIND()
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("FCmpKind." #NAME), const_int(TYPE_I32, (int)FCmpKind::NAME));
+TYPE_ENUM_FCmpKind(T)
+#undef T
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("UnOpKind." #NAME), const_int(TYPE_I32, (int)UnOpKind::NAME));
+TYPE_ENUM_UnOpKind(T)
+#undef T
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("BinOpKind." #NAME), const_int(TYPE_I32, (int)BinOpKind::NAME));
+TYPE_ENUM_BinOpKind(T)
 #undef T
-
-    const Scope *inspect_enums = Scope::from(nullptr, nullptr);
-#define T(NAME, SNAME) \
-    inspect_enums = Scope::bind_from(ConstInt::symbol_from(Symbol(SNAME)), ConstInt::from(TYPE_I32, NAME), nullptr, inspect_enums);
-SCOPES_ICMP_KIND()
-SCOPES_FCMP_KIND()
-SCOPES_UNOP_KIND()
-SCOPES_BINOP_KIND()
-SCOPES_CAST_KIND()
-SCOPES_LABEL_KIND()
-SCOPES_CASE_KIND()
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("CastKind." #NAME), const_int(TYPE_I32, (int)CastKind::NAME));
+TYPE_ENUM_CastKind(T)
+#undef T
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("LabelKind." #NAME), const_int(TYPE_I32, (int)LabelKind::NAME));
+TYPE_ENUM_LabelKind(T)
+#undef T
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("CaseKind." #NAME), const_int(TYPE_I32, (int)CaseKind::NAME));
+TYPE_ENUM_CaseKind(T)
 #undef T
-#define T(NAME, OPNAME, SNAME) \
-    inspect_enums = Scope::bind_from(ConstInt::symbol_from(Symbol(SNAME)), ConstInt::from(TYPE_I32, NAME), nullptr, inspect_enums);
-SCOPES_ATOMICRMW_OP_KIND()
+#define T(NAME, VAL) \
+    bind(inspect_enums, symbol("AtomicRMWOpKind." #NAME), const_int(TYPE_I32, (int)AtomicRMWOpKind::NAME));
+TYPE_ENUM_AtomicRMWOpKind(T)
 #undef T
-    bind_new_value(Symbol("typed-api"), ConstPointer::scope_from(inspect_enums));
-
-#define T(NAME, SNAME) \
-    bind_new_value(Symbol(SNAME), \
-        ConstInt::from(TYPE_I32, NAME));
-SCOPES_BARRIER_KIND()
+    bind_new_value(symbol("typed-api"), const_value(inspect_enums));
+
+#define T(NAME, VAL) \
+    bind_new_value(symbol("BarrierKind." #NAME), const_int(TYPE_I32, (int)BarrierKind::NAME));
+TYPE_ENUM_BarrierKind(T)
 #undef T
-#define T(NAME, STR) bind_new_value(NAME, ConstInt::builtin_from(Builtin(NAME)));
-#define T0(NAME, STR) bind_new_value(NAME, ConstInt::builtin_from(Builtin(NAME)));
-#define T1 T2
-#define T2T T2
-#define T2(UNAME, LNAME, PFIX, OP) \
-    bind_new_value(FN_ ## UNAME ## PFIX, ConstInt::builtin_from(Builtin(FN_ ## UNAME ## PFIX)));
+
+#define T(NAME, STR, CODE) bind_new_value(NAME, const_value(Builtin(NAME)));
     SCOPES_BUILTIN_SYMBOLS()
 #undef T
-#undef T0
-#undef T1
-#undef T2
-#undef T2T
 
     // make fast
-    globals->table();
+    //globals->table();
 
     return globals;
 }

          
M src/known_symbols.hh +24 -18
@@ 1,9 1,7 @@ 
 // autogenerated by compiler.retcon.gensyms, do not edit
 #ifndef SCOPES_KNOWN_SYMBOLS_HH
 #define SCOPES_KNOWN_SYMBOLS_HH
-#define SCOPES_SYMBOLS() \
-    T(SYM_Corrupted, "?corrupted?", 0x73191faba175f0d8ull) \
-    T(SYM_GLSL_std_450, "GLSL.std.450", 0x6fd3efbf4a06288dull) \
+#define SCOPES_BUILTIN_SYMBOLS() \
     T(KW_Fn, "fn", 0xa3a3926afc6d8391ull) \
     T(KW_Inline, "inline", 0x670a48b4c8e3997cull) \
     T(KW_Label, "label", 0xd87a29e7e2270618ull) \

          
@@ 192,6 190,29 @@ 
     T(FN_Fma, "fma", 0x79883b207228c7acull) \
     T(FN_Frexp, "frexp", 0xe792fcdd448a6e31ull) \
     T(FN_Ldexp, "ldexp", 0x30448257415708d1ull) \
+
+#define SCOPES_STYLE_SYMBOLS() \
+    T(Style_None, "style-none", 0x7ad1f57729e2656aull) \
+    T(Style_Symbol, "style-symbol", 0x9748a4cacefb796aull) \
+    T(Style_String, "style-string", 0xc9a41afa10270df6ull) \
+    T(Style_Number, "style-number", 0x246de8538171c71cull) \
+    T(Style_Constant, "style-constant", 0xf842f2b25a3da71bull) \
+    T(Style_Keyword, "style-keyword", 0xea7f9eedd654a4beull) \
+    T(Style_Function, "style-function", 0x9bf11a5a304c7086ull) \
+    T(Style_SfxFunction, "style-sfxfunction", 0xe7fdd95410be778eull) \
+    T(Style_Operator, "style-operator", 0x1aa46b2580f76519ull) \
+    T(Style_Instruction, "style-instruction", 0x5206add78566616ull) \
+    T(Style_Type, "style-type", 0xfab4aca0ee221819ull) \
+    T(Style_Comment, "style-comment", 0x10c4c64180361d42ull) \
+    T(Style_Error, "style-error", 0xe8ce578cfba725d7ull) \
+    T(Style_Warning, "style-warning", 0x7e0a9b9e67a2e586ull) \
+    T(Style_Location, "style-location", 0x6355e9ad135cf665ull) \
+
+#define SCOPES_SYMBOLS() \
+    SCOPES_BUILTIN_SYMBOLS() \
+    SCOPES_STYLE_SYMBOLS() \
+    T(SYM_Corrupted, "?corrupted?", 0x73191faba175f0d8ull) \
+    T(SYM_GLSL_std_450, "GLSL.std.450", 0x6fd3efbf4a06288dull) \
     T(KW_CatRest, "::*", 0xc1cf41868a8b366eull) \
     T(KW_CatOne, "::@", 0x7db0cdee1c5f5942ull) \
     T(KW_Assert, "assert", 0x672e3415a5802643ull) \

          
@@ 487,21 508,6 @@ 
     T(SYM_FNType, "fntype", 0x9a54ad5e9a7f4166ull) \
     T(SYM_Extern, "extern", 0x55c1807e70c44dc3ull) \
     T(SYM_Const, "const", 0x5a6083064a864bf9ull) \
-    T(Style_None, "style-none", 0x7ad1f57729e2656aull) \
-    T(Style_Symbol, "style-symbol", 0x9748a4cacefb796aull) \
-    T(Style_String, "style-string", 0xc9a41afa10270df6ull) \
-    T(Style_Number, "style-number", 0x246de8538171c71cull) \
-    T(Style_Constant, "style-constant", 0xf842f2b25a3da71bull) \
-    T(Style_Keyword, "style-keyword", 0xea7f9eedd654a4beull) \
-    T(Style_Function, "style-function", 0x9bf11a5a304c7086ull) \
-    T(Style_SfxFunction, "style-sfxfunction", 0xe7fdd95410be778eull) \
-    T(Style_Operator, "style-operator", 0x1aa46b2580f76519ull) \
-    T(Style_Instruction, "style-instruction", 0x5206add78566616ull) \
-    T(Style_Type, "style-type", 0xfab4aca0ee221819ull) \
-    T(Style_Comment, "style-comment", 0x10c4c64180361d42ull) \
-    T(Style_Error, "style-error", 0xe8ce578cfba725d7ull) \
-    T(Style_Warning, "style-warning", 0x7e0a9b9e67a2e586ull) \
-    T(Style_Location, "style-location", 0x6355e9ad135cf665ull) \
     T(SYM_FnCCForm, "form-fn-body", 0x346dcebc58db51bdull) \
     T(SYM_DoForm, "form-do", 0x48e54068b96ff88bull) \
     T(SYM_SyntaxScope, "sugar-scope", 0xfe1e928784d8ff7cull) \

          
M src/type.cpp +3 -2
@@ 648,6 648,8 @@ void init_types() {
 #else
     TYPE_Char = TYPE_I8;
 #endif
+    TYPE_Rawstring = native_ro_pointer_type(TYPE_Char);
+    TYPE_Voidstar = native_ro_pointer_type(TYPE_Void);
 
     DEFINE_BASIC_TYPE("usize", size_t, TYPE_USize, TYPE_Integer, TYPE_U64);
 

          
@@ 678,8 680,7 @@ void init_types() {
     DEFINE_OPAQUE_HANDLE_TYPE("Anchor", Anchor, TYPE_Anchor, nullptr);
 
 
-    DEFINE_BASIC_TYPE("Value", ValueRef, TYPE_ValueRef, nullptr,
-        tuple_type({ TYPE__Value, TYPE_Trace }).assert_ok());
+    DEFINE_BASIC_TYPE("Value", Value, TYPE_Value, TYPE_U64);
 
     DEFINE_BASIC_TYPE("CompileStage", ValueRef, TYPE_CompileStage,
         nullptr, storage_type(TYPE_ValueRef).assert_ok());

          
M src/type.hpp +3 -2
@@ 139,8 139,7 @@ Symbols type_find_closest_match(Type typ
     T(TYPE_Variadic, "Variadic") \
     T(TYPE_Symbol, "Symbol") \
     T(TYPE_Builtin, "Builtin") \
-    T(TYPE__Value, "_Value") \
-    T(TYPE_ValueRef, "Value") \
+    T(TYPE_Value, "Value") \
     \
     T(TYPE_ValueKind, "ValueKind") \
     T(TYPE_TypeKind, "TypeKind") \

          
@@ 187,6 186,8 @@ Symbols type_find_closest_match(Type typ
     T(TYPE_Sampler, "Sampler") \
     \
     T(TYPE_PtrToGlobalFunction, "PtrToGlobalFunction") \
+    T(TYPE_Rawstring, "rawstring") \
+    T(TYPE_Voidstar, "voidstar") \
     \
     /* supertypes */ \
     T(TYPE_Immutable, "immutable") \

          
M src/value_defs.hh +57 -465
@@ 3,6 3,8 @@ 
 #define SCOPES_VALUE_HH
 #include "gencc.inc"
 SCOPES_BEGIN_MODULE
+#define TYPE_BITSET_CompileFlags(T) T(DumpDisassembly, 0) T(DumpModule, 1) T(DumpFunction, 2) T(DumpTime, 3) T(NoDebugInfo, 4) T(O1, 5) T(O2, 6) T(Cache, 7) T(Module, 8) T(IgnoreMissingSymbols, 9)
+SCOPES_DEFINE_TYPE_BITSET(CompileFlags)
 #define TYPE_BITSET_TypenameFlags(T) T(Plain, 0) T(Complete, 1)
 SCOPES_DEFINE_TYPE_BITSET(TypenameFlags)
 #define TYPE_BITSET_PointerTypeFlags(T) T(BufferBlock, 0) T(NonWritable, 1) T(NonReadable, 2) T(Volatile, 3) T(Coherent, 4) T(Restrict, 5) T(Block, 6) T(Flat, 7) T(Managed, 8) T(BuiltIn, 9) T(ThreadLocal, 10)

          
@@ 13,36 15,36 @@ SCOPES_DEFINE_TYPE_BITSET(FunctionFlags)
 SCOPES_DEFINE_TYPE_BITSET(CallTemplateFlags)
 #define TYPE_BITSET_BlockFlags(T) T(TagTraceback, 0) T(IgnorePrematureNoreturn, 1)
 SCOPES_DEFINE_TYPE_BITSET(BlockFlags)
-#define TYPE_ENUM_ValueKind(T, U) T(ParserBadTasteError) T(ParserUnterminatedSequenceError) T(ParserUnexpectedLineBreakError) T(ParserInvalidIntegerSuffixError) T(ParserInvalidRealSuffixError) T(ParserUnclosedOpenBracketError) T(ParserStrayClosingBracketError) T(ParserUnterminatedQuoteError) T(ParserUnexpectedTokenError) T(ParserStrayEscapeTokenError) T(ParserIndentationMismatchError) T(ParserBadIndentationLevelError) T(ParserStrayStatementTokenError) T(SyntaxCallExpressionEmptyError) T(SyntaxTooManyArgumentsError) T(SyntaxNotEnoughArgumentsError) T(SyntaxUnnamedForwardDeclarationError) T(SyntaxVariadicSymbolNotLastError) T(SyntaxAssignmentTokenExpectedError) T(SyntaxKeyedArgumentMismatchError) T(SyntaxUnexpectedExtraTokenError) T(SyntaxUndeclaredIdentifierError) T(SyntaxExceptBlockExpectedError) T(SyntaxMissingDefaultCaseError) T(SyntaxCaseBlockExpectedError) T(SyntaxLabelExpectedError) T(SyntaxSymbolExpanderTypeMismatchError) T(SyntaxListExpanderTypeMismatchError) T(SyntaxExcessBindingArgumentError) T(TypeKindMismatchError) T(ValueKindMismatchError) T(CannotCreateConstantOfError) T(ConstantExpectedError) T(ConstantValueKindMismatchError) T(TypedConstantValueKindMismatchError) T(TooManyArgumentsError) T(NotEnoughArgumentsError) T(CannotTypeInlineError) T(ValueMustBeReferenceError) T(NonReadableReferenceError) T(NonWritableReferenceError) T(NonReadablePointerError) T(NonWritablePointerError) T(MergeConflictError) T(InaccessibleValueError) T(DropReturnsArgumentsError) T(RecursiveDropError) T(SwitchPassMovedValueError) T(CaseValueExpectedError) T(BadIndirectCaseArgumentListError) T(DuplicateCaseLiteralError) T(LoopMovedValueError) T(ViewExitingScopeError) T(MovingGlobalUniqueError) T(DuplicateParameterKeyError) T(UnknownParameterKeyError) T(BreakOutsideLoopError) T(RepeatOutsideLoopError) T(LabelExpectedError) T(RecursiveFunctionChangedTypeError) T(UnknownTupleFieldError) T(PlainToUniqueCastError) T(ManagedPointerCannotLoadError) T(UniqueValueExpectedError) T(CannotDupeManagedPointerError) T(SimilarViewValueExpectedForStoreError) T(IncompatibleStorageTypeForUniqueError) T(SpiceMacroReturnedNullError) T(UnsupportedDimensionalityError) T(UnsupportedExecutionModeError) T(CastCategoryError) T(CastSizeError) T(CastIncompatibleAggregateTypeError) T(InvalidOperandsError) T(InvalidArgumentTypeForBuiltinError) T(UnsupportedBuiltinError) T(InvalidCalleeError) T(TooManyFunctionArgumentsError) T(NotEnoughFunctionArgumentsError) T(DuplicateSwitchDefaultCaseError) T(MissingDefaultCaseError) T(UnclosedPassError) T(DoWithoutPassError) T(VariadicParameterNotLastError) T(RecursionOverflowError) T(ResultMustBePureError) T(GlobalInitializerMustBePureError) T(NoGlobalInitializerError) T(NoGlobalConstructorError) T(ParameterTypeMismatchError) T(FunctionPointerExpectedError) T(ScalarOrVectorExpectedError) T(FixedVectorSizeMismatchError) T(VectorSizeMismatchError) T(TypeMismatchError) T(InvalidMatrixSizeError) T(ConditionNotBoolError) T(UnexpectedValueKindError) T(UnresolvedValueError) T(PtrToGlobalHandlerMissingError) T(CannotSerializeTypeError) T(PrematureReturnFromExpressionError) T(OpaqueTypeError) T(UntrackedTypeError) T(MovableTypeMismatchError) T(DupeUniqueStorageError) T(GenericIndexOutOfRangeError) T(ShuffleVectorIndexOutOfRangeError) T(ExtractStringConstantIndexOutOfRangeError) T(ArgumentsTypeIndexOutOfRangeError) T(FunctionTypeIndexOutOfRangeError) T(ArrayOrVectorTypeIndexOutOfRangeError) T(TupleTypeIndexOutOfRangeError) T(TypenameCompleteError) T(TypenameIncompleteError) T(TypenameIncompatibleStorageError) T(StorageTypeExpectedError) T(PlainStorageTypeExpectedError) T(VariableOutOfScopeError) T(UnboundValueError) T(CannotProveForwardDeclarationError) T(QuoteUnsupportedValueKindError) T(QuoteUnboundValueError) T(CGenTypeUnsupportedInTargetError) T(CGenFailedToTranslateTypeError) T(CGenUnboundValueError) T(CGenInvalidRedeclarationError) T(CGenUnsupportedBuiltinError) T(CGenUnsupportedArrayAllocError) T(CGenUnsupportedMallocError) T(CGenUnsupportedUnOpError) T(CGenUnsupportedBinOpError) T(CGenUnsupportedTriOpError) T(CGenUnsupportedImageOpError) T(CGenUnsupportedCastOpError) T(CGenUnsupportedAtomicOpError) T(CGenUnsupportedTargetError) T(CGenInvalidCalleeError) T(CGenFailedToTranslateValueError) T(CGenUnsupportedInstructionError) T(CGenFailedToResolveExternError) T(CGenRecursiveConstructorError) T(CGenBackendFailedError) T(CGenBackendFailedErrnoError) T(CGenCannotSerializeConstPointerError) T(CGenBackendValidationFailedError) T(CGenBackendOptimizationFailedError) T(CGenUnsupportedCapabilityError) T(CGenUnsupportedDimensionalityError) T(CGenUnsupportedImageFormatError) T(CGenUnsupportedExecutionModeError) T(CGenUnrecognizedSymbolicMaskError) T(CGenUnsupportedPointerStorageClassError) T(CGenUnsupportedArgumentPointerStorageClassError) T(CGenUnsupportedBufferAlignmentError) T(CGenUnsupportedReturnArgumentError) T(CGenUnsupportedIntrinsicError) T(CGenEntryFunctionSignatureMismatchError) T(CGenUnsupportedVectorSizeError) T(CGenUnsupportedMatrixSizeError) T(RTLoadLibraryFailedError) T(RTGetAddressFailedError) T(RTMissingKeyError) T(RTMissingScopeAnyAttributeError) T(RTMissingLocalScopeAnyAttributeError) T(RTMissingScopeAttributeError) T(RTMissingLocalScopeAttributeError) T(RTMissingTypeAttributeError) T(RTMissingLocalTypeAttributeError) T(RTMissingTupleAttributeError) T(RTRegExError) T(RTUnableToOpenFileError) T(RTUncountableStorageTypeError) T(RTNoElementsInStorageTypeError) T(RTNoNamedElementsInStorageTypeError) T(RTTypeBitcountMismatchError) T(RTUndefinedAttributeError) T(MainInaccessibleBinaryError) T(InvalidFooterError) T(CoreModuleFunctionTypeMismatchError) T(CoreMissingError) T(UserError) T(ExecutionEngineFailedError) T(OptimizationPassFailedError) T(StackOverflowError) T(SourceText) T(SourceLocation) T(UnknownOriginTrace) T(DummyTrace) T(TraceTrace) T(CallTrace) T(ParserTrace) T(ExpanderTrace) T(InvokeHookTrace) T(ProveExpressionTrace) T(ProveTemplateTrace) T(ProveArgumentTrace) T(ProveParamMapTrace) T(ProveArgumentLifetimeTrace) T(ProveDropTrace) T(TranslateTrace) T(QuoteTrace) T(UnwrapTrace) T(BuiltinTrace) T(BindSymbolTrace) T(FollowSymbolTrace) T(BindExprTrace) T(FollowExprTrace) T(ConvertForeignTypeTrace) T(ConvertForeignValueTrace) T(UserTrace) T(String) T(Symbol) T(Builtin) T(ListBuffer) T(ListSlice) T(ScopeCell) T(Closure) T(QualifyType) T(ArgumentsType) T(TypenameType) T(IntegerType) T(RealType) T(PointerType) T(ArrayType) T(VectorType) T(MatrixType) T(TupleType) T(FunctionType) T(SamplerType) T(ImageType) T(SampledImageType) T(ReferQualifier) T(UniqueQualifier) T(ViewQualifier) T(MutateQualifier) T(KeyQualifier) T(Template) T(UserLabelTemplate) T(InlineLabelTemplate) T(TryLabelTemplate) T(ExceptLabelTemplate) T(ExceptAllLabelTemplate) T(ThenLabelTemplate) T(BreakLabelTemplate) T(BranchMergeLabelTemplate) T(TypeOfLabelTemplate) T(Loop) T(LoopArguments) T(KeyedTemplate) T(Expression) T(Quote) T(Unquote) T(CompileStage) T(CondTemplate) T(SwitchTemplate) T(Case) T(Pass) T(DoCase) T(DefaultCase) T(MergeTemplate) T(CallTemplate) T(ArgumentListTemplate) T(ExtractArgumentTemplate) T(ParameterTemplate) T(Keyed) T(Parameter) T(Exception) T(ArgumentList) T(Block) T(ExtractArgument) T(LoopLabelArguments) T(Function) T(Global) T(PureCast) T(Undef) T(ConstNull) T(ConstInt) T(ConstReal) T(ConstString) T(ConstAggregate) T(ConstPointer) T(ConstValue) T(UserLabel) T(InlineLabel) T(TryLabel) T(ExceptLabel) T(ExceptAllLabel) T(ThenLabel) T(BreakLabel) T(BranchMergeLabel) T(TypeOfLabel) T(LoopLabel) T(CondBr) T(Switch) T(Call) T(Select) T(ExtractValue) T(InsertValue) T(GetElementPtr) T(ExtractElement) T(InsertElement) T(ShuffleVector) T(Alloca) T(Malloc) T(Free) T(Load) T(Store) T(AtomicXchg) T(AtomicAdd) T(AtomicSub) T(AtomicBAnd) T(AtomicBNAnd) T(AtomicBOr) T(AtomicBXor) T(AtomicSMin) T(AtomicSMax) T(AtomicUMin) T(AtomicUMax) T(AtomicFAdd) T(AtomicFSub) T(CmpXchg) T(BarrierControl) T(BarrierMemory) T(BarrierMemoryGroup) T(BarrierMemoryImage) T(BarrierMemoryBuffer) T(BarrierMemoryShared) T(ICmpEQ) T(ICmpNE) T(ICmpUGT) T(ICmpUGE) T(ICmpULT) T(ICmpULE) T(ICmpSGT) T(ICmpSGE) T(ICmpSLT) T(ICmpSLE) T(FCmpOEQ) T(FCmpONE) T(FCmpORD) T(FCmpOGT) T(FCmpOGE) T(FCmpOLT) T(FCmpOLE) T(FCmpUEQ) T(FCmpUNE) T(FCmpUNO) T(FCmpUGT) T(FCmpUGE) T(FCmpULT) T(FCmpULE) T(UnOpBitReverse) T(UnOpBitCount) T(UnOpFindMSB) T(UnOpFindLSB) T(UnOpFNeg) T(UnOpSin) T(UnOpCos) T(UnOpTan) T(UnOpAsin) T(UnOpAcos) T(UnOpAtan) T(UnOpSinh) T(UnOpCosh) T(UnOpTanh) T(UnOpASinh) T(UnOpACosh) T(UnOpATanh) T(UnOpTrunc) T(UnOpFloor) T(UnOpFAbs) T(UnOpLog) T(UnOpLog2) T(UnOpExp) T(UnOpExp2) T(UnOpSqrt) T(BinOpAdd) T(BinOpAddNUW) T(BinOpAddNSW) T(BinOpSub) T(BinOpSubNUW) T(BinOpSubNSW) T(BinOpMul) T(BinOpMulNUW) T(BinOpMulNSW) T(BinOpUDiv) T(BinOpSDiv) T(BinOpURem) T(BinOpSRem) T(BinOpShl) T(BinOpLShr) T(BinOpAShr) T(BinOpBAnd) T(BinOpBOr) T(BinOpBXor) T(BinOpFAdd) T(BinOpFSub) T(BinOpFMul) T(BinOpFDiv) T(BinOpFRem) T(BinOpAtan2) T(BinOpPow) T(Annotate) T(ExecutionMode) T(CastBitcast) T(CastIntToPtr) T(CastPtrToInt) T(CastSExt) T(CastITrunc) T(CastZExt) T(CastFPTrunc) T(CastFPExt) T(CastFPToUI) T(CastFPToSI) T(CastUIToFP) T(CastSIToFP) T(CastPtrToRef) T(CastRefToPtr) T(CastCellToData) T(CastDataToCell) T(Merge) T(Repeat) T(Return) T(Raise) T(Unreachable) T(Discard)
-SCOPES_DEFINE_TYPE_ENUM(ValueKind)
-#define TYPE_ENUM_ErrorKind(T, U) U(ParserBadTasteError, ValueKind) U(ParserUnterminatedSequenceError, ValueKind) U(ParserUnexpectedLineBreakError, ValueKind) U(ParserInvalidIntegerSuffixError, ValueKind) U(ParserInvalidRealSuffixError, ValueKind) U(ParserUnclosedOpenBracketError, ValueKind) U(ParserStrayClosingBracketError, ValueKind) U(ParserUnterminatedQuoteError, ValueKind) U(ParserUnexpectedTokenError, ValueKind) U(ParserStrayEscapeTokenError, ValueKind) U(ParserIndentationMismatchError, ValueKind) U(ParserBadIndentationLevelError, ValueKind) U(ParserStrayStatementTokenError, ValueKind) U(SyntaxCallExpressionEmptyError, ValueKind) U(SyntaxTooManyArgumentsError, ValueKind) U(SyntaxNotEnoughArgumentsError, ValueKind) U(SyntaxUnnamedForwardDeclarationError, ValueKind) U(SyntaxVariadicSymbolNotLastError, ValueKind) U(SyntaxAssignmentTokenExpectedError, ValueKind) U(SyntaxKeyedArgumentMismatchError, ValueKind) U(SyntaxUnexpectedExtraTokenError, ValueKind) U(SyntaxUndeclaredIdentifierError, ValueKind) U(SyntaxExceptBlockExpectedError, ValueKind) U(SyntaxMissingDefaultCaseError, ValueKind) U(SyntaxCaseBlockExpectedError, ValueKind) U(SyntaxLabelExpectedError, ValueKind) U(SyntaxSymbolExpanderTypeMismatchError, ValueKind) U(SyntaxListExpanderTypeMismatchError, ValueKind) U(SyntaxExcessBindingArgumentError, ValueKind) U(TypeKindMismatchError, ValueKind) U(ValueKindMismatchError, ValueKind) U(CannotCreateConstantOfError, ValueKind) U(ConstantExpectedError, ValueKind) U(ConstantValueKindMismatchError, ValueKind) U(TypedConstantValueKindMismatchError, ValueKind) U(TooManyArgumentsError, ValueKind) U(NotEnoughArgumentsError, ValueKind) U(CannotTypeInlineError, ValueKind) U(ValueMustBeReferenceError, ValueKind) U(NonReadableReferenceError, ValueKind) U(NonWritableReferenceError, ValueKind) U(NonReadablePointerError, ValueKind) U(NonWritablePointerError, ValueKind) U(MergeConflictError, ValueKind) U(InaccessibleValueError, ValueKind) U(DropReturnsArgumentsError, ValueKind) U(RecursiveDropError, ValueKind) U(SwitchPassMovedValueError, ValueKind) U(CaseValueExpectedError, ValueKind) U(BadIndirectCaseArgumentListError, ValueKind) U(DuplicateCaseLiteralError, ValueKind) U(LoopMovedValueError, ValueKind) U(ViewExitingScopeError, ValueKind) U(MovingGlobalUniqueError, ValueKind) U(DuplicateParameterKeyError, ValueKind) U(UnknownParameterKeyError, ValueKind) U(BreakOutsideLoopError, ValueKind) U(RepeatOutsideLoopError, ValueKind) U(LabelExpectedError, ValueKind) U(RecursiveFunctionChangedTypeError, ValueKind) U(UnknownTupleFieldError, ValueKind) U(PlainToUniqueCastError, ValueKind) U(ManagedPointerCannotLoadError, ValueKind) U(UniqueValueExpectedError, ValueKind) U(CannotDupeManagedPointerError, ValueKind) U(SimilarViewValueExpectedForStoreError, ValueKind) U(IncompatibleStorageTypeForUniqueError, ValueKind) U(SpiceMacroReturnedNullError, ValueKind) U(UnsupportedDimensionalityError, ValueKind) U(UnsupportedExecutionModeError, ValueKind) U(CastCategoryError, ValueKind) U(CastSizeError, ValueKind) U(CastIncompatibleAggregateTypeError, ValueKind) U(InvalidOperandsError, ValueKind) U(InvalidArgumentTypeForBuiltinError, ValueKind) U(UnsupportedBuiltinError, ValueKind) U(InvalidCalleeError, ValueKind) U(TooManyFunctionArgumentsError, ValueKind) U(NotEnoughFunctionArgumentsError, ValueKind) U(DuplicateSwitchDefaultCaseError, ValueKind) U(MissingDefaultCaseError, ValueKind) U(UnclosedPassError, ValueKind) U(DoWithoutPassError, ValueKind) U(VariadicParameterNotLastError, ValueKind) U(RecursionOverflowError, ValueKind) U(ResultMustBePureError, ValueKind) U(GlobalInitializerMustBePureError, ValueKind) U(NoGlobalInitializerError, ValueKind) U(NoGlobalConstructorError, ValueKind) U(ParameterTypeMismatchError, ValueKind) U(FunctionPointerExpectedError, ValueKind) U(ScalarOrVectorExpectedError, ValueKind) U(FixedVectorSizeMismatchError, ValueKind) U(VectorSizeMismatchError, ValueKind) U(TypeMismatchError, ValueKind) U(InvalidMatrixSizeError, ValueKind) U(ConditionNotBoolError, ValueKind) U(UnexpectedValueKindError, ValueKind) U(UnresolvedValueError, ValueKind) U(PtrToGlobalHandlerMissingError, ValueKind) U(CannotSerializeTypeError, ValueKind) U(PrematureReturnFromExpressionError, ValueKind) U(OpaqueTypeError, ValueKind) U(UntrackedTypeError, ValueKind) U(MovableTypeMismatchError, ValueKind) U(DupeUniqueStorageError, ValueKind) U(GenericIndexOutOfRangeError, ValueKind) U(ShuffleVectorIndexOutOfRangeError, ValueKind) U(ExtractStringConstantIndexOutOfRangeError, ValueKind) U(ArgumentsTypeIndexOutOfRangeError, ValueKind) U(FunctionTypeIndexOutOfRangeError, ValueKind) U(ArrayOrVectorTypeIndexOutOfRangeError, ValueKind) U(TupleTypeIndexOutOfRangeError, ValueKind) U(TypenameCompleteError, ValueKind) U(TypenameIncompleteError, ValueKind) U(TypenameIncompatibleStorageError, ValueKind) U(StorageTypeExpectedError, ValueKind) U(PlainStorageTypeExpectedError, ValueKind) U(VariableOutOfScopeError, ValueKind) U(UnboundValueError, ValueKind) U(CannotProveForwardDeclarationError, ValueKind) U(QuoteUnsupportedValueKindError, ValueKind) U(QuoteUnboundValueError, ValueKind) U(CGenTypeUnsupportedInTargetError, ValueKind) U(CGenFailedToTranslateTypeError, ValueKind) U(CGenUnboundValueError, ValueKind) U(CGenInvalidRedeclarationError, ValueKind) U(CGenUnsupportedBuiltinError, ValueKind) U(CGenUnsupportedArrayAllocError, ValueKind) U(CGenUnsupportedMallocError, ValueKind) U(CGenUnsupportedUnOpError, ValueKind) U(CGenUnsupportedBinOpError, ValueKind) U(CGenUnsupportedTriOpError, ValueKind) U(CGenUnsupportedImageOpError, ValueKind) U(CGenUnsupportedCastOpError, ValueKind) U(CGenUnsupportedAtomicOpError, ValueKind) U(CGenUnsupportedTargetError, ValueKind) U(CGenInvalidCalleeError, ValueKind) U(CGenFailedToTranslateValueError, ValueKind) U(CGenUnsupportedInstructionError, ValueKind) U(CGenFailedToResolveExternError, ValueKind) U(CGenRecursiveConstructorError, ValueKind) U(CGenBackendFailedError, ValueKind) U(CGenBackendFailedErrnoError, ValueKind) U(CGenCannotSerializeConstPointerError, ValueKind) U(CGenBackendValidationFailedError, ValueKind) U(CGenBackendOptimizationFailedError, ValueKind) U(CGenUnsupportedCapabilityError, ValueKind) U(CGenUnsupportedDimensionalityError, ValueKind) U(CGenUnsupportedImageFormatError, ValueKind) U(CGenUnsupportedExecutionModeError, ValueKind) U(CGenUnrecognizedSymbolicMaskError, ValueKind) U(CGenUnsupportedPointerStorageClassError, ValueKind) U(CGenUnsupportedArgumentPointerStorageClassError, ValueKind) U(CGenUnsupportedBufferAlignmentError, ValueKind) U(CGenUnsupportedReturnArgumentError, ValueKind) U(CGenUnsupportedIntrinsicError, ValueKind) U(CGenEntryFunctionSignatureMismatchError, ValueKind) U(CGenUnsupportedVectorSizeError, ValueKind) U(CGenUnsupportedMatrixSizeError, ValueKind) U(RTLoadLibraryFailedError, ValueKind) U(RTGetAddressFailedError, ValueKind) U(RTMissingKeyError, ValueKind) U(RTMissingScopeAnyAttributeError, ValueKind) U(RTMissingLocalScopeAnyAttributeError, ValueKind) U(RTMissingScopeAttributeError, ValueKind) U(RTMissingLocalScopeAttributeError, ValueKind) U(RTMissingTypeAttributeError, ValueKind) U(RTMissingLocalTypeAttributeError, ValueKind) U(RTMissingTupleAttributeError, ValueKind) U(RTRegExError, ValueKind) U(RTUnableToOpenFileError, ValueKind) U(RTUncountableStorageTypeError, ValueKind) U(RTNoElementsInStorageTypeError, ValueKind) U(RTNoNamedElementsInStorageTypeError, ValueKind) U(RTTypeBitcountMismatchError, ValueKind) U(RTUndefinedAttributeError, ValueKind) U(MainInaccessibleBinaryError, ValueKind) U(InvalidFooterError, ValueKind) U(CoreModuleFunctionTypeMismatchError, ValueKind) U(CoreMissingError, ValueKind) U(UserError, ValueKind) U(ExecutionEngineFailedError, ValueKind) U(OptimizationPassFailedError, ValueKind) U(StackOverflowError, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(ErrorKind)
-#define TYPE_ENUM_TraceKind(T, U) U(UnknownOriginTrace, ValueKind) U(DummyTrace, ValueKind) U(TraceTrace, ValueKind) U(CallTrace, ValueKind) U(ParserTrace, ValueKind) U(ExpanderTrace, ValueKind) U(InvokeHookTrace, ValueKind) U(ProveExpressionTrace, ValueKind) U(ProveTemplateTrace, ValueKind) U(ProveArgumentTrace, ValueKind) U(ProveParamMapTrace, ValueKind) U(ProveArgumentLifetimeTrace, ValueKind) U(ProveDropTrace, ValueKind) U(TranslateTrace, ValueKind) U(QuoteTrace, ValueKind) U(UnwrapTrace, ValueKind) U(BuiltinTrace, ValueKind) U(BindSymbolTrace, ValueKind) U(FollowSymbolTrace, ValueKind) U(BindExprTrace, ValueKind) U(FollowExprTrace, ValueKind) U(ConvertForeignTypeTrace, ValueKind) U(ConvertForeignValueTrace, ValueKind) U(UserTrace, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(TraceKind)
-#define TYPE_ENUM_TypeKind(T, U) U(QualifyType, ValueKind) U(ArgumentsType, ValueKind) U(TypenameType, ValueKind) U(IntegerType, ValueKind) U(RealType, ValueKind) U(PointerType, ValueKind) U(ArrayType, ValueKind) U(VectorType, ValueKind) U(MatrixType, ValueKind) U(TupleType, ValueKind) U(FunctionType, ValueKind) U(SamplerType, ValueKind) U(ImageType, ValueKind) U(SampledImageType, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(TypeKind)
-#define TYPE_ENUM_QualifierKind(T, U) U(ReferQualifier, ValueKind) U(UniqueQualifier, ValueKind) U(ViewQualifier, ValueKind) U(MutateQualifier, ValueKind) U(KeyQualifier, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(QualifierKind)
-#define TYPE_ENUM_LabelTemplateKind(T, U) U(UserLabelTemplate, ValueKind) U(InlineLabelTemplate, ValueKind) U(TryLabelTemplate, ValueKind) U(ExceptLabelTemplate, ValueKind) U(ExceptAllLabelTemplate, ValueKind) U(ThenLabelTemplate, ValueKind) U(BreakLabelTemplate, ValueKind) U(BranchMergeLabelTemplate, ValueKind) U(TypeOfLabelTemplate, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(LabelTemplateKind)
-#define TYPE_ENUM_CaseKind(T, U) U(Case, ValueKind) U(Pass, ValueKind) U(DoCase, ValueKind) U(DefaultCase, ValueKind)
+#define TYPE_ENUM_CompileFileKind(T) T(Object, 0) T(ASM, 1) T(BC, 2) T(LLVM, 3)
+SCOPES_DEFINE_TYPE_ENUM(CompileFileKind)
+#define TYPE_ENUM_LabelKind(T) T(User, 0) T(Inline, 1) T(Try, 2) T(Except, 3) T(ExceptAll, 4) T(Then, 5) T(Break, 6) T(BranchMerge, 7) T(TypeOf, 8)
+SCOPES_DEFINE_TYPE_ENUM(LabelKind)
+#define TYPE_ENUM_CaseKind(T) T(Case, 0) T(Pass, 1) T(Do, 2) T(Default, 3)
 SCOPES_DEFINE_TYPE_ENUM(CaseKind)
-#define TYPE_ENUM_LabelKind(T, U) U(UserLabel, ValueKind) U(InlineLabel, ValueKind) U(TryLabel, ValueKind) U(ExceptLabel, ValueKind) U(ExceptAllLabel, ValueKind) U(ThenLabel, ValueKind) U(BreakLabel, ValueKind) U(BranchMergeLabel, ValueKind) U(TypeOfLabel, ValueKind)
-SCOPES_DEFINE_TYPE_ENUM(LabelKind)
-#define TYPE_ENUM_AtomicRMWOpKind(T, U) U(AtomicXchg, ValueKind) U(AtomicAdd, ValueKind) U(AtomicSub, ValueKind) U(AtomicBAnd, ValueKind) U(AtomicBNAnd, ValueKind) U(AtomicBOr, ValueKind) U(AtomicBXor, ValueKind) U(AtomicSMin, ValueKind) U(AtomicSMax, ValueKind) U(AtomicUMin, ValueKind) U(AtomicUMax, ValueKind) U(AtomicFAdd, ValueKind) U(AtomicFSub, ValueKind)
+#define TYPE_ENUM_AtomicRMWOpKind(T) T(Xchg, 0) T(Add, 1) T(Sub, 2) T(BAnd, 3) T(BNAnd, 4) T(BOr, 5) T(BXor, 6) T(SMin, 7) T(SMax, 8) T(UMin, 9) T(UMax, 10) T(FAdd, 11) T(FSub, 12)
 SCOPES_DEFINE_TYPE_ENUM(AtomicRMWOpKind)
-#define TYPE_ENUM_BarrierKind(T, U) U(BarrierControl, ValueKind) U(BarrierMemory, ValueKind) U(BarrierMemoryGroup, ValueKind) U(BarrierMemoryImage, ValueKind) U(BarrierMemoryBuffer, ValueKind) U(BarrierMemoryShared, ValueKind)
+#define TYPE_ENUM_BarrierKind(T) T(Control, 0) T(Memory, 1) T(MemoryGroup, 2) T(MemoryImage, 3) T(MemoryBuffer, 4) T(MemoryShared, 5)
 SCOPES_DEFINE_TYPE_ENUM(BarrierKind)
-#define TYPE_ENUM_ICmpKind(T, U) U(ICmpEQ, ValueKind) U(ICmpNE, ValueKind) U(ICmpUGT, ValueKind) U(ICmpUGE, ValueKind) U(ICmpULT, ValueKind) U(ICmpULE, ValueKind) U(ICmpSGT, ValueKind) U(ICmpSGE, ValueKind) U(ICmpSLT, ValueKind) U(ICmpSLE, ValueKind)
+#define TYPE_ENUM_ICmpKind(T) T(EQ, 0) T(NE, 1) T(UGT, 2) T(UGE, 3) T(ULT, 4) T(ULE, 5) T(SGT, 6) T(SGE, 7) T(SLT, 8) T(SLE, 9)
 SCOPES_DEFINE_TYPE_ENUM(ICmpKind)
-#define TYPE_ENUM_FCmpKind(T, U) U(FCmpOEQ, ValueKind) U(FCmpONE, ValueKind) U(FCmpORD, ValueKind) U(FCmpOGT, ValueKind) U(FCmpOGE, ValueKind) U(FCmpOLT, ValueKind) U(FCmpOLE, ValueKind) U(FCmpUEQ, ValueKind) U(FCmpUNE, ValueKind) U(FCmpUNO, ValueKind) U(FCmpUGT, ValueKind) U(FCmpUGE, ValueKind) U(FCmpULT, ValueKind) U(FCmpULE, ValueKind)
+#define TYPE_ENUM_FCmpKind(T) T(OEQ, 0) T(ONE, 1) T(ORD, 2) T(OGT, 3) T(OGE, 4) T(OLT, 5) T(OLE, 6) T(UEQ, 7) T(UNE, 8) T(UNO, 9) T(UGT, 10) T(UGE, 11) T(ULT, 12) T(ULE, 13)
 SCOPES_DEFINE_TYPE_ENUM(FCmpKind)
-#define TYPE_ENUM_UnOpKind(T, U) U(UnOpBitReverse, ValueKind) U(UnOpBitCount, ValueKind) U(UnOpFindMSB, ValueKind) U(UnOpFindLSB, ValueKind) U(UnOpFNeg, ValueKind) U(UnOpSin, ValueKind) U(UnOpCos, ValueKind) U(UnOpTan, ValueKind) U(UnOpAsin, ValueKind) U(UnOpAcos, ValueKind) U(UnOpAtan, ValueKind) U(UnOpSinh, ValueKind) U(UnOpCosh, ValueKind) U(UnOpTanh, ValueKind) U(UnOpASinh, ValueKind) U(UnOpACosh, ValueKind) U(UnOpATanh, ValueKind) U(UnOpTrunc, ValueKind) U(UnOpFloor, ValueKind) U(UnOpFAbs, ValueKind) U(UnOpLog, ValueKind) U(UnOpLog2, ValueKind) U(UnOpExp, ValueKind) U(UnOpExp2, ValueKind) U(UnOpSqrt, ValueKind)
+#define TYPE_ENUM_UnOpKind(T) T(BitReverse, 0) T(BitCount, 1) T(FindMSB, 2) T(FindLSB, 3) T(FNeg, 4) T(Sin, 5) T(Cos, 6) T(Tan, 7) T(Asin, 8) T(Acos, 9) T(Atan, 10) T(Sinh, 11) T(Cosh, 12) T(Tanh, 13) T(ASinh, 14) T(ACosh, 15) T(ATanh, 16) T(Trunc, 17) T(Floor, 18) T(FAbs, 19) T(Log, 20) T(Log2, 21) T(Exp, 22) T(Exp2, 23) T(Sqrt, 24)
 SCOPES_DEFINE_TYPE_ENUM(UnOpKind)
-#define TYPE_ENUM_BinOpKind(T, U) U(BinOpAdd, ValueKind) U(BinOpAddNUW, ValueKind) U(BinOpAddNSW, ValueKind) U(BinOpSub, ValueKind) U(BinOpSubNUW, ValueKind) U(BinOpSubNSW, ValueKind) U(BinOpMul, ValueKind) U(BinOpMulNUW, ValueKind) U(BinOpMulNSW, ValueKind) U(BinOpUDiv, ValueKind) U(BinOpSDiv, ValueKind) U(BinOpURem, ValueKind) U(BinOpSRem, ValueKind) U(BinOpShl, ValueKind) U(BinOpLShr, ValueKind) U(BinOpAShr, ValueKind) U(BinOpBAnd, ValueKind) U(BinOpBOr, ValueKind) U(BinOpBXor, ValueKind) U(BinOpFAdd, ValueKind) U(BinOpFSub, ValueKind) U(BinOpFMul, ValueKind) U(BinOpFDiv, ValueKind) U(BinOpFRem, ValueKind) U(BinOpAtan2, ValueKind) U(BinOpPow, ValueKind)
+#define TYPE_ENUM_BinOpKind(T) T(Add, 0) T(AddNUW, 1) T(AddNSW, 2) T(Sub, 3) T(SubNUW, 4) T(SubNSW, 5) T(Mul, 6) T(MulNUW, 7) T(MulNSW, 8) T(UDiv, 9) T(SDiv, 10) T(URem, 11) T(SRem, 12) T(Shl, 13) T(LShr, 14) T(AShr, 15) T(BAnd, 16) T(BOr, 17) T(BXor, 18) T(FAdd, 19) T(FSub, 20) T(FMul, 21) T(FDiv, 22) T(FRem, 23) T(Atan2, 24) T(Pow, 25)
 SCOPES_DEFINE_TYPE_ENUM(BinOpKind)
-#define TYPE_ENUM_CastKind(T, U) U(CastBitcast, ValueKind) U(CastIntToPtr, ValueKind) U(CastPtrToInt, ValueKind) U(CastSExt, ValueKind) U(CastITrunc, ValueKind) U(CastZExt, ValueKind) U(CastFPTrunc, ValueKind) U(CastFPExt, ValueKind) U(CastFPToUI, ValueKind) U(CastFPToSI, ValueKind) U(CastUIToFP, ValueKind) U(CastSIToFP, ValueKind) U(CastPtrToRef, ValueKind) U(CastRefToPtr, ValueKind) U(CastCellToData, ValueKind) U(CastDataToCell, ValueKind)
+#define TYPE_ENUM_CastKind(T) T(Bitcast, 0) T(IntToPtr, 1) T(PtrToInt, 2) T(SExt, 3) T(ITrunc, 4) T(ZExt, 5) T(FPTrunc, 6) T(FPExt, 7) T(FPToUI, 8) T(FPToSI, 9) T(UIToFP, 10) T(SIToFP, 11) T(PtrToRef, 12) T(RefToPtr, 13) T(CellToData, 14) T(DataToCell, 15)
 SCOPES_DEFINE_TYPE_ENUM(CastKind)
+#define TYPE_ENUM_ValueKind(T, U) T(ParserBadTasteError) T(ParserUnterminatedSequenceError) T(ParserUnexpectedLineBreakError) T(ParserInvalidIntegerSuffixError) T(ParserInvalidRealSuffixError) T(ParserUnclosedOpenBracketError) T(ParserStrayClosingBracketError) T(ParserUnterminatedQuoteError) T(ParserUnexpectedTokenError) T(ParserStrayEscapeTokenError) T(ParserIndentationMismatchError) T(ParserBadIndentationLevelError) T(ParserStrayStatementTokenError) T(SyntaxCallExpressionEmptyError) T(SyntaxTooManyArgumentsError) T(SyntaxNotEnoughArgumentsError) T(SyntaxUnnamedForwardDeclarationError) T(SyntaxVariadicSymbolNotLastError) T(SyntaxAssignmentTokenExpectedError) T(SyntaxKeyedArgumentMismatchError) T(SyntaxUnexpectedExtraTokenError) T(SyntaxUndeclaredIdentifierError) T(SyntaxExceptBlockExpectedError) T(SyntaxMissingDefaultCaseError) T(SyntaxCaseBlockExpectedError) T(SyntaxLabelExpectedError) T(SyntaxSymbolExpanderTypeMismatchError) T(SyntaxListExpanderTypeMismatchError) T(SyntaxExcessBindingArgumentError) T(TypeKindMismatchError) T(ValueKindMismatchError) T(CannotCreateConstantOfError) T(ConstantExpectedError) T(ConstantValueKindMismatchError) T(TypedConstantValueKindMismatchError) T(TooManyArgumentsError) T(NotEnoughArgumentsError) T(CannotTypeInlineError) T(ValueMustBeReferenceError) T(NonReadableReferenceError) T(NonWritableReferenceError) T(NonReadablePointerError) T(NonWritablePointerError) T(MergeConflictError) T(InaccessibleValueError) T(DropReturnsArgumentsError) T(RecursiveDropError) T(SwitchPassMovedValueError) T(CaseValueExpectedError) T(BadIndirectCaseArgumentListError) T(DuplicateCaseLiteralError) T(LoopMovedValueError) T(ViewExitingScopeError) T(MovingGlobalUniqueError) T(DuplicateParameterKeyError) T(UnknownParameterKeyError) T(BreakOutsideLoopError) T(RepeatOutsideLoopError) T(LabelExpectedError) T(RecursiveFunctionChangedTypeError) T(UnknownTupleFieldError) T(PlainToUniqueCastError) T(ManagedPointerCannotLoadError) T(UniqueValueExpectedError) T(CannotDupeManagedPointerError) T(SimilarViewValueExpectedForStoreError) T(IncompatibleStorageTypeForUniqueError) T(SpiceMacroReturnedNullError) T(UnsupportedDimensionalityError) T(UnsupportedExecutionModeError) T(CastCategoryError) T(CastSizeError) T(CastIncompatibleAggregateTypeError) T(InvalidOperandsError) T(InvalidArgumentTypeForBuiltinError) T(UnsupportedBuiltinError) T(InvalidCalleeError) T(TooManyFunctionArgumentsError) T(NotEnoughFunctionArgumentsError) T(DuplicateSwitchDefaultCaseError) T(MissingDefaultCaseError) T(UnclosedPassError) T(DoWithoutPassError) T(VariadicParameterNotLastError) T(RecursionOverflowError) T(ResultMustBePureError) T(GlobalInitializerMustBePureError) T(NoGlobalInitializerError) T(NoGlobalConstructorError) T(ParameterTypeMismatchError) T(FunctionPointerExpectedError) T(ScalarOrVectorExpectedError) T(FixedVectorSizeMismatchError) T(VectorSizeMismatchError) T(TypeMismatchError) T(InvalidMatrixSizeError) T(ConditionNotBoolError) T(UnexpectedValueKindError) T(UnresolvedValueError) T(PtrToGlobalHandlerMissingError) T(CannotSerializeTypeError) T(PrematureReturnFromExpressionError) T(OpaqueTypeError) T(UntrackedTypeError) T(MovableTypeMismatchError) T(DupeUniqueStorageError) T(GenericIndexOutOfRangeError) T(ShuffleVectorIndexOutOfRangeError) T(ExtractStringConstantIndexOutOfRangeError) T(ArgumentsTypeIndexOutOfRangeError) T(FunctionTypeIndexOutOfRangeError) T(ArrayOrVectorTypeIndexOutOfRangeError) T(TupleTypeIndexOutOfRangeError) T(TypenameCompleteError) T(TypenameIncompleteError) T(TypenameIncompatibleStorageError) T(StorageTypeExpectedError) T(PlainStorageTypeExpectedError) T(VariableOutOfScopeError) T(UnboundValueError) T(CannotProveForwardDeclarationError) T(QuoteUnsupportedValueKindError) T(QuoteUnboundValueError) T(CGenTypeUnsupportedInTargetError) T(CGenFailedToTranslateTypeError) T(CGenUnboundValueError) T(CGenInvalidRedeclarationError) T(CGenUnsupportedBuiltinError) T(CGenUnsupportedArrayAllocError) T(CGenUnsupportedMallocError) T(CGenUnsupportedUnOpError) T(CGenUnsupportedBinOpError) T(CGenUnsupportedTriOpError) T(CGenUnsupportedImageOpError) T(CGenUnsupportedCastOpError) T(CGenUnsupportedAtomicOpError) T(CGenUnsupportedTargetError) T(CGenInvalidCalleeError) T(CGenFailedToTranslateValueError) T(CGenUnsupportedInstructionError) T(CGenFailedToResolveExternError) T(CGenRecursiveConstructorError) T(CGenBackendFailedError) T(CGenBackendFailedErrnoError) T(CGenCannotSerializeConstPointerError) T(CGenBackendValidationFailedError) T(CGenBackendOptimizationFailedError) T(CGenUnsupportedCapabilityError) T(CGenUnsupportedDimensionalityError) T(CGenUnsupportedImageFormatError) T(CGenUnsupportedExecutionModeError) T(CGenUnrecognizedSymbolicMaskError) T(CGenUnsupportedPointerStorageClassError) T(CGenUnsupportedArgumentPointerStorageClassError) T(CGenUnsupportedBufferAlignmentError) T(CGenUnsupportedReturnArgumentError) T(CGenUnsupportedIntrinsicError) T(CGenEntryFunctionSignatureMismatchError) T(CGenUnsupportedVectorSizeError) T(CGenUnsupportedMatrixSizeError) T(RTLoadLibraryFailedError) T(RTGetAddressFailedError) T(RTMissingKeyError) T(RTMissingScopeAnyAttributeError) T(RTMissingLocalScopeAnyAttributeError) T(RTMissingScopeAttributeError) T(RTMissingLocalScopeAttributeError) T(RTMissingTypeAttributeError) T(RTMissingLocalTypeAttributeError) T(RTMissingTupleAttributeError) T(RTRegExError) T(RTUnableToOpenFileError) T(RTUncountableStorageTypeError) T(RTNoElementsInStorageTypeError) T(RTNoNamedElementsInStorageTypeError) T(RTTypeBitcountMismatchError) T(RTUndefinedAttributeError) T(MainInaccessibleBinaryError) T(InvalidFooterError) T(CoreModuleFunctionTypeMismatchError) T(CoreMissingError) T(UserError) T(ExecutionEngineFailedError) T(OptimizationPassFailedError) T(StackOverflowError) T(SourceText) T(SourceLocation) T(UnknownOriginTrace) T(DummyTrace) T(TraceTrace) T(CallTrace) T(ParserTrace) T(ExpanderTrace) T(InvokeHookTrace) T(ProveExpressionTrace) T(ProveTemplateTrace) T(ProveArgumentTrace) T(ProveParamMapTrace) T(ProveArgumentLifetimeTrace) T(ProveDropTrace) T(TranslateTrace) T(QuoteTrace) T(UnwrapTrace) T(BuiltinTrace) T(BindSymbolTrace) T(FollowSymbolTrace) T(BindExprTrace) T(FollowExprTrace) T(ConvertForeignTypeTrace) T(ConvertForeignValueTrace) T(UserTrace) T(String) T(Symbol) T(Builtin) T(ListBuffer) T(ListSlice) T(ScopeCell) T(Closure) T(QualifyType) T(ArgumentsType) T(TypenameType) T(IntegerType) T(RealType) T(PointerType) T(ArrayType) T(VectorType) T(MatrixType) T(TupleType) T(FunctionType) T(SamplerType) T(ImageType) T(SampledImageType) T(ReferQualifier) T(UniqueQualifier) T(ViewQualifier) T(MutateQualifier) T(KeyQualifier) T(Template) T(LabelTemplate) T(Loop) T(LoopArguments) T(KeyedTemplate) T(Expression) T(Quote) T(Unquote) T(CompileStage) T(CondTemplate) T(SwitchTemplate) T(CaseTemplate) T(MergeTemplate) T(CallTemplate) T(ArgumentListTemplate) T(ExtractArgumentTemplate) T(ParameterTemplate) T(Keyed) T(Parameter) T(Exception) T(ArgumentList) T(Block) T(ExtractArgument) T(LoopLabelArguments) T(Function) T(Global) T(PureCast) T(Undef) T(ConstNull) T(ConstInt) T(ConstReal) T(ConstString) T(ConstAggregate) T(ConstPointer) T(ConstValue) T(Label) T(LoopLabel) T(CondBr) T(Switch) T(Call) T(Select) T(ExtractValue) T(InsertValue) T(GetElementPtr) T(ExtractElement) T(InsertElement) T(ShuffleVector) T(Alloca) T(Malloc) T(Free) T(Load) T(Store) T(AtomicRMW) T(CmpXchg) T(Barrier) T(ICmp) T(FCmp) T(UnOp) T(BinOp) T(Annotate) T(ExecutionMode) T(Cast) T(Merge) T(Repeat) T(Return) T(Raise) T(Unreachable) T(Discard)
+SCOPES_DEFINE_TYPE_ID_ENUM(ValueKind)
+#define TYPE_ENUM_ErrorKind(T, U) U(ParserBadTasteError, ValueKind) U(ParserUnterminatedSequenceError, ValueKind) U(ParserUnexpectedLineBreakError, ValueKind) U(ParserInvalidIntegerSuffixError, ValueKind) U(ParserInvalidRealSuffixError, ValueKind) U(ParserUnclosedOpenBracketError, ValueKind) U(ParserStrayClosingBracketError, ValueKind) U(ParserUnterminatedQuoteError, ValueKind) U(ParserUnexpectedTokenError, ValueKind) U(ParserStrayEscapeTokenError, ValueKind) U(ParserIndentationMismatchError, ValueKind) U(ParserBadIndentationLevelError, ValueKind) U(ParserStrayStatementTokenError, ValueKind) U(SyntaxCallExpressionEmptyError, ValueKind) U(SyntaxTooManyArgumentsError, ValueKind) U(SyntaxNotEnoughArgumentsError, ValueKind) U(SyntaxUnnamedForwardDeclarationError, ValueKind) U(SyntaxVariadicSymbolNotLastError, ValueKind) U(SyntaxAssignmentTokenExpectedError, ValueKind) U(SyntaxKeyedArgumentMismatchError, ValueKind) U(SyntaxUnexpectedExtraTokenError, ValueKind) U(SyntaxUndeclaredIdentifierError, ValueKind) U(SyntaxExceptBlockExpectedError, ValueKind) U(SyntaxMissingDefaultCaseError, ValueKind) U(SyntaxCaseBlockExpectedError, ValueKind) U(SyntaxLabelExpectedError, ValueKind) U(SyntaxSymbolExpanderTypeMismatchError, ValueKind) U(SyntaxListExpanderTypeMismatchError, ValueKind) U(SyntaxExcessBindingArgumentError, ValueKind) U(TypeKindMismatchError, ValueKind) U(ValueKindMismatchError, ValueKind) U(CannotCreateConstantOfError, ValueKind) U(ConstantExpectedError, ValueKind) U(ConstantValueKindMismatchError, ValueKind) U(TypedConstantValueKindMismatchError, ValueKind) U(TooManyArgumentsError, ValueKind) U(NotEnoughArgumentsError, ValueKind) U(CannotTypeInlineError, ValueKind) U(ValueMustBeReferenceError, ValueKind) U(NonReadableReferenceError, ValueKind) U(NonWritableReferenceError, ValueKind) U(NonReadablePointerError, ValueKind) U(NonWritablePointerError, ValueKind) U(MergeConflictError, ValueKind) U(InaccessibleValueError, ValueKind) U(DropReturnsArgumentsError, ValueKind) U(RecursiveDropError, ValueKind) U(SwitchPassMovedValueError, ValueKind) U(CaseValueExpectedError, ValueKind) U(BadIndirectCaseArgumentListError, ValueKind) U(DuplicateCaseLiteralError, ValueKind) U(LoopMovedValueError, ValueKind) U(ViewExitingScopeError, ValueKind) U(MovingGlobalUniqueError, ValueKind) U(DuplicateParameterKeyError, ValueKind) U(UnknownParameterKeyError, ValueKind) U(BreakOutsideLoopError, ValueKind) U(RepeatOutsideLoopError, ValueKind) U(LabelExpectedError, ValueKind) U(RecursiveFunctionChangedTypeError, ValueKind) U(UnknownTupleFieldError, ValueKind) U(PlainToUniqueCastError, ValueKind) U(ManagedPointerCannotLoadError, ValueKind) U(UniqueValueExpectedError, ValueKind) U(CannotDupeManagedPointerError, ValueKind) U(SimilarViewValueExpectedForStoreError, ValueKind) U(IncompatibleStorageTypeForUniqueError, ValueKind) U(SpiceMacroReturnedNullError, ValueKind) U(UnsupportedDimensionalityError, ValueKind) U(UnsupportedExecutionModeError, ValueKind) U(CastCategoryError, ValueKind) U(CastSizeError, ValueKind) U(CastIncompatibleAggregateTypeError, ValueKind) U(InvalidOperandsError, ValueKind) U(InvalidArgumentTypeForBuiltinError, ValueKind) U(UnsupportedBuiltinError, ValueKind) U(InvalidCalleeError, ValueKind) U(TooManyFunctionArgumentsError, ValueKind) U(NotEnoughFunctionArgumentsError, ValueKind) U(DuplicateSwitchDefaultCaseError, ValueKind) U(MissingDefaultCaseError, ValueKind) U(UnclosedPassError, ValueKind) U(DoWithoutPassError, ValueKind) U(VariadicParameterNotLastError, ValueKind) U(RecursionOverflowError, ValueKind) U(ResultMustBePureError, ValueKind) U(GlobalInitializerMustBePureError, ValueKind) U(NoGlobalInitializerError, ValueKind) U(NoGlobalConstructorError, ValueKind) U(ParameterTypeMismatchError, ValueKind) U(FunctionPointerExpectedError, ValueKind) U(ScalarOrVectorExpectedError, ValueKind) U(FixedVectorSizeMismatchError, ValueKind) U(VectorSizeMismatchError, ValueKind) U(TypeMismatchError, ValueKind) U(InvalidMatrixSizeError, ValueKind) U(ConditionNotBoolError, ValueKind) U(UnexpectedValueKindError, ValueKind) U(UnresolvedValueError, ValueKind) U(PtrToGlobalHandlerMissingError, ValueKind) U(CannotSerializeTypeError, ValueKind) U(PrematureReturnFromExpressionError, ValueKind) U(OpaqueTypeError, ValueKind) U(UntrackedTypeError, ValueKind) U(MovableTypeMismatchError, ValueKind) U(DupeUniqueStorageError, ValueKind) U(GenericIndexOutOfRangeError, ValueKind) U(ShuffleVectorIndexOutOfRangeError, ValueKind) U(ExtractStringConstantIndexOutOfRangeError, ValueKind) U(ArgumentsTypeIndexOutOfRangeError, ValueKind) U(FunctionTypeIndexOutOfRangeError, ValueKind) U(ArrayOrVectorTypeIndexOutOfRangeError, ValueKind) U(TupleTypeIndexOutOfRangeError, ValueKind) U(TypenameCompleteError, ValueKind) U(TypenameIncompleteError, ValueKind) U(TypenameIncompatibleStorageError, ValueKind) U(StorageTypeExpectedError, ValueKind) U(PlainStorageTypeExpectedError, ValueKind) U(VariableOutOfScopeError, ValueKind) U(UnboundValueError, ValueKind) U(CannotProveForwardDeclarationError, ValueKind) U(QuoteUnsupportedValueKindError, ValueKind) U(QuoteUnboundValueError, ValueKind) U(CGenTypeUnsupportedInTargetError, ValueKind) U(CGenFailedToTranslateTypeError, ValueKind) U(CGenUnboundValueError, ValueKind) U(CGenInvalidRedeclarationError, ValueKind) U(CGenUnsupportedBuiltinError, ValueKind) U(CGenUnsupportedArrayAllocError, ValueKind) U(CGenUnsupportedMallocError, ValueKind) U(CGenUnsupportedUnOpError, ValueKind) U(CGenUnsupportedBinOpError, ValueKind) U(CGenUnsupportedTriOpError, ValueKind) U(CGenUnsupportedImageOpError, ValueKind) U(CGenUnsupportedCastOpError, ValueKind) U(CGenUnsupportedAtomicOpError, ValueKind) U(CGenUnsupportedTargetError, ValueKind) U(CGenInvalidCalleeError, ValueKind) U(CGenFailedToTranslateValueError, ValueKind) U(CGenUnsupportedInstructionError, ValueKind) U(CGenFailedToResolveExternError, ValueKind) U(CGenRecursiveConstructorError, ValueKind) U(CGenBackendFailedError, ValueKind) U(CGenBackendFailedErrnoError, ValueKind) U(CGenCannotSerializeConstPointerError, ValueKind) U(CGenBackendValidationFailedError, ValueKind) U(CGenBackendOptimizationFailedError, ValueKind) U(CGenUnsupportedCapabilityError, ValueKind) U(CGenUnsupportedDimensionalityError, ValueKind) U(CGenUnsupportedImageFormatError, ValueKind) U(CGenUnsupportedExecutionModeError, ValueKind) U(CGenUnrecognizedSymbolicMaskError, ValueKind) U(CGenUnsupportedPointerStorageClassError, ValueKind) U(CGenUnsupportedArgumentPointerStorageClassError, ValueKind) U(CGenUnsupportedBufferAlignmentError, ValueKind) U(CGenUnsupportedReturnArgumentError, ValueKind) U(CGenUnsupportedIntrinsicError, ValueKind) U(CGenEntryFunctionSignatureMismatchError, ValueKind) U(CGenUnsupportedVectorSizeError, ValueKind) U(CGenUnsupportedMatrixSizeError, ValueKind) U(RTLoadLibraryFailedError, ValueKind) U(RTGetAddressFailedError, ValueKind) U(RTMissingKeyError, ValueKind) U(RTMissingScopeAnyAttributeError, ValueKind) U(RTMissingLocalScopeAnyAttributeError, ValueKind) U(RTMissingScopeAttributeError, ValueKind) U(RTMissingLocalScopeAttributeError, ValueKind) U(RTMissingTypeAttributeError, ValueKind) U(RTMissingLocalTypeAttributeError, ValueKind) U(RTMissingTupleAttributeError, ValueKind) U(RTRegExError, ValueKind) U(RTUnableToOpenFileError, ValueKind) U(RTUncountableStorageTypeError, ValueKind) U(RTNoElementsInStorageTypeError, ValueKind) U(RTNoNamedElementsInStorageTypeError, ValueKind) U(RTTypeBitcountMismatchError, ValueKind) U(RTUndefinedAttributeError, ValueKind) U(MainInaccessibleBinaryError, ValueKind) U(InvalidFooterError, ValueKind) U(CoreModuleFunctionTypeMismatchError, ValueKind) U(CoreMissingError, ValueKind) U(UserError, ValueKind) U(ExecutionEngineFailedError, ValueKind) U(OptimizationPassFailedError, ValueKind) U(StackOverflowError, ValueKind)
+SCOPES_DEFINE_TYPE_ID_ENUM(ErrorKind)
+#define TYPE_ENUM_TraceKind(T, U) U(UnknownOriginTrace, ValueKind) U(DummyTrace, ValueKind) U(TraceTrace, ValueKind) U(CallTrace, ValueKind) U(ParserTrace, ValueKind) U(ExpanderTrace, ValueKind) U(InvokeHookTrace, ValueKind) U(ProveExpressionTrace, ValueKind) U(ProveTemplateTrace, ValueKind) U(ProveArgumentTrace, ValueKind) U(ProveParamMapTrace, ValueKind) U(ProveArgumentLifetimeTrace, ValueKind) U(ProveDropTrace, ValueKind) U(TranslateTrace, ValueKind) U(QuoteTrace, ValueKind) U(UnwrapTrace, ValueKind) U(BuiltinTrace, ValueKind) U(BindSymbolTrace, ValueKind) U(FollowSymbolTrace, ValueKind) U(BindExprTrace, ValueKind) U(FollowExprTrace, ValueKind) U(ConvertForeignTypeTrace, ValueKind) U(ConvertForeignValueTrace, ValueKind) U(UserTrace, ValueKind)
+SCOPES_DEFINE_TYPE_ID_ENUM(TraceKind)
+#define TYPE_ENUM_TypeKind(T, U) U(QualifyType, ValueKind) U(ArgumentsType, ValueKind) U(TypenameType, ValueKind) U(IntegerType, ValueKind) U(RealType, ValueKind) U(PointerType, ValueKind) U(ArrayType, ValueKind) U(VectorType, ValueKind) U(MatrixType, ValueKind) U(TupleType, ValueKind) U(FunctionType, ValueKind) U(SamplerType, ValueKind) U(ImageType, ValueKind) U(SampledImageType, ValueKind)
+SCOPES_DEFINE_TYPE_ID_ENUM(TypeKind)
+#define TYPE_ENUM_QualifierKind(T, U) U(ReferQualifier, ValueKind) U(UniqueQualifier, ValueKind) U(ViewQualifier, ValueKind) U(MutateQualifier, ValueKind) U(KeyQualifier, ValueKind)
+SCOPES_DEFINE_TYPE_ID_ENUM(QualifierKind)
 #define TYPE_FIELDS_Value(T)
 SCOPES_DEFINE_ROOT_TYPE(Abstract, Value, ValueKind)
 #define TYPE_FIELDS_Error(T) T(by, Anchor)

          
@@ 544,31 546,12 @@ SCOPES_DEFINE_TYPE(Concrete, MutateQuali
 #define TYPE_FIELDS_KeyQualifier(T) T(key, Symbol)
 SCOPES_DEFINE_TYPE(Concrete, KeyQualifier, Qualifier, QualifierKind)
 #define TYPE_FIELDS_UntypedValue(T)
-#define TYPE_SUBTYPES_UntypedValue(T) T(Concrete, Template) T(Abstract, LabelTemplate) T(Concrete, Loop) T(Concrete, LoopArguments) T(Concrete, KeyedTemplate) T(Concrete, Expression) T(Concrete, Quote) T(Concrete, Unquote) T(Concrete, CompileStage) T(Concrete, CondTemplate) T(Concrete, SwitchTemplate) T(Abstract, CaseTemplate) T(Concrete, MergeTemplate) T(Concrete, CallTemplate) T(Concrete, ArgumentListTemplate) T(Concrete, ExtractArgumentTemplate) T(Concrete, ParameterTemplate)
+#define TYPE_SUBTYPES_UntypedValue(T) T(Concrete, Template) T(Concrete, LabelTemplate) T(Concrete, Loop) T(Concrete, LoopArguments) T(Concrete, KeyedTemplate) T(Concrete, Expression) T(Concrete, Quote) T(Concrete, Unquote) T(Concrete, CompileStage) T(Concrete, CondTemplate) T(Concrete, SwitchTemplate) T(Concrete, CaseTemplate) T(Concrete, MergeTemplate) T(Concrete, CallTemplate) T(Concrete, ArgumentListTemplate) T(Concrete, ExtractArgumentTemplate) T(Concrete, ParameterTemplate)
 SCOPES_DEFINE_TYPE(Abstract, UntypedValue, Value, ValueKind)
 #define TYPE_FIELDS_Template(T) T(name, Symbol) T(params, ParameterTemplates) T(value, Value) T(is_inline, SCOPES_bool) T(default_view_parameters, SCOPES_bool) T(lazy_expression, SCOPES_bool) T(docstring, SCOPES_OPTIONAL_ID_TYPE(String)) T(recursion, SCOPES_i32)
 SCOPES_DEFINE_TYPE(Concrete, Template, UntypedValue, ValueKind)
-#define TYPE_FIELDS_LabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-#define TYPE_SUBTYPES_LabelTemplate(T) T(Concrete, UserLabelTemplate) T(Concrete, InlineLabelTemplate) T(Concrete, TryLabelTemplate) T(Concrete, ExceptLabelTemplate) T(Concrete, ExceptAllLabelTemplate) T(Concrete, ThenLabelTemplate) T(Concrete, BreakLabelTemplate) T(Concrete, BranchMergeLabelTemplate) T(Concrete, TypeOfLabelTemplate)
-SCOPES_DEFINE_TYPE(Abstract, LabelTemplate, UntypedValue, LabelTemplateKind)
-#define TYPE_FIELDS_UserLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, UserLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_InlineLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, InlineLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_TryLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, TryLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_ExceptLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, ExceptLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_ExceptAllLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, ExceptAllLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_ThenLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, ThenLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_BreakLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, BreakLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_BranchMergeLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, BranchMergeLabelTemplate, LabelTemplate, LabelTemplateKind)
-#define TYPE_FIELDS_TypeOfLabelTemplate(T) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
-SCOPES_DEFINE_TYPE(Concrete, TypeOfLabelTemplate, LabelTemplate, LabelTemplateKind)
+#define TYPE_FIELDS_LabelTemplate(T) T(label_kind, LabelKind) T(name, Symbol) T(value, SCOPES_OPTIONAL_ID_TYPE(Value))
+SCOPES_DEFINE_TYPE(Concrete, LabelTemplate, UntypedValue, ValueKind)
 #define TYPE_FIELDS_Loop(T) T(init, Value) T(value, Value) T(args, LoopArguments)
 SCOPES_DEFINE_TYPE(Concrete, Loop, UntypedValue, ValueKind)
 #define TYPE_FIELDS_LoopArguments(T) T(loop, SCOPES_OPTIONAL_ID_TYPE(Loop))

          
@@ 587,20 570,8 @@ SCOPES_DEFINE_TYPE(Concrete, CompileStag
 SCOPES_DEFINE_TYPE(Concrete, CondTemplate, UntypedValue, ValueKind)
 #define TYPE_FIELDS_SwitchTemplate(T) T(expr, Value) T(cases, Values)
 SCOPES_DEFINE_TYPE(Concrete, SwitchTemplate, UntypedValue, ValueKind)
-#define TYPE_FIELDS_CaseTemplate(T) T(value, Value)
-#define TYPE_SUBTYPES_CaseTemplate(T) T(Abstract, LiteralCaseTemplate) T(Concrete, DoCase) T(Concrete, DefaultCase)
-SCOPES_DEFINE_TYPE(Abstract, CaseTemplate, UntypedValue, CaseKind)
-#define TYPE_FIELDS_LiteralCaseTemplate(T) T(value, Value) T(literal, Value)
-#define TYPE_SUBTYPES_LiteralCaseTemplate(T) T(Concrete, Case) T(Concrete, Pass)
-SCOPES_DEFINE_TYPE(Abstract, LiteralCaseTemplate, CaseTemplate, CaseKind)
-#define TYPE_FIELDS_Case(T) T(value, Value) T(literal, Value)
-SCOPES_DEFINE_TYPE(Concrete, Case, LiteralCaseTemplate, CaseKind)
-#define TYPE_FIELDS_Pass(T) T(value, Value) T(literal, Value)
-SCOPES_DEFINE_TYPE(Concrete, Pass, LiteralCaseTemplate, CaseKind)
-#define TYPE_FIELDS_DoCase(T) T(value, Value)
-SCOPES_DEFINE_TYPE(Concrete, DoCase, CaseTemplate, CaseKind)
-#define TYPE_FIELDS_DefaultCase(T) T(value, Value)
-SCOPES_DEFINE_TYPE(Concrete, DefaultCase, CaseTemplate, CaseKind)
+#define TYPE_FIELDS_CaseTemplate(T) T(case_kind, CaseKind) T(value, Value) T(literal, SCOPES_OPTIONAL_ID_TYPE(Value))
+SCOPES_DEFINE_TYPE(Concrete, CaseTemplate, UntypedValue, ValueKind)
 #define TYPE_FIELDS_MergeTemplate(T) T(label, LabelTemplate) T(value, Value)
 SCOPES_DEFINE_TYPE(Concrete, MergeTemplate, UntypedValue, ValueKind)
 #define TYPE_FIELDS_CallTemplate(T) T(callee, Value) T(args, Values) T(flags, CallTemplateFlags)

          
@@ 657,29 628,10 @@ SCOPES_DEFINE_TYPE(Concrete, ConstPointe
 #define TYPE_FIELDS_ConstValue(T) T(type, Type) T(value, Value)
 SCOPES_DEFINE_TYPE(Concrete, ConstValue, Const, ValueKind)
 #define TYPE_FIELDS_Instruction(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-#define TYPE_SUBTYPES_Instruction(T) T(Abstract, Label) T(Concrete, LoopLabel) T(Concrete, CondBr) T(Concrete, Switch) T(Concrete, Call) T(Concrete, Select) T(Concrete, ExtractValue) T(Concrete, InsertValue) T(Concrete, GetElementPtr) T(Concrete, ExtractElement) T(Concrete, InsertElement) T(Concrete, ShuffleVector) T(Concrete, Alloca) T(Concrete, Malloc) T(Concrete, Free) T(Concrete, Load) T(Concrete, Store) T(Abstract, AtomicRMW) T(Concrete, CmpXchg) T(Abstract, Barrier) T(Abstract, ICmp) T(Abstract, FCmp) T(Abstract, UnOp) T(Abstract, BinOp) T(Concrete, Annotate) T(Concrete, ExecutionMode) T(Abstract, Cast) T(Abstract, Terminator)
+#define TYPE_SUBTYPES_Instruction(T) T(Concrete, Label) T(Concrete, LoopLabel) T(Concrete, CondBr) T(Concrete, Switch) T(Concrete, Call) T(Concrete, Select) T(Concrete, ExtractValue) T(Concrete, InsertValue) T(Concrete, GetElementPtr) T(Concrete, ExtractElement) T(Concrete, InsertElement) T(Concrete, ShuffleVector) T(Concrete, Alloca) T(Concrete, Malloc) T(Concrete, Free) T(Concrete, Load) T(Concrete, Store) T(Concrete, AtomicRMW) T(Concrete, CmpXchg) T(Concrete, Barrier) T(Concrete, ICmp) T(Concrete, FCmp) T(Concrete, UnOp) T(Concrete, BinOp) T(Concrete, Annotate) T(Concrete, ExecutionMode) T(Concrete, Cast) T(Abstract, Terminator)
 SCOPES_DEFINE_TYPE(Abstract, Instruction, TypedValue, ValueKind)
-#define TYPE_FIELDS_Label(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-#define TYPE_SUBTYPES_Label(T) T(Concrete, UserLabel) T(Concrete, InlineLabel) T(Concrete, TryLabel) T(Concrete, ExceptLabel) T(Concrete, ExceptAllLabel) T(Concrete, ThenLabel) T(Concrete, BreakLabel) T(Concrete, BranchMergeLabel) T(Concrete, TypeOfLabel)
-SCOPES_DEFINE_TYPE(Abstract, Label, Instruction, LabelKind)
-#define TYPE_FIELDS_UserLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, UserLabel, Label, LabelKind)
-#define TYPE_FIELDS_InlineLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, InlineLabel, Label, LabelKind)
-#define TYPE_FIELDS_TryLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, TryLabel, Label, LabelKind)
-#define TYPE_FIELDS_ExceptLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, ExceptLabel, Label, LabelKind)
-#define TYPE_FIELDS_ExceptAllLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, ExceptAllLabel, Label, LabelKind)
-#define TYPE_FIELDS_ThenLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, ThenLabel, Label, LabelKind)
-#define TYPE_FIELDS_BreakLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, BreakLabel, Label, LabelKind)
-#define TYPE_FIELDS_BranchMergeLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, BranchMergeLabel, Label, LabelKind)
-#define TYPE_FIELDS_TypeOfLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
-SCOPES_DEFINE_TYPE(Concrete, TypeOfLabel, Label, LabelKind)
+#define TYPE_FIELDS_Label(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(label_kind, LabelKind) T(body, Block) T(merges, Merges) T(splitpoints, SCOPES_SET_TYPE(TypedValue))
+SCOPES_DEFINE_TYPE(Concrete, Label, Instruction, ValueKind)
 #define TYPE_FIELDS_LoopLabel(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(init, TypedValues) T(body, Block) T(repeats, Repeats) T(args, LoopLabelArguments)
 SCOPES_DEFINE_TYPE(Concrete, LoopLabel, Instruction, ValueKind)
 #define TYPE_FIELDS_CondBr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(cond, TypedValue) T(then_body, Block) T(else_body, Block)

          
@@ 712,253 664,26 @@ SCOPES_DEFINE_TYPE(Concrete, Free, Instr
 SCOPES_DEFINE_TYPE(Concrete, Load, Instruction, ValueKind)
 #define TYPE_FIELDS_Store(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue) T(target, TypedValue) T(is_volatile, SCOPES_bool)
 SCOPES_DEFINE_TYPE(Concrete, Store, Instruction, ValueKind)
-#define TYPE_FIELDS_AtomicRMW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-#define TYPE_SUBTYPES_AtomicRMW(T) T(Concrete, AtomicXchg) T(Concrete, AtomicAdd) T(Concrete, AtomicSub) T(Concrete, AtomicBAnd) T(Concrete, AtomicBNAnd) T(Concrete, AtomicBOr) T(Concrete, AtomicBXor) T(Concrete, AtomicSMin) T(Concrete, AtomicSMax) T(Concrete, AtomicUMin) T(Concrete, AtomicUMax) T(Concrete, AtomicFAdd) T(Concrete, AtomicFSub)
-SCOPES_DEFINE_TYPE(Abstract, AtomicRMW, Instruction, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicXchg(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicXchg, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicAdd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicAdd, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicSub(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicSub, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicBAnd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicBAnd, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicBNAnd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicBNAnd, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicBOr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicBOr, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicBXor(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicBXor, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicSMin(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicSMin, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicSMax(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicSMax, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicUMin(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicUMin, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicUMax(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicUMax, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicFAdd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicFAdd, AtomicRMW, AtomicRMWOpKind)
-#define TYPE_FIELDS_AtomicFSub(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, AtomicFSub, AtomicRMW, AtomicRMWOpKind)
+#define TYPE_FIELDS_AtomicRMW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, AtomicRMWOpKind) T(target, TypedValue) T(value, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, AtomicRMW, Instruction, ValueKind)
 #define TYPE_FIELDS_CmpXchg(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(target, TypedValue) T(cmp, TypedValue) T(value, TypedValue)
 SCOPES_DEFINE_TYPE(Concrete, CmpXchg, Instruction, ValueKind)
-#define TYPE_FIELDS_Barrier(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-#define TYPE_SUBTYPES_Barrier(T) T(Concrete, BarrierControl) T(Concrete, BarrierMemory) T(Concrete, BarrierMemoryGroup) T(Concrete, BarrierMemoryImage) T(Concrete, BarrierMemoryBuffer) T(Concrete, BarrierMemoryShared)
-SCOPES_DEFINE_TYPE(Abstract, Barrier, Instruction, BarrierKind)
-#define TYPE_FIELDS_BarrierControl(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierControl, Barrier, BarrierKind)
-#define TYPE_FIELDS_BarrierMemory(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierMemory, Barrier, BarrierKind)
-#define TYPE_FIELDS_BarrierMemoryGroup(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierMemoryGroup, Barrier, BarrierKind)
-#define TYPE_FIELDS_BarrierMemoryImage(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierMemoryImage, Barrier, BarrierKind)
-#define TYPE_FIELDS_BarrierMemoryBuffer(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierMemoryBuffer, Barrier, BarrierKind)
-#define TYPE_FIELDS_BarrierMemoryShared(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block))
-SCOPES_DEFINE_TYPE(Concrete, BarrierMemoryShared, Barrier, BarrierKind)
-#define TYPE_FIELDS_ICmp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-#define TYPE_SUBTYPES_ICmp(T) T(Concrete, ICmpEQ) T(Concrete, ICmpNE) T(Concrete, ICmpUGT) T(Concrete, ICmpUGE) T(Concrete, ICmpULT) T(Concrete, ICmpULE) T(Concrete, ICmpSGT) T(Concrete, ICmpSGE) T(Concrete, ICmpSLT) T(Concrete, ICmpSLE)
-SCOPES_DEFINE_TYPE(Abstract, ICmp, Instruction, ICmpKind)
-#define TYPE_FIELDS_ICmpEQ(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpEQ, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpNE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpNE, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpUGT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpUGT, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpUGE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpUGE, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpULT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpULT, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpULE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpULE, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpSGT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpSGT, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpSGE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpSGE, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpSLT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpSLT, ICmp, ICmpKind)
-#define TYPE_FIELDS_ICmpSLE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, ICmpSLE, ICmp, ICmpKind)
-#define TYPE_FIELDS_FCmp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-#define TYPE_SUBTYPES_FCmp(T) T(Concrete, FCmpOEQ) T(Concrete, FCmpONE) T(Concrete, FCmpORD) T(Concrete, FCmpOGT) T(Concrete, FCmpOGE) T(Concrete, FCmpOLT) T(Concrete, FCmpOLE) T(Concrete, FCmpUEQ) T(Concrete, FCmpUNE) T(Concrete, FCmpUNO) T(Concrete, FCmpUGT) T(Concrete, FCmpUGE) T(Concrete, FCmpULT) T(Concrete, FCmpULE)
-SCOPES_DEFINE_TYPE(Abstract, FCmp, Instruction, FCmpKind)
-#define TYPE_FIELDS_FCmpOEQ(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpOEQ, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpONE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpONE, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpORD(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpORD, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpOGT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpOGT, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpOGE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpOGE, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpOLT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpOLT, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpOLE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpOLE, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpUEQ(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpUEQ, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpUNE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpUNE, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpUNO(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpUNO, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpUGT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpUGT, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpUGE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpUGE, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpULT(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpULT, FCmp, FCmpKind)
-#define TYPE_FIELDS_FCmpULE(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, FCmpULE, FCmp, FCmpKind)
-#define TYPE_FIELDS_UnOp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-#define TYPE_SUBTYPES_UnOp(T) T(Concrete, UnOpBitReverse) T(Concrete, UnOpBitCount) T(Concrete, UnOpFindMSB) T(Concrete, UnOpFindLSB) T(Concrete, UnOpFNeg) T(Concrete, UnOpSin) T(Concrete, UnOpCos) T(Concrete, UnOpTan) T(Concrete, UnOpAsin) T(Concrete, UnOpAcos) T(Concrete, UnOpAtan) T(Concrete, UnOpSinh) T(Concrete, UnOpCosh) T(Concrete, UnOpTanh) T(Concrete, UnOpASinh) T(Concrete, UnOpACosh) T(Concrete, UnOpATanh) T(Concrete, UnOpTrunc) T(Concrete, UnOpFloor) T(Concrete, UnOpFAbs) T(Concrete, UnOpLog) T(Concrete, UnOpLog2) T(Concrete, UnOpExp) T(Concrete, UnOpExp2) T(Concrete, UnOpSqrt)
-SCOPES_DEFINE_TYPE(Abstract, UnOp, Instruction, UnOpKind)
-#define TYPE_FIELDS_UnOpBitReverse(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpBitReverse, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpBitCount(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpBitCount, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpFindMSB(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpFindMSB, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpFindLSB(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpFindLSB, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpFNeg(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpFNeg, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpSin(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpSin, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpCos(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpCos, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpTan(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpTan, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpAsin(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpAsin, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpAcos(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpAcos, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpAtan(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpAtan, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpSinh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpSinh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpCosh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpCosh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpTanh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpTanh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpASinh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpASinh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpACosh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpACosh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpATanh(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpATanh, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpTrunc(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpTrunc, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpFloor(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpFloor, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpFAbs(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpFAbs, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpLog(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpLog, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpLog2(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpLog2, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpExp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpExp, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpExp2(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpExp2, UnOp, UnOpKind)
-#define TYPE_FIELDS_UnOpSqrt(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, UnOpSqrt, UnOp, UnOpKind)
-#define TYPE_FIELDS_BinOp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-#define TYPE_SUBTYPES_BinOp(T) T(Concrete, BinOpAdd) T(Concrete, BinOpAddNUW) T(Concrete, BinOpAddNSW) T(Concrete, BinOpSub) T(Concrete, BinOpSubNUW) T(Concrete, BinOpSubNSW) T(Concrete, BinOpMul) T(Concrete, BinOpMulNUW) T(Concrete, BinOpMulNSW) T(Concrete, BinOpUDiv) T(Concrete, BinOpSDiv) T(Concrete, BinOpURem) T(Concrete, BinOpSRem) T(Concrete, BinOpShl) T(Concrete, BinOpLShr) T(Concrete, BinOpAShr) T(Concrete, BinOpBAnd) T(Concrete, BinOpBOr) T(Concrete, BinOpBXor) T(Concrete, BinOpFAdd) T(Concrete, BinOpFSub) T(Concrete, BinOpFMul) T(Concrete, BinOpFDiv) T(Concrete, BinOpFRem) T(Concrete, BinOpAtan2) T(Concrete, BinOpPow)
-SCOPES_DEFINE_TYPE(Abstract, BinOp, Instruction, BinOpKind)
-#define TYPE_FIELDS_BinOpAdd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpAdd, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpAddNUW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpAddNUW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpAddNSW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpAddNSW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpSub(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpSub, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpSubNUW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpSubNUW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpSubNSW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpSubNSW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpMul(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpMul, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpMulNUW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpMulNUW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpMulNSW(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpMulNSW, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpUDiv(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpUDiv, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpSDiv(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpSDiv, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpURem(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpURem, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpSRem(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpSRem, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpShl(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpShl, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpLShr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpLShr, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpAShr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpAShr, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpBAnd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpBAnd, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpBOr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpBOr, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpBXor(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpBXor, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpFAdd(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpFAdd, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpFSub(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpFSub, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpFMul(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpFMul, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpFDiv(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpFDiv, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpFRem(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpFRem, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpAtan2(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpAtan2, BinOp, BinOpKind)
-#define TYPE_FIELDS_BinOpPow(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value1, TypedValue) T(value2, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, BinOpPow, BinOp, BinOpKind)
+#define TYPE_FIELDS_Barrier(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, BarrierKind)
+SCOPES_DEFINE_TYPE(Concrete, Barrier, Instruction, ValueKind)
+#define TYPE_FIELDS_ICmp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, ICmpKind) T(value1, TypedValue) T(value2, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, ICmp, Instruction, ValueKind)
+#define TYPE_FIELDS_FCmp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, FCmpKind) T(value1, TypedValue) T(value2, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, FCmp, Instruction, ValueKind)
+#define TYPE_FIELDS_UnOp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, UnOpKind) T(value, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, UnOp, Instruction, ValueKind)
+#define TYPE_FIELDS_BinOp(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, BinOpKind) T(value1, TypedValue) T(value2, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, BinOp, Instruction, ValueKind)
 #define TYPE_FIELDS_Annotate(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(values, TypedValues)
 SCOPES_DEFINE_TYPE(Concrete, Annotate, Instruction, ValueKind)
 #define TYPE_FIELDS_ExecutionMode(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(mode, Symbol) T(values, i32x3)
 SCOPES_DEFINE_TYPE(Concrete, ExecutionMode, Instruction, ValueKind)
-#define TYPE_FIELDS_Cast(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-#define TYPE_SUBTYPES_Cast(T) T(Concrete, CastBitcast) T(Concrete, CastIntToPtr) T(Concrete, CastPtrToInt) T(Concrete, CastSExt) T(Concrete, CastITrunc) T(Concrete, CastZExt) T(Concrete, CastFPTrunc) T(Concrete, CastFPExt) T(Concrete, CastFPToUI) T(Concrete, CastFPToSI) T(Concrete, CastUIToFP) T(Concrete, CastSIToFP) T(Concrete, CastPtrToRef) T(Concrete, CastRefToPtr) T(Concrete, CastCellToData) T(Concrete, CastDataToCell)
-SCOPES_DEFINE_TYPE(Abstract, Cast, Instruction, CastKind)
-#define TYPE_FIELDS_CastBitcast(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastBitcast, Cast, CastKind)
-#define TYPE_FIELDS_CastIntToPtr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastIntToPtr, Cast, CastKind)
-#define TYPE_FIELDS_CastPtrToInt(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastPtrToInt, Cast, CastKind)
-#define TYPE_FIELDS_CastSExt(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastSExt, Cast, CastKind)
-#define TYPE_FIELDS_CastITrunc(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastITrunc, Cast, CastKind)
-#define TYPE_FIELDS_CastZExt(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastZExt, Cast, CastKind)
-#define TYPE_FIELDS_CastFPTrunc(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastFPTrunc, Cast, CastKind)
-#define TYPE_FIELDS_CastFPExt(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastFPExt, Cast, CastKind)
-#define TYPE_FIELDS_CastFPToUI(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastFPToUI, Cast, CastKind)
-#define TYPE_FIELDS_CastFPToSI(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastFPToSI, Cast, CastKind)
-#define TYPE_FIELDS_CastUIToFP(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastUIToFP, Cast, CastKind)
-#define TYPE_FIELDS_CastSIToFP(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastSIToFP, Cast, CastKind)
-#define TYPE_FIELDS_CastPtrToRef(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastPtrToRef, Cast, CastKind)
-#define TYPE_FIELDS_CastRefToPtr(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastRefToPtr, Cast, CastKind)
-#define TYPE_FIELDS_CastCellToData(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastCellToData, Cast, CastKind)
-#define TYPE_FIELDS_CastDataToCell(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(value, TypedValue)
-SCOPES_DEFINE_TYPE(Concrete, CastDataToCell, Cast, CastKind)
+#define TYPE_FIELDS_Cast(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(op, CastKind) T(value, TypedValue)
+SCOPES_DEFINE_TYPE(Concrete, Cast, Instruction, ValueKind)
 #define TYPE_FIELDS_Terminator(T) T(type, Type) T(name, Symbol) T(block, SCOPES_OPTIONAL_ID_TYPE(Block)) T(values, TypedValues)
 #define TYPE_SUBTYPES_Terminator(T) T(Concrete, Merge) T(Concrete, Repeat) T(Concrete, Return) T(Concrete, Raise) T(Concrete, Unreachable) T(Concrete, Discard)
 SCOPES_DEFINE_TYPE(Abstract, Terminator, Instruction, ValueKind)

          
@@ 1006,7 731,7 @@ SCOPES_TYPEDEF(i32x3, SCOPES_SARRAY_TYPE
 SCOPES_TYPEDEF(Repeats, SCOPES_DARRAY_TYPE(Repeat))
 #define STRUCT_FIELDS_Location(T) T(line, SCOPES_i32) T(column, SCOPES_i32) T(offset, SCOPES_usize)
 SCOPES_DEFINE_STRUCT(Location)
-#define STRUCT_FIELDS_SwitchCase(T) T(anchor, Anchor) T(literal, SCOPES_OPTIONAL_ID_TYPE(ConstInt)) T(body, Block)
+#define STRUCT_FIELDS_SwitchCase(T) T(anchor, Anchor) T(case_kind, CaseKind) T(literal, SCOPES_OPTIONAL_ID_TYPE(ConstInt)) T(body, Block)
 SCOPES_DEFINE_STRUCT(SwitchCase)
 SCOPES_IMPL_FIELDS(Concrete, Discard, Terminator)
 SCOPES_IMPL_FIELDS(Concrete, Unreachable, Terminator)

          
@@ 1015,126 740,16 @@ SCOPES_IMPL_FIELDS(Concrete, Return, Ter
 SCOPES_IMPL_FIELDS(Concrete, Repeat, Terminator)
 SCOPES_IMPL_FIELDS(Concrete, Merge, Terminator)
 SCOPES_IMPL_FIELDS(Abstract, Terminator, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, CastDataToCell, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastCellToData, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastRefToPtr, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastPtrToRef, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastSIToFP, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastUIToFP, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastFPToSI, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastFPToUI, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastFPExt, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastFPTrunc, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastZExt, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastITrunc, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastSExt, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastPtrToInt, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastIntToPtr, Cast)
-SCOPES_IMPL_FIELDS(Concrete, CastBitcast, Cast)
-SCOPES_IMPL_FIELDS(Abstract, Cast, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, Cast, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, ExecutionMode, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, Annotate, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, BinOpPow, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpAtan2, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpFRem, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpFDiv, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpFMul, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpFSub, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpFAdd, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpBXor, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpBOr, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpBAnd, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpAShr, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpLShr, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpShl, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpSRem, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpURem, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpSDiv, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpUDiv, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpMulNSW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpMulNUW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpMul, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpSubNSW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpSubNUW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpSub, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpAddNSW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpAddNUW, BinOp)
-SCOPES_IMPL_FIELDS(Concrete, BinOpAdd, BinOp)
-SCOPES_IMPL_FIELDS(Abstract, BinOp, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, UnOpSqrt, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpExp2, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpExp, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpLog2, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpLog, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpFAbs, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpFloor, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpTrunc, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpATanh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpACosh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpASinh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpTanh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpCosh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpSinh, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpAtan, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpAcos, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpAsin, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpTan, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpCos, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpSin, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpFNeg, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpFindLSB, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpFindMSB, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpBitCount, UnOp)
-SCOPES_IMPL_FIELDS(Concrete, UnOpBitReverse, UnOp)
-SCOPES_IMPL_FIELDS(Abstract, UnOp, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, FCmpULE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpULT, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpUGE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpUGT, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpUNO, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpUNE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpUEQ, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpOLE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpOLT, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpOGE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpOGT, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpORD, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpONE, FCmp)
-SCOPES_IMPL_FIELDS(Concrete, FCmpOEQ, FCmp)
-SCOPES_IMPL_FIELDS(Abstract, FCmp, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, ICmpSLE, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpSLT, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpSGE, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpSGT, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpULE, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpULT, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpUGE, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpUGT, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpNE, ICmp)
-SCOPES_IMPL_FIELDS(Concrete, ICmpEQ, ICmp)
-SCOPES_IMPL_FIELDS(Abstract, ICmp, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, BarrierMemoryShared, Barrier)
-SCOPES_IMPL_FIELDS(Concrete, BarrierMemoryBuffer, Barrier)
-SCOPES_IMPL_FIELDS(Concrete, BarrierMemoryImage, Barrier)
-SCOPES_IMPL_FIELDS(Concrete, BarrierMemoryGroup, Barrier)
-SCOPES_IMPL_FIELDS(Concrete, BarrierMemory, Barrier)
-SCOPES_IMPL_FIELDS(Concrete, BarrierControl, Barrier)
-SCOPES_IMPL_FIELDS(Abstract, Barrier, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, BinOp, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, UnOp, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, FCmp, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, ICmp, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, Barrier, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, CmpXchg, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, AtomicFSub, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicFAdd, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicUMax, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicUMin, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicSMax, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicSMin, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicBXor, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicBOr, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicBNAnd, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicBAnd, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicSub, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicAdd, AtomicRMW)
-SCOPES_IMPL_FIELDS(Concrete, AtomicXchg, AtomicRMW)
-SCOPES_IMPL_FIELDS(Abstract, AtomicRMW, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, AtomicRMW, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, Store, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, Load, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, Free, Instruction)

          
@@ 1151,16 766,7 @@ SCOPES_IMPL_FIELDS(Concrete, Call, Instr
 SCOPES_IMPL_FIELDS(Concrete, Switch, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, CondBr, Instruction)
 SCOPES_IMPL_FIELDS(Concrete, LoopLabel, Instruction)
-SCOPES_IMPL_FIELDS(Concrete, TypeOfLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, BranchMergeLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, BreakLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, ThenLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, ExceptAllLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, ExceptLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, TryLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, InlineLabel, Label)
-SCOPES_IMPL_FIELDS(Concrete, UserLabel, Label)
-SCOPES_IMPL_FIELDS(Abstract, Label, Instruction)
+SCOPES_IMPL_FIELDS(Concrete, Label, Instruction)
 SCOPES_IMPL_FIELDS(Abstract, Instruction, TypedValue)
 SCOPES_IMPL_FIELDS(Concrete, ConstValue, Const)
 SCOPES_IMPL_FIELDS(Concrete, ConstPointer, Const)

          
@@ 1188,12 794,7 @@ SCOPES_IMPL_FIELDS(Concrete, ExtractArgu
 SCOPES_IMPL_FIELDS(Concrete, ArgumentListTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, CallTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, MergeTemplate, UntypedValue)
-SCOPES_IMPL_FIELDS(Concrete, DefaultCase, CaseTemplate)
-SCOPES_IMPL_FIELDS(Concrete, DoCase, CaseTemplate)
-SCOPES_IMPL_FIELDS(Concrete, Pass, LiteralCaseTemplate)
-SCOPES_IMPL_FIELDS(Concrete, Case, LiteralCaseTemplate)
-SCOPES_IMPL_FIELDS(Abstract, LiteralCaseTemplate, CaseTemplate)
-SCOPES_IMPL_FIELDS(Abstract, CaseTemplate, UntypedValue)
+SCOPES_IMPL_FIELDS(Concrete, CaseTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, SwitchTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, CondTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, CompileStage, UntypedValue)

          
@@ 1203,16 804,7 @@ SCOPES_IMPL_FIELDS(Concrete, Expression,
 SCOPES_IMPL_FIELDS(Concrete, KeyedTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, LoopArguments, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, Loop, UntypedValue)
-SCOPES_IMPL_FIELDS(Concrete, TypeOfLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, BranchMergeLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, BreakLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, ThenLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, ExceptAllLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, ExceptLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, TryLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, InlineLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Concrete, UserLabelTemplate, LabelTemplate)
-SCOPES_IMPL_FIELDS(Abstract, LabelTemplate, UntypedValue)
+SCOPES_IMPL_FIELDS(Concrete, LabelTemplate, UntypedValue)
 SCOPES_IMPL_FIELDS(Concrete, Template, UntypedValue)
 SCOPES_IMPL_FIELDS(Abstract, UntypedValue, Value)
 SCOPES_IMPL_FIELDS(Concrete, KeyQualifier, Qualifier)