diff --git a/scripts/lldbinit.py b/scripts/lldbinit.py index 5b89b78060b41..82f5f289545ce 100644 --- a/scripts/lldbinit.py +++ b/scripts/lldbinit.py @@ -44,13 +44,16 @@ def print_usage() -> None: Dumps the value of an associated ID, using the C++ Dump() functions. Usage: - dump [|-- || ] + dump [|-- |[.]] Args: CONTEXT is the dump context, such a SemIR::Context reference, a SemIR::File, a Parse::Context, or a Lex::TokenizeBuffer. EXPR is a C++ expression such as a variable name. Use `--` to prevent it from being treated as a TYPE and ID. + IR is the CheckIRId(N) in the form `irN`. Not all ID types have an `ir` + prefix, the ones which do are dumped with that prefix, such as for + `inst` as `ir1.inst2`. TYPE can be `inst`, `constant`, `generic`, `impl`, `entity_name`, etc. See the `Label` string in `IdBase` classes to find possible TYPE names, though only Id types that have a matching `Make...Id()` function are @@ -74,8 +77,13 @@ def print_usage() -> None: context = args[0] - # The set of "Make" functions in dump.cpp. + # The set of "Make" functions in dump.cpp. These use ADL to find the factory + # function in `check/` or in `sem_ir/`. id_types = { + "inst": "MakeInstId", + } + # These id types don't have an IdTag embedded in them. + untagged_id_types = { "class": "SemIR::MakeClassId", "constant": "SemIR::MakeConstantId", "symbolic_constant": "SemIR::MakeSymbolicConstantId", @@ -85,7 +93,6 @@ def print_usage() -> None: "generic": "SemIR::MakeGenericId", "impl": "SemIR::MakeImplId", "inst_block": "SemIR::MakeInstBlockId", - "inst": "SemIR::MakeInstId", "interface": "SemIR::MakeInterfaceId", "name": "SemIR::MakeNameId", "name_scope": "SemIR::MakeNameScopeId", @@ -110,27 +117,31 @@ def print_dump(context: str, expr: str) -> None: # Try to find a type + id from the input args. If not, the id will be passed # through directly to C++, as it can be a variable name. - id_type = None + found_id_type = False - # Look for as a single argument. - if m := re.fullmatch("([a-z_]+)(\\d+)", args[1]): - if m[1] in id_types: + # Look for . as a single argument. + if m := re.fullmatch("ir(\\d+)\\.([a-z_]+)(\\d+)", args[1]): + if m[2] in id_types: if len(args) != 2: print_usage() return - id_type = m[1] - print_dump(context, f"{id_types[id_type]}({m[2]})") + id_type = m[2] + print_dump( + context, f"{id_types[id_type]}({context}, {m[1]}, {m[3]})" + ) + found_id_type = True - # Look for as two arguments. - if not id_type: - if args[1] in id_types: - if len(args) != 3: + # Look for as a single argument. + if m := re.fullmatch("([a-z_]+)(\\d+)", args[1]): + if m[1] in untagged_id_types: + if len(args) != 2: print_usage() return - id_type = args[1] - print_dump(context, f"{id_types[id_type]}({args[2]})") + id_type = m[1] + print_dump(context, f"{untagged_id_types[id_type]}({m[2]})") + found_id_type = True - if not id_type: + if not found_id_type: # Use `--` to escape a variable name like `inst22`. if args[1] == "--": expr = " ".join(args[2:]) diff --git a/toolchain/base/value_store.h b/toolchain/base/value_store.h index aa9e757ffb497..bb9892fd6f0b9 100644 --- a/toolchain/base/value_store.h +++ b/toolchain/base/value_store.h @@ -33,37 +33,71 @@ class ValueStoreNotPrintable {}; } // namespace Internal struct IdTag { - IdTag() - : id_tag_(0), - initial_reserved_ids_(std::numeric_limits::max()) {} + IdTag() = default; + explicit IdTag(int32_t id_index, int32_t initial_reserved_ids) - : initial_reserved_ids_(initial_reserved_ids) { - // Shift down by 1 to get out of the high bit to avoid using any negative - // ids, since they have special uses. - // Shift down by another 1 to free up the second highest bit for a marker to - // indicate whether the index is tagged (& needs to be untagged) or not. - // Add one to the index so it's not zero-based, to make it a bit less likely - // this doesn't collide with anything else (though with the - // second-highest-bit-tagging this might not be needed). - id_tag_ = llvm::reverseBits((((id_index + 1) << 1) | 1) << 1); - } - auto GetCheckIRId() const -> int32_t { - return (llvm::reverseBits(id_tag_) >> 2) - 1; - } + : // Shift down by 1 to get out of the high bit to avoid using any + // negative ids, since they have special uses. Shift down by another 1 + // to free up the second highest bit for a marker to indicate whether + // the index is tagged (& needs to be untagged) or not. Add one to the + // index so it's not zero-based, to make it a bit less likely this + // doesn't collide with anything else (though with the + // second-highest-bit-tagging this might not be needed). + id_tag_(llvm::reverseBits((((id_index + 1) << 1) | 1) << 1)), + initial_reserved_ids_(initial_reserved_ids) {} + auto Apply(int32_t index) const -> int32_t { if (index < initial_reserved_ids_) { return index; } - // assert that id_tag_ doesn't have the second highest bit set + // TODO: Assert that id_tag_ doesn't have the second highest bit set. return index ^ id_tag_; } + + auto Remove(int32_t tagged_index) const -> int32_t { + if (!HasTag(tagged_index)) { + CARBON_DCHECK(tagged_index < initial_reserved_ids_, + "This untagged index is outside the initial reserved ids " + "and should have been tagged."); + return tagged_index; + } + auto index = tagged_index ^ id_tag_; + CARBON_DCHECK(index >= initial_reserved_ids_, + "When removing tagging bits, found an index that " + "shouldn't've been tagged in the first place."); + return index; + } + + // Gets the value unique to this IdTag instance that is added to indices in + // Apply, and removed in Remove. + auto GetContainerTag() const -> int32_t { + return (llvm::reverseBits(id_tag_) >> 2) - 1; + } + + // Returns whether `tagged_index` has an IdTag applied to it, from this IdTag + // instance or any other one. + static auto HasTag(int32_t tagged_index) -> bool { + return (llvm::reverseBits(2) & tagged_index) != 0; + } + + template + struct TagAndIndex { + TagT tag; + int32_t index; + }; + + template static auto DecomposeWithBestEffort(int32_t tagged_index) - -> std::pair { + -> TagAndIndex { if (tagged_index < 0) { - return {-1, tagged_index}; + // TODO: This should return TagT::None, but we need a fallback TagT other + // than `int32_t`. + return {TagT{-1}, tagged_index}; } - if ((llvm::reverseBits(2) & tagged_index) == 0) { - return {-1, tagged_index}; + if (!HasTag(tagged_index)) { + // TODO: This should return TagT::None, but we need a fallback TagT other + // than `int32_t`. + return {TagT{-1}, tagged_index}; } int length = 0; int location = 0; @@ -83,28 +117,20 @@ struct IdTag { } } if (length < 8) { - return {-1, tagged_index}; + // TODO: This should return TagT::None, but we need a fallback TagT other + // than `int32_t`. + return {TagT{-1}, tagged_index}; } auto index_mask = llvm::maskTrailingOnes(location); - auto ir_id = (llvm::reverseBits(tagged_index & ~index_mask) >> 2) - 1; + auto tag = (llvm::reverseBits(tagged_index & ~index_mask) >> 2) - 1; auto index = tagged_index & index_mask; - return {ir_id, index}; - } - auto Remove(int32_t tagged_index) const -> int32_t { - if ((llvm::reverseBits(2) & tagged_index) == 0) { - CARBON_DCHECK(tagged_index < initial_reserved_ids_, - "This untagged index is outside the initial reserved ids " - "and should have been tagged."); - return tagged_index; - } - auto index = tagged_index ^ id_tag_; - CARBON_DCHECK(index >= initial_reserved_ids_, - "When removing tagging bits, found an index that " - "shouldn't've been tagged in the first place."); - return index; + return {.tag = TagT{static_cast(tag)}, + .index = static_cast(index)}; } - int32_t id_tag_; - int32_t initial_reserved_ids_; + + private: + int32_t id_tag_ = 0; + int32_t initial_reserved_ids_ = std::numeric_limits::max(); }; // A simple wrapper for accumulating values, providing IDs to later retrieve the @@ -279,13 +305,16 @@ class ValueStore // Attempt to decompose id.index to include extra detail in the check here #ifndef NDEBUG if (index >= size_) { - auto [ir_id, decomposed_index] = IdTag::DecomposeWithBestEffort(id.index); + // TODO: Could we add InstId::TagType = CheckIRId and use that here to + // print the ChcekIRId properly? + auto [ir_id, decomposed_index] = + IdTag::DecomposeWithBestEffort(id.index); CARBON_DCHECK( index < size_, "Untagged index was outside of container range. Possibly tagged " - "index {0}. Best-effort decomposition: CheckIRId: {1}, index: {2}. " + "index {0}. Best-effort decomposition: Tag: {1}, index: {2}. " "The IdTag for this container is: {3}", - id.index, ir_id, decomposed_index, tag_.GetCheckIRId()); + id.index, ir_id, decomposed_index, tag_.GetContainerTag()); } #endif return index; diff --git a/toolchain/check/BUILD b/toolchain/check/BUILD index 1454203448656..caadbb41ada6c 100644 --- a/toolchain/check/BUILD +++ b/toolchain/check/BUILD @@ -180,6 +180,7 @@ cc_library( "//toolchain/parse:tree", "//toolchain/sem_ir:dump", "//toolchain/sem_ir:file", + "//toolchain/sem_ir:typed_insts", ], # Always link dump methods. alwayslink = 1, diff --git a/toolchain/check/context.h b/toolchain/check/context.h index 07e4ae427f57f..fa9ac2f1c5cd1 100644 --- a/toolchain/check/context.h +++ b/toolchain/check/context.h @@ -243,6 +243,7 @@ class Context { // Directly expose SemIR::File data accessors for brevity in calls. // -------------------------------------------------------------------------- + auto check_ir_id() -> SemIR::CheckIRId { return sem_ir().check_ir_id(); } auto identifiers() -> SharedValueStores::IdentifierStore& { return sem_ir().identifiers(); } diff --git a/toolchain/check/dump.cpp b/toolchain/check/dump.cpp index efc10643ae197..f1a9126fc106a 100644 --- a/toolchain/check/dump.cpp +++ b/toolchain/check/dump.cpp @@ -25,6 +25,7 @@ #include "toolchain/parse/tree.h" #include "toolchain/sem_ir/dump.h" #include "toolchain/sem_ir/file.h" +#include "toolchain/sem_ir/ids.h" namespace Carbon::Check { @@ -138,6 +139,17 @@ LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::TypeId type_id) return SemIR::Dump(context.sem_ir(), type_id); } +LLVM_DUMP_METHOD static auto MakeInstId(Context& context, int check_ir_id, + int id) -> SemIR::InstId { + if (SemIR::CheckIRId(check_ir_id) == context.check_ir_id()) { + return SemIR::MakeInstId(context.sem_ir(), check_ir_id, id); + } else { + const auto& import_ir = context.import_irs().Get( + context.check_ir_map().Get(SemIR::CheckIRId(check_ir_id))); + return SemIR::MakeInstId(*import_ir.sem_ir, check_ir_id, id); + } +} + } // namespace Carbon::Check #endif // NDEBUG diff --git a/toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon b/toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon index 83404615e486c..eb2b108c6b331 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon @@ -15,8 +15,8 @@ // CHECK:STDOUT: filename: builtins.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: {} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: diff --git a/toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon b/toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon index e7f0b19314afd..ea1cef4e878bf 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon @@ -33,10 +33,10 @@ fn G(x: Cpp.X) { // CHECK:STDOUT: filename: import.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: -// CHECK:STDOUT: import_ir_inst0: {ir_id: ir1, clang_source_loc_id: clang_source_loc0} +// CHECK:STDOUT: import_ir_inst0: {ir_id: import_ir1, clang_source_loc_id: clang_source_loc0} // CHECK:STDOUT: clang_decls: // CHECK:STDOUT: clang_decl_id0: {key: "", inst_id: ir0.inst16} // CHECK:STDOUT: clang_decl_id1: {key: "struct X {}", inst_id: ir0.inst18} diff --git a/toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon b/toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon index 6e822ca1628d9..3f47b6547f885 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon @@ -31,8 +31,8 @@ fn B() { // CHECK:STDOUT: filename: a.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: {} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: @@ -88,12 +88,12 @@ fn B() { // CHECK:STDOUT: filename: b.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir2: {decl_id: ir1.inst15, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir2: {decl_id: ir1.inst15, is_export: false} // CHECK:STDOUT: import_ir_insts: -// CHECK:STDOUT: import_ir_inst0: {ir_id: ir2, inst_id: ir0.inst15} -// CHECK:STDOUT: import_ir_inst1: {ir_id: ir2, inst_id: ir0.inst15} +// CHECK:STDOUT: import_ir_inst0: {ir_id: import_ir2, inst_id: ir0.inst15} +// CHECK:STDOUT: import_ir_inst1: {ir_id: import_ir2, inst_id: ir0.inst15} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: // CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope, has_error: false, extended_scopes: [], names: {name1: ir1.inst16, name0: ir1.inst17}} diff --git a/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon b/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon index df0a7f56995f2..ae6047a0aea84 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon @@ -31,8 +31,8 @@ fn B() { // CHECK:STDOUT: filename: a.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: {} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: @@ -107,12 +107,12 @@ fn B() { // CHECK:STDOUT: filename: b.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir2: {decl_id: ir1.inst15, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir2: {decl_id: ir1.inst15, is_export: false} // CHECK:STDOUT: import_ir_insts: -// CHECK:STDOUT: import_ir_inst0: {ir_id: ir2, inst_id: ir0.inst15} -// CHECK:STDOUT: import_ir_inst1: {ir_id: ir2, inst_id: ir0.inst15} +// CHECK:STDOUT: import_ir_inst0: {ir_id: import_ir2, inst_id: ir0.inst15} +// CHECK:STDOUT: import_ir_inst1: {ir_id: import_ir2, inst_id: ir0.inst15} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: // CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope, has_error: false, extended_scopes: [], names: {name1: ir1.inst16, name0: ir1.inst17}} diff --git a/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon b/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon index 1186f268a7a44..b3a87cf079481 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon @@ -21,201 +21,201 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: filename: one_file.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir2: {decl_id: ir0.inst15, is_export: false} -// CHECK:STDOUT: ir3: {decl_id: ir0.inst15, is_export: false} -// CHECK:STDOUT: ir4: {decl_id: ir0.inst15, is_export: false} -// CHECK:STDOUT: ir5: {decl_id: ir0.inst15, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir2: {decl_id: ir0.inst15, is_export: false} +// CHECK:STDOUT: import_ir3: {decl_id: ir0.inst15, is_export: false} +// CHECK:STDOUT: import_ir4: {decl_id: ir0.inst15, is_export: false} +// CHECK:STDOUT: import_ir5: {decl_id: ir0.inst15, is_export: false} // CHECK:STDOUT: import_ir_insts: -// CHECK:STDOUT: import_ir_inst0: {ir_id: ir4, inst_id: ir3.inst15} -// CHECK:STDOUT: import_ir_inst1: {ir_id: ir4, inst_id: ir3.inst15} -// CHECK:STDOUT: import_ir_inst2: {ir_id: ir4, inst_id: ir3.inst17} -// CHECK:STDOUT: import_ir_inst3: {ir_id: ir4, inst_id: ir3.inst45} -// CHECK:STDOUT: import_ir_inst4: {ir_id: ir4, inst_id: ir3.inst40} -// CHECK:STDOUT: import_ir_inst5: {ir_id: ir4, inst_id: ir3.inst40} -// CHECK:STDOUT: import_ir_inst6: {ir_id: ir4, inst_id: ir3.inst40} -// CHECK:STDOUT: import_ir_inst7: {ir_id: ir4, inst_id: ir3.inst34} -// CHECK:STDOUT: import_ir_inst8: {ir_id: ir4, inst_id: ir3.inst35} -// CHECK:STDOUT: import_ir_inst9: {ir_id: ir4, inst_id: ir3.inst28} -// CHECK:STDOUT: import_ir_inst10: {ir_id: ir4, inst_id: ir3.inst30} -// CHECK:STDOUT: import_ir_inst11: {ir_id: ir4, inst_id: ir3.inst17} -// CHECK:STDOUT: import_ir_inst12: {ir_id: ir4, inst_id: ir3.inst21} -// CHECK:STDOUT: import_ir_inst13: {ir_id: ir4, inst_id: ir3.inst24} -// CHECK:STDOUT: import_ir_inst14: {ir_id: ir4, inst_id: ir3.inst29} -// CHECK:STDOUT: import_ir_inst15: {ir_id: ir4, inst_id: ir3.inst97} -// CHECK:STDOUT: import_ir_inst16: {ir_id: ir4, inst_id: ir3.inst95} -// CHECK:STDOUT: import_ir_inst17: {ir_id: ir4, inst_id: ir3.inst84} -// CHECK:STDOUT: import_ir_inst18: {ir_id: ir4, inst_id: ir3.inst80} -// CHECK:STDOUT: import_ir_inst19: {ir_id: ir4, inst_id: ir3.inst90} -// CHECK:STDOUT: import_ir_inst20: {ir_id: ir4, inst_id: ir3.inst93} -// CHECK:STDOUT: import_ir_inst21: {ir_id: ir4, inst_id: ir3.inst116} -// CHECK:STDOUT: import_ir_inst22: {ir_id: ir4, inst_id: ir3.inst96} -// CHECK:STDOUT: import_ir_inst23: {ir_id: ir4, inst_id: ir3.inst82} -// CHECK:STDOUT: import_ir_inst24: {ir_id: ir4, inst_id: ir3.inst88} -// CHECK:STDOUT: import_ir_inst25: {ir_id: ir4, inst_id: ir3.inst92} -// CHECK:STDOUT: import_ir_inst26: {ir_id: ir4, inst_id: ir3.inst99} -// CHECK:STDOUT: import_ir_inst27: {ir_id: ir4, inst_id: ir3.inst116} -// CHECK:STDOUT: import_ir_inst28: {ir_id: ir4, inst_id: ir3.inst111} -// CHECK:STDOUT: import_ir_inst29: {ir_id: ir4, inst_id: ir3.inst112} -// CHECK:STDOUT: import_ir_inst30: {ir_id: ir4, inst_id: ir3.inst107} -// CHECK:STDOUT: import_ir_inst31: {ir_id: ir4, inst_id: ir3.inst109} -// CHECK:STDOUT: import_ir_inst32: {ir_id: ir4, inst_id: ir3.inst80} -// CHECK:STDOUT: import_ir_inst33: {ir_id: ir4, inst_id: ir3.inst119} -// CHECK:STDOUT: import_ir_inst34: {ir_id: ir4, inst_id: ir3.inst120} -// CHECK:STDOUT: import_ir_inst35: {ir_id: ir4, inst_id: ir3.inst102} -// CHECK:STDOUT: import_ir_inst36: {ir_id: ir4, inst_id: ir3.inst103} -// CHECK:STDOUT: import_ir_inst37: {ir_id: ir4, inst_id: ir3.inst104} -// CHECK:STDOUT: import_ir_inst38: {ir_id: ir4, inst_id: ir3.inst108} -// CHECK:STDOUT: import_ir_inst39: {ir_id: ir4, inst_id: ir3.inst124} -// CHECK:STDOUT: import_ir_inst40: {ir_id: ir4, inst_id: ir3.inst132} -// CHECK:STDOUT: import_ir_inst41: {ir_id: ir4, inst_id: ir3.inst139} -// CHECK:STDOUT: import_ir_inst42: {ir_id: ir4, inst_id: ir3.inst143} -// CHECK:STDOUT: import_ir_inst43: {ir_id: ir4, inst_id: ir3.inst144} -// CHECK:STDOUT: import_ir_inst44: {ir_id: ir4, inst_id: ir3.inst149} -// CHECK:STDOUT: import_ir_inst45: {ir_id: ir4, inst_id: ir3.inst170} -// CHECK:STDOUT: import_ir_inst46: {ir_id: ir4, inst_id: ir3.inst168} -// CHECK:STDOUT: import_ir_inst47: {ir_id: ir4, inst_id: ir3.inst166} -// CHECK:STDOUT: import_ir_inst48: {ir_id: ir4, inst_id: ir3.inst167} -// CHECK:STDOUT: import_ir_inst49: {ir_id: ir4, inst_id: ir3.inst194} -// CHECK:STDOUT: import_ir_inst50: {ir_id: ir4, inst_id: ir3.inst192} -// CHECK:STDOUT: import_ir_inst51: {ir_id: ir4, inst_id: ir3.inst190} -// CHECK:STDOUT: import_ir_inst52: {ir_id: ir4, inst_id: ir3.inst191} -// CHECK:STDOUT: import_ir_inst53: {ir_id: ir4, inst_id: ir3.inst218} -// CHECK:STDOUT: import_ir_inst54: {ir_id: ir4, inst_id: ir3.inst216} -// CHECK:STDOUT: import_ir_inst55: {ir_id: ir4, inst_id: ir3.inst214} -// CHECK:STDOUT: import_ir_inst56: {ir_id: ir4, inst_id: ir3.inst215} -// CHECK:STDOUT: import_ir_inst57: {ir_id: ir4, inst_id: ir3.inst242} -// CHECK:STDOUT: import_ir_inst58: {ir_id: ir4, inst_id: ir3.inst240} -// CHECK:STDOUT: import_ir_inst59: {ir_id: ir4, inst_id: ir3.inst238} -// CHECK:STDOUT: import_ir_inst60: {ir_id: ir4, inst_id: ir3.inst239} -// CHECK:STDOUT: import_ir_inst61: {ir_id: ir4, inst_id: ir3.inst271} -// CHECK:STDOUT: import_ir_inst62: {ir_id: ir4, inst_id: ir3.inst269} -// CHECK:STDOUT: import_ir_inst63: {ir_id: ir4, inst_id: ir3.inst263} -// CHECK:STDOUT: import_ir_inst64: {ir_id: ir4, inst_id: ir3.inst260} -// CHECK:STDOUT: import_ir_inst65: {ir_id: ir4, inst_id: ir3.inst265} -// CHECK:STDOUT: import_ir_inst66: {ir_id: ir4, inst_id: ir3.inst268} -// CHECK:STDOUT: import_ir_inst67: {ir_id: ir4, inst_id: ir3.inst288} -// CHECK:STDOUT: import_ir_inst68: {ir_id: ir4, inst_id: ir3.inst270} -// CHECK:STDOUT: import_ir_inst69: {ir_id: ir4, inst_id: ir3.inst262} -// CHECK:STDOUT: import_ir_inst70: {ir_id: ir4, inst_id: ir3.inst267} -// CHECK:STDOUT: import_ir_inst71: {ir_id: ir4, inst_id: ir3.inst273} -// CHECK:STDOUT: import_ir_inst72: {ir_id: ir4, inst_id: ir3.inst288} -// CHECK:STDOUT: import_ir_inst73: {ir_id: ir4, inst_id: ir3.inst283} -// CHECK:STDOUT: import_ir_inst74: {ir_id: ir4, inst_id: ir3.inst284} -// CHECK:STDOUT: import_ir_inst75: {ir_id: ir4, inst_id: ir3.inst279} -// CHECK:STDOUT: import_ir_inst76: {ir_id: ir4, inst_id: ir3.inst281} -// CHECK:STDOUT: import_ir_inst77: {ir_id: ir4, inst_id: ir3.inst260} -// CHECK:STDOUT: import_ir_inst78: {ir_id: ir4, inst_id: ir3.inst291} -// CHECK:STDOUT: import_ir_inst79: {ir_id: ir4, inst_id: ir3.inst292} -// CHECK:STDOUT: import_ir_inst80: {ir_id: ir4, inst_id: ir3.inst295} -// CHECK:STDOUT: import_ir_inst81: {ir_id: ir4, inst_id: ir3.inst275} -// CHECK:STDOUT: import_ir_inst82: {ir_id: ir4, inst_id: ir3.inst276} -// CHECK:STDOUT: import_ir_inst83: {ir_id: ir4, inst_id: ir3.inst280} -// CHECK:STDOUT: import_ir_inst84: {ir_id: ir4, inst_id: ir3.inst301} -// CHECK:STDOUT: import_ir_inst85: {ir_id: ir4, inst_id: ir3.inst299} -// CHECK:STDOUT: import_ir_inst86: {ir_id: ir4, inst_id: inst(TypeType)} -// CHECK:STDOUT: import_ir_inst87: {ir_id: ir4, inst_id: ir3.inst298} -// CHECK:STDOUT: import_ir_inst88: {ir_id: ir4, inst_id: ir3.inst322} -// CHECK:STDOUT: import_ir_inst89: {ir_id: ir4, inst_id: ir3.inst320} -// CHECK:STDOUT: import_ir_inst90: {ir_id: ir4, inst_id: ir3.inst318} -// CHECK:STDOUT: import_ir_inst91: {ir_id: ir4, inst_id: ir3.inst319} -// CHECK:STDOUT: import_ir_inst92: {ir_id: ir4, inst_id: ir3.inst370} -// CHECK:STDOUT: import_ir_inst93: {ir_id: ir4, inst_id: ir3.inst368} -// CHECK:STDOUT: import_ir_inst94: {ir_id: ir4, inst_id: ir3.inst349} -// CHECK:STDOUT: import_ir_inst95: {ir_id: ir4, inst_id: ir3.inst343} -// CHECK:STDOUT: import_ir_inst96: {ir_id: ir4, inst_id: ir3.inst341} -// CHECK:STDOUT: import_ir_inst97: {ir_id: ir4, inst_id: ir3.inst346} -// CHECK:STDOUT: import_ir_inst98: {ir_id: ir4, inst_id: ir3.inst363} -// CHECK:STDOUT: import_ir_inst99: {ir_id: ir4, inst_id: ir3.inst365} -// CHECK:STDOUT: import_ir_inst100: {ir_id: ir4, inst_id: ir3.inst392} -// CHECK:STDOUT: import_ir_inst101: {ir_id: ir4, inst_id: ir3.inst369} -// CHECK:STDOUT: import_ir_inst102: {ir_id: ir4, inst_id: ir3.inst342} -// CHECK:STDOUT: import_ir_inst103: {ir_id: ir4, inst_id: ir3.inst348} -// CHECK:STDOUT: import_ir_inst104: {ir_id: ir4, inst_id: ir3.inst356} -// CHECK:STDOUT: import_ir_inst105: {ir_id: ir4, inst_id: ir3.inst360} -// CHECK:STDOUT: import_ir_inst106: {ir_id: ir4, inst_id: ir3.inst364} -// CHECK:STDOUT: import_ir_inst107: {ir_id: ir4, inst_id: ir3.inst372} -// CHECK:STDOUT: import_ir_inst108: {ir_id: ir4, inst_id: ir3.inst392} -// CHECK:STDOUT: import_ir_inst109: {ir_id: ir4, inst_id: ir3.inst387} -// CHECK:STDOUT: import_ir_inst110: {ir_id: ir4, inst_id: ir3.inst388} -// CHECK:STDOUT: import_ir_inst111: {ir_id: ir4, inst_id: ir3.inst383} -// CHECK:STDOUT: import_ir_inst112: {ir_id: ir4, inst_id: ir3.inst385} -// CHECK:STDOUT: import_ir_inst113: {ir_id: ir4, inst_id: ir3.inst341} -// CHECK:STDOUT: import_ir_inst114: {ir_id: ir4, inst_id: ir3.inst346} -// CHECK:STDOUT: import_ir_inst115: {ir_id: ir4, inst_id: ir3.inst395} -// CHECK:STDOUT: import_ir_inst116: {ir_id: ir4, inst_id: ir3.inst396} -// CHECK:STDOUT: import_ir_inst117: {ir_id: ir4, inst_id: ir3.inst376} -// CHECK:STDOUT: import_ir_inst118: {ir_id: ir4, inst_id: ir3.inst377} -// CHECK:STDOUT: import_ir_inst119: {ir_id: ir4, inst_id: ir3.inst378} -// CHECK:STDOUT: import_ir_inst120: {ir_id: ir4, inst_id: ir3.inst379} -// CHECK:STDOUT: import_ir_inst121: {ir_id: ir4, inst_id: ir3.inst380} -// CHECK:STDOUT: import_ir_inst122: {ir_id: ir4, inst_id: ir3.inst384} -// CHECK:STDOUT: import_ir_inst123: {ir_id: ir4, inst_id: ir3.inst401} -// CHECK:STDOUT: import_ir_inst124: {ir_id: ir4, inst_id: ir3.inst409} -// CHECK:STDOUT: import_ir_inst125: {ir_id: ir4, inst_id: ir3.inst413} -// CHECK:STDOUT: import_ir_inst126: {ir_id: ir4, inst_id: ir3.inst415} -// CHECK:STDOUT: import_ir_inst127: {ir_id: ir4, inst_id: ir3.inst416} -// CHECK:STDOUT: import_ir_inst128: {ir_id: ir4, inst_id: ir3.inst419} -// CHECK:STDOUT: import_ir_inst129: {ir_id: ir4, inst_id: ir3.inst431} -// CHECK:STDOUT: import_ir_inst130: {ir_id: ir4, inst_id: ir3.inst436} -// CHECK:STDOUT: import_ir_inst131: {ir_id: ir4, inst_id: ir3.inst440} -// CHECK:STDOUT: import_ir_inst132: {ir_id: ir4, inst_id: ir3.inst441} -// CHECK:STDOUT: import_ir_inst133: {ir_id: ir4, inst_id: ir3.inst446} -// CHECK:STDOUT: import_ir_inst134: {ir_id: ir4, inst_id: ir3.inst503} -// CHECK:STDOUT: import_ir_inst135: {ir_id: ir4, inst_id: ir3.inst501} -// CHECK:STDOUT: import_ir_inst136: {ir_id: ir4, inst_id: ir3.inst477} -// CHECK:STDOUT: import_ir_inst137: {ir_id: ir4, inst_id: ir3.inst471} -// CHECK:STDOUT: import_ir_inst138: {ir_id: ir4, inst_id: ir3.inst466} -// CHECK:STDOUT: import_ir_inst139: {ir_id: ir4, inst_id: ir3.inst464} -// CHECK:STDOUT: import_ir_inst140: {ir_id: ir4, inst_id: ir3.inst469} -// CHECK:STDOUT: import_ir_inst141: {ir_id: ir4, inst_id: ir3.inst474} -// CHECK:STDOUT: import_ir_inst142: {ir_id: ir4, inst_id: ir3.inst495} -// CHECK:STDOUT: import_ir_inst143: {ir_id: ir4, inst_id: ir3.inst497} -// CHECK:STDOUT: import_ir_inst144: {ir_id: ir4, inst_id: ir3.inst528} -// CHECK:STDOUT: import_ir_inst145: {ir_id: ir4, inst_id: ir3.inst502} -// CHECK:STDOUT: import_ir_inst146: {ir_id: ir4, inst_id: ir3.inst465} -// CHECK:STDOUT: import_ir_inst147: {ir_id: ir4, inst_id: ir3.inst470} -// CHECK:STDOUT: import_ir_inst148: {ir_id: ir4, inst_id: ir3.inst476} -// CHECK:STDOUT: import_ir_inst149: {ir_id: ir4, inst_id: ir3.inst485} -// CHECK:STDOUT: import_ir_inst150: {ir_id: ir4, inst_id: ir3.inst488} -// CHECK:STDOUT: import_ir_inst151: {ir_id: ir4, inst_id: ir3.inst492} -// CHECK:STDOUT: import_ir_inst152: {ir_id: ir4, inst_id: ir3.inst496} -// CHECK:STDOUT: import_ir_inst153: {ir_id: ir4, inst_id: ir3.inst505} -// CHECK:STDOUT: import_ir_inst154: {ir_id: ir4, inst_id: ir3.inst528} -// CHECK:STDOUT: import_ir_inst155: {ir_id: ir4, inst_id: ir3.inst523} -// CHECK:STDOUT: import_ir_inst156: {ir_id: ir4, inst_id: ir3.inst524} -// CHECK:STDOUT: import_ir_inst157: {ir_id: ir4, inst_id: ir3.inst519} -// CHECK:STDOUT: import_ir_inst158: {ir_id: ir4, inst_id: ir3.inst521} -// CHECK:STDOUT: import_ir_inst159: {ir_id: ir4, inst_id: ir3.inst464} -// CHECK:STDOUT: import_ir_inst160: {ir_id: ir4, inst_id: ir3.inst469} -// CHECK:STDOUT: import_ir_inst161: {ir_id: ir4, inst_id: ir3.inst474} -// CHECK:STDOUT: import_ir_inst162: {ir_id: ir4, inst_id: ir3.inst531} -// CHECK:STDOUT: import_ir_inst163: {ir_id: ir4, inst_id: ir3.inst532} -// CHECK:STDOUT: import_ir_inst164: {ir_id: ir4, inst_id: ir3.inst510} -// CHECK:STDOUT: import_ir_inst165: {ir_id: ir4, inst_id: ir3.inst511} -// CHECK:STDOUT: import_ir_inst166: {ir_id: ir4, inst_id: ir3.inst512} -// CHECK:STDOUT: import_ir_inst167: {ir_id: ir4, inst_id: ir3.inst513} -// CHECK:STDOUT: import_ir_inst168: {ir_id: ir4, inst_id: ir3.inst514} -// CHECK:STDOUT: import_ir_inst169: {ir_id: ir4, inst_id: ir3.inst515} -// CHECK:STDOUT: import_ir_inst170: {ir_id: ir4, inst_id: ir3.inst516} -// CHECK:STDOUT: import_ir_inst171: {ir_id: ir4, inst_id: ir3.inst520} -// CHECK:STDOUT: import_ir_inst172: {ir_id: ir4, inst_id: ir3.inst537} -// CHECK:STDOUT: import_ir_inst173: {ir_id: ir4, inst_id: ir3.inst544} -// CHECK:STDOUT: import_ir_inst174: {ir_id: ir4, inst_id: ir3.inst548} -// CHECK:STDOUT: import_ir_inst175: {ir_id: ir4, inst_id: ir3.inst550} -// CHECK:STDOUT: import_ir_inst176: {ir_id: ir4, inst_id: ir3.inst551} -// CHECK:STDOUT: import_ir_inst177: {ir_id: ir4, inst_id: ir3.inst554} -// CHECK:STDOUT: import_ir_inst178: {ir_id: ir4, inst_id: ir3.inst564} -// CHECK:STDOUT: import_ir_inst179: {ir_id: ir4, inst_id: ir3.inst568} -// CHECK:STDOUT: import_ir_inst180: {ir_id: ir4, inst_id: ir3.inst570} -// CHECK:STDOUT: import_ir_inst181: {ir_id: ir4, inst_id: ir3.inst571} -// CHECK:STDOUT: import_ir_inst182: {ir_id: ir4, inst_id: ir3.inst574} -// CHECK:STDOUT: import_ir_inst183: {ir_id: ir4, inst_id: ir3.inst586} -// CHECK:STDOUT: import_ir_inst184: {ir_id: ir4, inst_id: ir3.inst591} -// CHECK:STDOUT: import_ir_inst185: {ir_id: ir4, inst_id: ir3.inst595} -// CHECK:STDOUT: import_ir_inst186: {ir_id: ir4, inst_id: ir3.inst596} -// CHECK:STDOUT: import_ir_inst187: {ir_id: ir4, inst_id: ir3.inst601} +// CHECK:STDOUT: import_ir_inst0: {ir_id: import_ir4, inst_id: ir3.inst15} +// CHECK:STDOUT: import_ir_inst1: {ir_id: import_ir4, inst_id: ir3.inst15} +// CHECK:STDOUT: import_ir_inst2: {ir_id: import_ir4, inst_id: ir3.inst17} +// CHECK:STDOUT: import_ir_inst3: {ir_id: import_ir4, inst_id: ir3.inst45} +// CHECK:STDOUT: import_ir_inst4: {ir_id: import_ir4, inst_id: ir3.inst40} +// CHECK:STDOUT: import_ir_inst5: {ir_id: import_ir4, inst_id: ir3.inst40} +// CHECK:STDOUT: import_ir_inst6: {ir_id: import_ir4, inst_id: ir3.inst40} +// CHECK:STDOUT: import_ir_inst7: {ir_id: import_ir4, inst_id: ir3.inst34} +// CHECK:STDOUT: import_ir_inst8: {ir_id: import_ir4, inst_id: ir3.inst35} +// CHECK:STDOUT: import_ir_inst9: {ir_id: import_ir4, inst_id: ir3.inst28} +// CHECK:STDOUT: import_ir_inst10: {ir_id: import_ir4, inst_id: ir3.inst30} +// CHECK:STDOUT: import_ir_inst11: {ir_id: import_ir4, inst_id: ir3.inst17} +// CHECK:STDOUT: import_ir_inst12: {ir_id: import_ir4, inst_id: ir3.inst21} +// CHECK:STDOUT: import_ir_inst13: {ir_id: import_ir4, inst_id: ir3.inst24} +// CHECK:STDOUT: import_ir_inst14: {ir_id: import_ir4, inst_id: ir3.inst29} +// CHECK:STDOUT: import_ir_inst15: {ir_id: import_ir4, inst_id: ir3.inst97} +// CHECK:STDOUT: import_ir_inst16: {ir_id: import_ir4, inst_id: ir3.inst95} +// CHECK:STDOUT: import_ir_inst17: {ir_id: import_ir4, inst_id: ir3.inst84} +// CHECK:STDOUT: import_ir_inst18: {ir_id: import_ir4, inst_id: ir3.inst80} +// CHECK:STDOUT: import_ir_inst19: {ir_id: import_ir4, inst_id: ir3.inst90} +// CHECK:STDOUT: import_ir_inst20: {ir_id: import_ir4, inst_id: ir3.inst93} +// CHECK:STDOUT: import_ir_inst21: {ir_id: import_ir4, inst_id: ir3.inst116} +// CHECK:STDOUT: import_ir_inst22: {ir_id: import_ir4, inst_id: ir3.inst96} +// CHECK:STDOUT: import_ir_inst23: {ir_id: import_ir4, inst_id: ir3.inst82} +// CHECK:STDOUT: import_ir_inst24: {ir_id: import_ir4, inst_id: ir3.inst88} +// CHECK:STDOUT: import_ir_inst25: {ir_id: import_ir4, inst_id: ir3.inst92} +// CHECK:STDOUT: import_ir_inst26: {ir_id: import_ir4, inst_id: ir3.inst99} +// CHECK:STDOUT: import_ir_inst27: {ir_id: import_ir4, inst_id: ir3.inst116} +// CHECK:STDOUT: import_ir_inst28: {ir_id: import_ir4, inst_id: ir3.inst111} +// CHECK:STDOUT: import_ir_inst29: {ir_id: import_ir4, inst_id: ir3.inst112} +// CHECK:STDOUT: import_ir_inst30: {ir_id: import_ir4, inst_id: ir3.inst107} +// CHECK:STDOUT: import_ir_inst31: {ir_id: import_ir4, inst_id: ir3.inst109} +// CHECK:STDOUT: import_ir_inst32: {ir_id: import_ir4, inst_id: ir3.inst80} +// CHECK:STDOUT: import_ir_inst33: {ir_id: import_ir4, inst_id: ir3.inst119} +// CHECK:STDOUT: import_ir_inst34: {ir_id: import_ir4, inst_id: ir3.inst120} +// CHECK:STDOUT: import_ir_inst35: {ir_id: import_ir4, inst_id: ir3.inst102} +// CHECK:STDOUT: import_ir_inst36: {ir_id: import_ir4, inst_id: ir3.inst103} +// CHECK:STDOUT: import_ir_inst37: {ir_id: import_ir4, inst_id: ir3.inst104} +// CHECK:STDOUT: import_ir_inst38: {ir_id: import_ir4, inst_id: ir3.inst108} +// CHECK:STDOUT: import_ir_inst39: {ir_id: import_ir4, inst_id: ir3.inst124} +// CHECK:STDOUT: import_ir_inst40: {ir_id: import_ir4, inst_id: ir3.inst132} +// CHECK:STDOUT: import_ir_inst41: {ir_id: import_ir4, inst_id: ir3.inst139} +// CHECK:STDOUT: import_ir_inst42: {ir_id: import_ir4, inst_id: ir3.inst143} +// CHECK:STDOUT: import_ir_inst43: {ir_id: import_ir4, inst_id: ir3.inst144} +// CHECK:STDOUT: import_ir_inst44: {ir_id: import_ir4, inst_id: ir3.inst149} +// CHECK:STDOUT: import_ir_inst45: {ir_id: import_ir4, inst_id: ir3.inst170} +// CHECK:STDOUT: import_ir_inst46: {ir_id: import_ir4, inst_id: ir3.inst168} +// CHECK:STDOUT: import_ir_inst47: {ir_id: import_ir4, inst_id: ir3.inst166} +// CHECK:STDOUT: import_ir_inst48: {ir_id: import_ir4, inst_id: ir3.inst167} +// CHECK:STDOUT: import_ir_inst49: {ir_id: import_ir4, inst_id: ir3.inst194} +// CHECK:STDOUT: import_ir_inst50: {ir_id: import_ir4, inst_id: ir3.inst192} +// CHECK:STDOUT: import_ir_inst51: {ir_id: import_ir4, inst_id: ir3.inst190} +// CHECK:STDOUT: import_ir_inst52: {ir_id: import_ir4, inst_id: ir3.inst191} +// CHECK:STDOUT: import_ir_inst53: {ir_id: import_ir4, inst_id: ir3.inst218} +// CHECK:STDOUT: import_ir_inst54: {ir_id: import_ir4, inst_id: ir3.inst216} +// CHECK:STDOUT: import_ir_inst55: {ir_id: import_ir4, inst_id: ir3.inst214} +// CHECK:STDOUT: import_ir_inst56: {ir_id: import_ir4, inst_id: ir3.inst215} +// CHECK:STDOUT: import_ir_inst57: {ir_id: import_ir4, inst_id: ir3.inst242} +// CHECK:STDOUT: import_ir_inst58: {ir_id: import_ir4, inst_id: ir3.inst240} +// CHECK:STDOUT: import_ir_inst59: {ir_id: import_ir4, inst_id: ir3.inst238} +// CHECK:STDOUT: import_ir_inst60: {ir_id: import_ir4, inst_id: ir3.inst239} +// CHECK:STDOUT: import_ir_inst61: {ir_id: import_ir4, inst_id: ir3.inst271} +// CHECK:STDOUT: import_ir_inst62: {ir_id: import_ir4, inst_id: ir3.inst269} +// CHECK:STDOUT: import_ir_inst63: {ir_id: import_ir4, inst_id: ir3.inst263} +// CHECK:STDOUT: import_ir_inst64: {ir_id: import_ir4, inst_id: ir3.inst260} +// CHECK:STDOUT: import_ir_inst65: {ir_id: import_ir4, inst_id: ir3.inst265} +// CHECK:STDOUT: import_ir_inst66: {ir_id: import_ir4, inst_id: ir3.inst268} +// CHECK:STDOUT: import_ir_inst67: {ir_id: import_ir4, inst_id: ir3.inst288} +// CHECK:STDOUT: import_ir_inst68: {ir_id: import_ir4, inst_id: ir3.inst270} +// CHECK:STDOUT: import_ir_inst69: {ir_id: import_ir4, inst_id: ir3.inst262} +// CHECK:STDOUT: import_ir_inst70: {ir_id: import_ir4, inst_id: ir3.inst267} +// CHECK:STDOUT: import_ir_inst71: {ir_id: import_ir4, inst_id: ir3.inst273} +// CHECK:STDOUT: import_ir_inst72: {ir_id: import_ir4, inst_id: ir3.inst288} +// CHECK:STDOUT: import_ir_inst73: {ir_id: import_ir4, inst_id: ir3.inst283} +// CHECK:STDOUT: import_ir_inst74: {ir_id: import_ir4, inst_id: ir3.inst284} +// CHECK:STDOUT: import_ir_inst75: {ir_id: import_ir4, inst_id: ir3.inst279} +// CHECK:STDOUT: import_ir_inst76: {ir_id: import_ir4, inst_id: ir3.inst281} +// CHECK:STDOUT: import_ir_inst77: {ir_id: import_ir4, inst_id: ir3.inst260} +// CHECK:STDOUT: import_ir_inst78: {ir_id: import_ir4, inst_id: ir3.inst291} +// CHECK:STDOUT: import_ir_inst79: {ir_id: import_ir4, inst_id: ir3.inst292} +// CHECK:STDOUT: import_ir_inst80: {ir_id: import_ir4, inst_id: ir3.inst295} +// CHECK:STDOUT: import_ir_inst81: {ir_id: import_ir4, inst_id: ir3.inst275} +// CHECK:STDOUT: import_ir_inst82: {ir_id: import_ir4, inst_id: ir3.inst276} +// CHECK:STDOUT: import_ir_inst83: {ir_id: import_ir4, inst_id: ir3.inst280} +// CHECK:STDOUT: import_ir_inst84: {ir_id: import_ir4, inst_id: ir3.inst301} +// CHECK:STDOUT: import_ir_inst85: {ir_id: import_ir4, inst_id: ir3.inst299} +// CHECK:STDOUT: import_ir_inst86: {ir_id: import_ir4, inst_id: inst(TypeType)} +// CHECK:STDOUT: import_ir_inst87: {ir_id: import_ir4, inst_id: ir3.inst298} +// CHECK:STDOUT: import_ir_inst88: {ir_id: import_ir4, inst_id: ir3.inst322} +// CHECK:STDOUT: import_ir_inst89: {ir_id: import_ir4, inst_id: ir3.inst320} +// CHECK:STDOUT: import_ir_inst90: {ir_id: import_ir4, inst_id: ir3.inst318} +// CHECK:STDOUT: import_ir_inst91: {ir_id: import_ir4, inst_id: ir3.inst319} +// CHECK:STDOUT: import_ir_inst92: {ir_id: import_ir4, inst_id: ir3.inst370} +// CHECK:STDOUT: import_ir_inst93: {ir_id: import_ir4, inst_id: ir3.inst368} +// CHECK:STDOUT: import_ir_inst94: {ir_id: import_ir4, inst_id: ir3.inst349} +// CHECK:STDOUT: import_ir_inst95: {ir_id: import_ir4, inst_id: ir3.inst343} +// CHECK:STDOUT: import_ir_inst96: {ir_id: import_ir4, inst_id: ir3.inst341} +// CHECK:STDOUT: import_ir_inst97: {ir_id: import_ir4, inst_id: ir3.inst346} +// CHECK:STDOUT: import_ir_inst98: {ir_id: import_ir4, inst_id: ir3.inst363} +// CHECK:STDOUT: import_ir_inst99: {ir_id: import_ir4, inst_id: ir3.inst365} +// CHECK:STDOUT: import_ir_inst100: {ir_id: import_ir4, inst_id: ir3.inst392} +// CHECK:STDOUT: import_ir_inst101: {ir_id: import_ir4, inst_id: ir3.inst369} +// CHECK:STDOUT: import_ir_inst102: {ir_id: import_ir4, inst_id: ir3.inst342} +// CHECK:STDOUT: import_ir_inst103: {ir_id: import_ir4, inst_id: ir3.inst348} +// CHECK:STDOUT: import_ir_inst104: {ir_id: import_ir4, inst_id: ir3.inst356} +// CHECK:STDOUT: import_ir_inst105: {ir_id: import_ir4, inst_id: ir3.inst360} +// CHECK:STDOUT: import_ir_inst106: {ir_id: import_ir4, inst_id: ir3.inst364} +// CHECK:STDOUT: import_ir_inst107: {ir_id: import_ir4, inst_id: ir3.inst372} +// CHECK:STDOUT: import_ir_inst108: {ir_id: import_ir4, inst_id: ir3.inst392} +// CHECK:STDOUT: import_ir_inst109: {ir_id: import_ir4, inst_id: ir3.inst387} +// CHECK:STDOUT: import_ir_inst110: {ir_id: import_ir4, inst_id: ir3.inst388} +// CHECK:STDOUT: import_ir_inst111: {ir_id: import_ir4, inst_id: ir3.inst383} +// CHECK:STDOUT: import_ir_inst112: {ir_id: import_ir4, inst_id: ir3.inst385} +// CHECK:STDOUT: import_ir_inst113: {ir_id: import_ir4, inst_id: ir3.inst341} +// CHECK:STDOUT: import_ir_inst114: {ir_id: import_ir4, inst_id: ir3.inst346} +// CHECK:STDOUT: import_ir_inst115: {ir_id: import_ir4, inst_id: ir3.inst395} +// CHECK:STDOUT: import_ir_inst116: {ir_id: import_ir4, inst_id: ir3.inst396} +// CHECK:STDOUT: import_ir_inst117: {ir_id: import_ir4, inst_id: ir3.inst376} +// CHECK:STDOUT: import_ir_inst118: {ir_id: import_ir4, inst_id: ir3.inst377} +// CHECK:STDOUT: import_ir_inst119: {ir_id: import_ir4, inst_id: ir3.inst378} +// CHECK:STDOUT: import_ir_inst120: {ir_id: import_ir4, inst_id: ir3.inst379} +// CHECK:STDOUT: import_ir_inst121: {ir_id: import_ir4, inst_id: ir3.inst380} +// CHECK:STDOUT: import_ir_inst122: {ir_id: import_ir4, inst_id: ir3.inst384} +// CHECK:STDOUT: import_ir_inst123: {ir_id: import_ir4, inst_id: ir3.inst401} +// CHECK:STDOUT: import_ir_inst124: {ir_id: import_ir4, inst_id: ir3.inst409} +// CHECK:STDOUT: import_ir_inst125: {ir_id: import_ir4, inst_id: ir3.inst413} +// CHECK:STDOUT: import_ir_inst126: {ir_id: import_ir4, inst_id: ir3.inst415} +// CHECK:STDOUT: import_ir_inst127: {ir_id: import_ir4, inst_id: ir3.inst416} +// CHECK:STDOUT: import_ir_inst128: {ir_id: import_ir4, inst_id: ir3.inst419} +// CHECK:STDOUT: import_ir_inst129: {ir_id: import_ir4, inst_id: ir3.inst431} +// CHECK:STDOUT: import_ir_inst130: {ir_id: import_ir4, inst_id: ir3.inst436} +// CHECK:STDOUT: import_ir_inst131: {ir_id: import_ir4, inst_id: ir3.inst440} +// CHECK:STDOUT: import_ir_inst132: {ir_id: import_ir4, inst_id: ir3.inst441} +// CHECK:STDOUT: import_ir_inst133: {ir_id: import_ir4, inst_id: ir3.inst446} +// CHECK:STDOUT: import_ir_inst134: {ir_id: import_ir4, inst_id: ir3.inst503} +// CHECK:STDOUT: import_ir_inst135: {ir_id: import_ir4, inst_id: ir3.inst501} +// CHECK:STDOUT: import_ir_inst136: {ir_id: import_ir4, inst_id: ir3.inst477} +// CHECK:STDOUT: import_ir_inst137: {ir_id: import_ir4, inst_id: ir3.inst471} +// CHECK:STDOUT: import_ir_inst138: {ir_id: import_ir4, inst_id: ir3.inst466} +// CHECK:STDOUT: import_ir_inst139: {ir_id: import_ir4, inst_id: ir3.inst464} +// CHECK:STDOUT: import_ir_inst140: {ir_id: import_ir4, inst_id: ir3.inst469} +// CHECK:STDOUT: import_ir_inst141: {ir_id: import_ir4, inst_id: ir3.inst474} +// CHECK:STDOUT: import_ir_inst142: {ir_id: import_ir4, inst_id: ir3.inst495} +// CHECK:STDOUT: import_ir_inst143: {ir_id: import_ir4, inst_id: ir3.inst497} +// CHECK:STDOUT: import_ir_inst144: {ir_id: import_ir4, inst_id: ir3.inst528} +// CHECK:STDOUT: import_ir_inst145: {ir_id: import_ir4, inst_id: ir3.inst502} +// CHECK:STDOUT: import_ir_inst146: {ir_id: import_ir4, inst_id: ir3.inst465} +// CHECK:STDOUT: import_ir_inst147: {ir_id: import_ir4, inst_id: ir3.inst470} +// CHECK:STDOUT: import_ir_inst148: {ir_id: import_ir4, inst_id: ir3.inst476} +// CHECK:STDOUT: import_ir_inst149: {ir_id: import_ir4, inst_id: ir3.inst485} +// CHECK:STDOUT: import_ir_inst150: {ir_id: import_ir4, inst_id: ir3.inst488} +// CHECK:STDOUT: import_ir_inst151: {ir_id: import_ir4, inst_id: ir3.inst492} +// CHECK:STDOUT: import_ir_inst152: {ir_id: import_ir4, inst_id: ir3.inst496} +// CHECK:STDOUT: import_ir_inst153: {ir_id: import_ir4, inst_id: ir3.inst505} +// CHECK:STDOUT: import_ir_inst154: {ir_id: import_ir4, inst_id: ir3.inst528} +// CHECK:STDOUT: import_ir_inst155: {ir_id: import_ir4, inst_id: ir3.inst523} +// CHECK:STDOUT: import_ir_inst156: {ir_id: import_ir4, inst_id: ir3.inst524} +// CHECK:STDOUT: import_ir_inst157: {ir_id: import_ir4, inst_id: ir3.inst519} +// CHECK:STDOUT: import_ir_inst158: {ir_id: import_ir4, inst_id: ir3.inst521} +// CHECK:STDOUT: import_ir_inst159: {ir_id: import_ir4, inst_id: ir3.inst464} +// CHECK:STDOUT: import_ir_inst160: {ir_id: import_ir4, inst_id: ir3.inst469} +// CHECK:STDOUT: import_ir_inst161: {ir_id: import_ir4, inst_id: ir3.inst474} +// CHECK:STDOUT: import_ir_inst162: {ir_id: import_ir4, inst_id: ir3.inst531} +// CHECK:STDOUT: import_ir_inst163: {ir_id: import_ir4, inst_id: ir3.inst532} +// CHECK:STDOUT: import_ir_inst164: {ir_id: import_ir4, inst_id: ir3.inst510} +// CHECK:STDOUT: import_ir_inst165: {ir_id: import_ir4, inst_id: ir3.inst511} +// CHECK:STDOUT: import_ir_inst166: {ir_id: import_ir4, inst_id: ir3.inst512} +// CHECK:STDOUT: import_ir_inst167: {ir_id: import_ir4, inst_id: ir3.inst513} +// CHECK:STDOUT: import_ir_inst168: {ir_id: import_ir4, inst_id: ir3.inst514} +// CHECK:STDOUT: import_ir_inst169: {ir_id: import_ir4, inst_id: ir3.inst515} +// CHECK:STDOUT: import_ir_inst170: {ir_id: import_ir4, inst_id: ir3.inst516} +// CHECK:STDOUT: import_ir_inst171: {ir_id: import_ir4, inst_id: ir3.inst520} +// CHECK:STDOUT: import_ir_inst172: {ir_id: import_ir4, inst_id: ir3.inst537} +// CHECK:STDOUT: import_ir_inst173: {ir_id: import_ir4, inst_id: ir3.inst544} +// CHECK:STDOUT: import_ir_inst174: {ir_id: import_ir4, inst_id: ir3.inst548} +// CHECK:STDOUT: import_ir_inst175: {ir_id: import_ir4, inst_id: ir3.inst550} +// CHECK:STDOUT: import_ir_inst176: {ir_id: import_ir4, inst_id: ir3.inst551} +// CHECK:STDOUT: import_ir_inst177: {ir_id: import_ir4, inst_id: ir3.inst554} +// CHECK:STDOUT: import_ir_inst178: {ir_id: import_ir4, inst_id: ir3.inst564} +// CHECK:STDOUT: import_ir_inst179: {ir_id: import_ir4, inst_id: ir3.inst568} +// CHECK:STDOUT: import_ir_inst180: {ir_id: import_ir4, inst_id: ir3.inst570} +// CHECK:STDOUT: import_ir_inst181: {ir_id: import_ir4, inst_id: ir3.inst571} +// CHECK:STDOUT: import_ir_inst182: {ir_id: import_ir4, inst_id: ir3.inst574} +// CHECK:STDOUT: import_ir_inst183: {ir_id: import_ir4, inst_id: ir3.inst586} +// CHECK:STDOUT: import_ir_inst184: {ir_id: import_ir4, inst_id: ir3.inst591} +// CHECK:STDOUT: import_ir_inst185: {ir_id: import_ir4, inst_id: ir3.inst595} +// CHECK:STDOUT: import_ir_inst186: {ir_id: import_ir4, inst_id: ir3.inst596} +// CHECK:STDOUT: import_ir_inst187: {ir_id: import_ir4, inst_id: ir3.inst601} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: // CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope, has_error: false, extended_scopes: [], names: {name(Core): ir0.inst16, name0: ir0.inst53}} diff --git a/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon b/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon index 3eb94e4ec7f98..b75b7843bb530 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon @@ -21,8 +21,8 @@ fn Foo(n: ()) -> ((), ()) { // CHECK:STDOUT: filename: one_file_with_textual_ir.carbon // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: {} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: diff --git a/toolchain/driver/testdata/stdin.carbon b/toolchain/driver/testdata/stdin.carbon index 62dbcdfeb907e..e85510560a1dc 100644 --- a/toolchain/driver/testdata/stdin.carbon +++ b/toolchain/driver/testdata/stdin.carbon @@ -27,8 +27,8 @@ // CHECK:STDOUT: filename: '-' // CHECK:STDOUT: sem_ir: // CHECK:STDOUT: import_irs: -// CHECK:STDOUT: ir0: {decl_id: inst, is_export: false} -// CHECK:STDOUT: ir1: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir0: {decl_id: inst, is_export: false} +// CHECK:STDOUT: import_ir1: {decl_id: inst, is_export: false} // CHECK:STDOUT: import_ir_insts: {} // CHECK:STDOUT: clang_decls: {} // CHECK:STDOUT: name_scopes: diff --git a/toolchain/sem_ir/dump.cpp b/toolchain/sem_ir/dump.cpp index f687c2f1a2568..5cb6c9446bf97 100644 --- a/toolchain/sem_ir/dump.cpp +++ b/toolchain/sem_ir/dump.cpp @@ -452,7 +452,16 @@ LLVM_DUMP_METHOD static auto MakeImplId(int id) -> ImplId { return ImplId(id); } LLVM_DUMP_METHOD static auto MakeInstBlockId(int id) -> InstBlockId { return InstBlockId(id); } -LLVM_DUMP_METHOD static auto MakeInstId(int id) -> InstId { return InstId(id); } +LLVM_DUMP_METHOD auto MakeInstId(const SemIR::File& file, int check_ir_id, + int id) -> InstId { + if (file.check_ir_id() != SemIR::CheckIRId(check_ir_id)) { + llvm::errs() + << "SemIR::MakeInstId given a CheckIRId for the wrong SemIR::File. " + "Maybe you want to dump from a Check::Context.\n"; + return SemIR::InstId::None; + } + return InstId(file.insts().GetIdTag().Apply(id)); +} LLVM_DUMP_METHOD static auto MakeInterfaceId(int id) -> InterfaceId { return InterfaceId(id); } diff --git a/toolchain/sem_ir/dump.h b/toolchain/sem_ir/dump.h index e90bb72c74d25..8a65dede7a870 100644 --- a/toolchain/sem_ir/dump.h +++ b/toolchain/sem_ir/dump.h @@ -42,6 +42,8 @@ auto Dump(const File& file, StructTypeFieldsId struct_type_fields_id) -> std::string; auto Dump(const File& file, TypeId type_id) -> std::string; +auto MakeInstId(const SemIR::File& file, int check_ir_id, int id) -> InstId; + } // namespace Carbon::SemIR #endif // NDEBUG diff --git a/toolchain/sem_ir/ids.cpp b/toolchain/sem_ir/ids.cpp index 2b81d0c5112b1..100e5baa95e5a 100644 --- a/toolchain/sem_ir/ids.cpp +++ b/toolchain/sem_ir/ids.cpp @@ -16,11 +16,12 @@ auto InstId::Print(llvm::raw_ostream& out) const -> void { if (IsSingletonInstId(*this)) { out << Label << "(" << SingletonInstKinds[index] << ")"; } else { - auto [ir_id, simple_index] = IdTag::DecomposeWithBestEffort(index); - if (ir_id == -1) { + auto [check_ir_id, untagged_index] = + IdTag::DecomposeWithBestEffort(index); + if (!check_ir_id.has_value()) { IdBase::Print(out); } else { - out << "ir" << ir_id << ".inst" << simple_index; + out << check_ir_id << "." << Label << untagged_index; } } } diff --git a/toolchain/sem_ir/ids.h b/toolchain/sem_ir/ids.h index 99bdb5ceac247..e7c197ff561d7 100644 --- a/toolchain/sem_ir/ids.h +++ b/toolchain/sem_ir/ids.h @@ -288,7 +288,7 @@ struct FunctionId : public IdBase { // The ID of an IR within the set of all IRs being evaluated in the current // check execution. struct CheckIRId : public IdBase { - static constexpr llvm::StringLiteral Label = "check_ir"; + static constexpr llvm::StringLiteral Label = "ir"; // Used when referring to the imported C++. static const CheckIRId Cpp; @@ -435,7 +435,7 @@ struct ImportCppId : public IdBase { // The ID of an `ImportIR` within the set of imported IRs, both direct and // indirect. struct ImportIRId : public IdBase { - static constexpr llvm::StringLiteral Label = "ir"; + static constexpr llvm::StringLiteral Label = "import_ir"; // The implicit `api` import, for an `impl` file. A null entry is added if // there is none, as in an `api`, in which case this ID should not show up in diff --git a/toolchain/sem_ir/inst.h b/toolchain/sem_ir/inst.h index c387a81ca44e3..3172ff6c43770 100644 --- a/toolchain/sem_ir/inst.h +++ b/toolchain/sem_ir/inst.h @@ -438,6 +438,9 @@ struct LocIdAndInst { }; // Provides a ValueStore wrapper for an API specific to instructions. +// +// InstIds in this store are tagged by an IdTag using the File's CheckIRId as +// the tag value. class InstStore { public: using IdType = InstId;