commit bc4e7fbb8b4aff28528838ea917a4a285960a61a (tree)
parent 0ad43fcc7c641cb968dd85768496df1390895ff2
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date: Sun, 22 Feb 2026 15:08:16 +0000
sema: handle multi-instruction return type bodies and F16T; enable 2 corpus tests
Resolve multi-instruction return type bodies in zirFunc by running
analyzeBodyInner before saving function state, matching upstream
Sema.zig's resolveGenericBody pattern. Add F16T as a known
type-returning function (returns u16 on wasm32-wasi test target).
Enables truncxfhf2.zig and floatunsihf.zig corpus tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat:
2 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/stage0/sema.c b/stage0/sema.c
@@ -3064,7 +3064,8 @@ static AirInstRef zirCall(
const char* cn
= (const char*)&sema->code.string_bytes[callee_name_idx];
if (strcmp(cn, "Int") == 0 || strcmp(cn, "Log2Int") == 0
- || strcmp(cn, "PowerOfTwoSignificandZ") == 0) {
+ || strcmp(cn, "PowerOfTwoSignificandZ") == 0
+ || strcmp(cn, "F16T") == 0) {
AirInstData dead;
memset(&dead, 0, sizeof(dead));
(void)semaAddInstAsIndex(sema, AIR_INST_BLOCK, dead);
@@ -3135,6 +3136,8 @@ static AirInstRef zirCall(
ik.data.int_type.signedness = signedness;
ur_result = ipIntern(sema->ip, ik);
}
+ } else if (strcmp(cn, "F16T") == 0) {
+ ur_result = IP_INDEX_U16_TYPE;
}
return AIR_REF_FROM_IP(ur_result);
}
@@ -3174,7 +3177,8 @@ static AirInstRef zirCall(
|| strcmp(type_fn_name, "Log2Int") == 0
|| strcmp(type_fn_name,
"PowerOfTwoSignificandZ")
- == 0)) {
+ == 0
+ || strcmp(type_fn_name, "F16T") == 0)) {
returns_type = true;
} else {
if (is_cross_module) {
@@ -3469,6 +3473,10 @@ static AirInstRef zirCall(
}
}
}
+ } else if (type_fn_name && strcmp(type_fn_name, "F16T") == 0) {
+ // F16T(T): returns u16 on wasm32-wasi (test target).
+ // Ported from lib/compiler_rt/common.zig F16T.
+ result_type = IP_INDEX_U16_TYPE;
}
if (is_cross_module) {
@@ -4048,7 +4056,6 @@ static AirInstRef zirCall(
// The function body is analyzed in a fresh AIR context; the resulting
// per-function Air is appended to sema->func_air_list.
static void zirFunc(Sema* sema, SemaBlock* block, uint32_t inst) {
- (void)block;
uint32_t payload_index = sema->code.inst_datas[inst].pl_node.payload_index;
ZirInstTag tag = sema->code.inst_tags[inst];
bool is_fancy = (tag == ZIR_INST_FUNC_FANCY);
@@ -4128,6 +4135,21 @@ static void zirFunc(Sema* sema, SemaBlock* block, uint32_t inst) {
if (!has_body || !is_exported || !sema->func_air_list)
return;
+ // Resolve multi-instruction return type body BEFORE saving state,
+ // so that the parent scope's inst_map and AIR arrays are available.
+ // Ported from src/Sema.zig zirFunc: resolveGenericBody(block,
+ // ret_ty_body).
+ TypeIndex pre_resolved_ret_ty = TYPE_NONE;
+ if (ret_ty_body_len > 2) {
+ const uint32_t* ret_ty_body = &sema->code.extra[ret_ty_ref_pos];
+ (void)analyzeBodyInner(sema, block, ret_ty_body, ret_ty_body_len);
+ ZirInstRef operand
+ = sema->code.inst_datas[sema->comptime_break_inst]
+ .break_data.operand;
+ AirInstRef ret_air = resolveInst(sema, operand);
+ pre_resolved_ret_ty = AIR_REF_TO_IP(ret_air);
+ }
+
// --- Save the current AIR state ---
uint8_t* saved_tags = sema->air_inst_tags;
AirInstData* saved_datas = sema->air_inst_datas;
@@ -4193,8 +4215,8 @@ static void zirFunc(Sema* sema, SemaBlock* block, uint32_t inst) {
sema->fn_ret_ty = IP_INDEX_VOID_TYPE;
}
} else {
- // Multi-instruction return type body — not yet supported.
- sema->fn_ret_ty = IP_INDEX_VOID_TYPE;
+ // Multi-instruction return type body resolved before state save.
+ sema->fn_ret_ty = pre_resolved_ret_ty;
}
// --- Set up block for function body ---
diff --git a/stage0/stages_test.zig b/stage0/stages_test.zig
@@ -144,8 +144,8 @@ const corpus_files = .{
"../lib/compiler_rt/floatundihf.zig", // 353
"../lib/compiler_rt/floatundixf.zig", // 353
"../lib/compiler_rt/floatunsixf.zig", // 353
- //"../lib/compiler_rt/truncxfhf2.zig", // 356
- //"../lib/compiler_rt/floatunsihf.zig", // 357
+ "../lib/compiler_rt/truncxfhf2.zig", // 356
+ "../lib/compiler_rt/floatunsihf.zig", // 357
//"../lib/compiler_rt/trunctfhf2.zig", // 359
//"../lib/compiler_rt/extendsfxf2.zig", // 360
//"../lib/compiler/aro/backend.zig", // 362