sysgpu: SPIR-V code gen fails on else ifs #1148

Closed
opened 2024-01-17 21:22:29 +00:00 by flut2 · 0 comments
flut2 commented 2024-01-17 21:22:29 +00:00 (Migrated from github.com)

Stack trace:

src/shader/codegen/spirv.zig:964:54: in emitStatement
            const var_id = spv.decl_map.get(inst_idx).?.id;
                                                     ^
src/shader/codegen/spirv.zig:1025:30: in emitBlock
        try spv.emitStatement(section, statement);
                             ^
src/shader/codegen/spirv.zig:1050:26: in emitIf
        try spv.emitBlock(section, body);
                         ^
src/shader/codegen/spirv.zig:1061:47: in emitIf
            .@"if" => |else_if| try spv.emitIf(section, else_if),
                                              ^
src/shader/codegen/spirv.zig:1006:41: in emitStatement
        .@"if" => |@"if"| try spv.emitIf(section, @"if"),
                                        ^
src/shader/codegen/spirv.zig:1025:30: in emitBlock
        try spv.emitStatement(section, statement);
                             ^
src/shader/codegen/spirv.zig:464:26: in emitFn
        try spv.emitBlock(&section, body);
                         ^
src/shader/codegen/spirv.zig:132:35: in gen
                _ = try spv.emitFn(inst_idx);
                                  ^
src/shader/CodeGen.zig:55:44: in generate
            const spirv_data = try genSpirv(allocator, air, .{});
                                           ^
src/vulkan.zig:1862:49: in initAir
        const code = try shader.CodeGen.generate(allocator, air, .spirv, .{ .emit_source_file = "" }, null, null);
                                                ^
src/vulkan.zig:646:36: in createShaderModuleAir
        return ShaderModule.initAir(device, air);
                                   ^
src/main.zig:547:63: in createDrawPipeline
            const shader_module = device.createShaderModuleAir(air) catch @panic("api error");

Repro:

@fragment fn fs_main() -> @location(0) vec4<f32> {
    var dummy = false;
    if dummy {
        let dummy_var_1 = 0.0;
        return vec4<f32>(dummy_var_1, 1, 1, 1);
    } else if !dummy {
        let dummy_var_2 = 0.0;
        return vec4<f32>(dummy_var_2, 1, 1, 1);
    }
    return vec4<f32>(0.0, 1, 1, 1);
}
Stack trace: ``` src/shader/codegen/spirv.zig:964:54: in emitStatement const var_id = spv.decl_map.get(inst_idx).?.id; ^ src/shader/codegen/spirv.zig:1025:30: in emitBlock try spv.emitStatement(section, statement); ^ src/shader/codegen/spirv.zig:1050:26: in emitIf try spv.emitBlock(section, body); ^ src/shader/codegen/spirv.zig:1061:47: in emitIf .@"if" => |else_if| try spv.emitIf(section, else_if), ^ src/shader/codegen/spirv.zig:1006:41: in emitStatement .@"if" => |@"if"| try spv.emitIf(section, @"if"), ^ src/shader/codegen/spirv.zig:1025:30: in emitBlock try spv.emitStatement(section, statement); ^ src/shader/codegen/spirv.zig:464:26: in emitFn try spv.emitBlock(&section, body); ^ src/shader/codegen/spirv.zig:132:35: in gen _ = try spv.emitFn(inst_idx); ^ src/shader/CodeGen.zig:55:44: in generate const spirv_data = try genSpirv(allocator, air, .{}); ^ src/vulkan.zig:1862:49: in initAir const code = try shader.CodeGen.generate(allocator, air, .spirv, .{ .emit_source_file = "" }, null, null); ^ src/vulkan.zig:646:36: in createShaderModuleAir return ShaderModule.initAir(device, air); ^ src/main.zig:547:63: in createDrawPipeline const shader_module = device.createShaderModuleAir(air) catch @panic("api error"); ``` Repro: ``` @fragment fn fs_main() -> @location(0) vec4<f32> { var dummy = false; if dummy { let dummy_var_1 = 0.0; return vec4<f32>(dummy_var_1, 1, 1, 1); } else if !dummy { let dummy_var_2 = 0.0; return vec4<f32>(dummy_var_2, 1, 1, 1); } return vec4<f32>(0.0, 1, 1, 1); } ```
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
hexops/mach#1148
No description provided.