Skip to content

Sema: allows comparison between optional vectors #22630

@jacobly0

Description

@jacobly0
fn cmp(lhs: ?@Vector(1, u8), rhs: ?@Vector(1, u8)) bool {
    return lhs == rhs;
}
comptime {
    _ = &cmp;
}
$ release-zig build-obj -fllvm repro.zig
error: Invalid phi record (Producer: 'zig 0.14.0' Reader: 'LLVM 19.1.7+libcxx')
$ release-zig build-obj -fno-llvm -target x86_64-linux repro.zig
Segmentation fault (core dumped)
$ release-zig build-exe -fno-llvm -target wasm32-wasi -fno-entry repro.zig && wasm-validate repro.wasm
repro.wasm:0000060: error: type mismatch in i32.ne, expected [i32, i32] but got [v128, v128]
$ debug-zig build-obj -fllvm repro.zig
thread 350785 panic: reached unreachable code
lib/std/debug.zig:518:14: 0x186375d in assert (zig)
    if (!ok) unreachable; // assertion failure
             ^
src/codegen/llvm/Builder.zig:5951:36: 0x2ed6851 in finish (zig)
            for (vals) |val| assert(val.typeOfWip(wip) == extra.data.type);
                                   ^
src/codegen/llvm.zig:6062:27: 0x2eb1783 in cmp (zig)
                phi.finish(
                          ^
src/codegen/llvm.zig:5949:24: 0x2eaffef in airCmp (zig)
        return self.cmp(fast, op, operand_ty, lhs, rhs);
                       ^
src/codegen/llvm.zig:5125:44: 0x2a43f22 in genBody (zig)
                .cmp_eq  => try self.airCmp(inst, .eq, .normal),
                                           ^
src/codegen/llvm.zig:1758:19: 0x2a40360 in updateFunc (zig)
        fg.genBody(air.getMainBody(), .poi) catch |err| switch (err) {
                  ^
src/link/Elf.zig:2369:70: 0x2e8a4e5 in updateFunc (zig)
    if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(pt, func_index, air, liveness);
                                                                     ^
src/link.zig:736:82: 0x2a4bcbd in updateFunc (zig)
                return @as(*tag.Type(), @fieldParentPtr("base", base)).updateFunc(pt, func_index, air, liveness);
                                                                                 ^
src/Zcu/PerThread.zig:1721:22: 0x25c57b3 in linkerUpdateFunc (zig)
        lf.updateFunc(pt, func_index, air, liveness) catch |err| switch (err) {
                     ^
src/link.zig:1577:36: 0x21fad35 in doTask (zig)
                pt.linkerUpdateFunc(func.func, func.air) catch |err| switch (err) {
                                   ^
src/Compilation.zig:3997:20: 0x1e4e744 in dispatchCodegenTask (zig)
        link.doTask(comp, tid, link_task);
                   ^
src/Compilation.zig:3892:37: 0x1c0d547 in processOneJob (zig)
            comp.dispatchCodegenTask(tid, .{ .codegen_func = func });
                                    ^
src/Compilation.zig:3842:30: 0x1a858dd in performAllTheWorkInner (zig)
            try processOneJob(@intFromEnum(Zcu.PerThread.Id.main), comp, job);
                             ^
src/Compilation.zig:3641:36: 0x1910b3c in performAllTheWork (zig)
    try comp.performAllTheWorkInner(main_progress_node);
                                   ^
src/Compilation.zig:2256:31: 0x1909074 in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
src/main.zig:4482:20: 0x19462f7 in updateModule (zig)
    try comp.update(prog_node);
                   ^
src/main.zig:3672:21: 0x19b3229 in buildOutputType (zig)
        updateModule(comp, color, root_prog_node) catch |err| switch (err) {
                    ^
src/main.zig:279:31: 0x1865c05 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .{ .build = .Obj });
                              ^
src/main.zig:214:20: 0x1862cba in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
lib/std/start.zig:656:37: 0x18627a9 in main (zig)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x7fab9582b3ed in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7fab9582b3ed` was not available, trace may be incomplete

Aborted (core dumped)
$ debug-zig build-obj -fno-llvm -target x86_64-linux repro.zig
thread 351477 panic: reached unreachable code
src/arch/x86_64/CodeGen.zig:33317:49: 0x3f9655a in airCmp (zig)
                                        else => unreachable,
                                                ^
src/arch/x86_64/CodeGen.zig:21136:117: 0x3c6cf20 in genBody (zig)
                if (cg.intInfo(scalar_ty) == null and cg.floatBits(scalar_ty) == null) break :fallback try cg.airCmp(inst, switch (air_tag) {
                                                                                                                    ^
src/arch/x86_64/CodeGen.zig:2229:25: 0x38de8c7 in gen (zig)
        try self.genBody(self.air.getMainBody());
                        ^
src/arch/x86_64/CodeGen.zig:980:17: 0x35f5274 in generate (zig)
    function.gen() catch |err| switch (err) {
                ^
src/codegen.zig:72:51: 0x32dbbc7 in generateFunction (zig)
            return importBackend(backend).generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output);
                                                  ^
src/link/Elf/ZigObject.zig:1440:33: 0x32dc2e2 in updateFunc (zig)
    try codegen.generateFunction(
                                ^
src/link/Elf.zig:2370:44: 0x2e8a567 in updateFunc (zig)
    return self.zigObjectPtr().?.updateFunc(self, pt, func_index, air, liveness);
                                           ^
src/link.zig:736:82: 0x2a4bcbd in updateFunc (zig)
                return @as(*tag.Type(), @fieldParentPtr("base", base)).updateFunc(pt, func_index, air, liveness);
                                                                                 ^
src/Zcu/PerThread.zig:1721:22: 0x25c57b3 in linkerUpdateFunc (zig)
        lf.updateFunc(pt, func_index, air, liveness) catch |err| switch (err) {
                     ^
src/link.zig:1577:36: 0x21fad35 in doTask (zig)
                pt.linkerUpdateFunc(func.func, func.air) catch |err| switch (err) {
                                   ^
src/link.zig:1383:34: 0x1e24cf2 in flushTaskQueue (zig)
        for (tasks) |task| doTask(comp, tid, task);
                                 ^
lib/std/Thread/Pool.zig:182:50: 0x1e24f09 in runFn (zig)
            @call(.auto, func, .{id.?} ++ closure.arguments);
                                                 ^
lib/std/Thread/Pool.zig:295:32: 0x1dd4db4 in worker (zig)
            run_node.data.runFn(&run_node.data, id);
                               ^
lib/std/Thread.zig:488:13: 0x1bbd08a in callFn__anon_175550 (zig)
            @call(.auto, f, args);
            ^
lib/std/Thread.zig:757:30: 0x1a44ce4 in entryFn (zig)
                return callFn(f, args_ptr.*);
                             ^
???:?:?: 0x7fea38f47508 in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7fea38f47508` was not available, trace may be incomplete

Aborted (core dumped)

$ x86_64-rewrite-zig build-obj -fno-llvm -target x86_64-linux repro.zig
repro.zig:1:1: error: failed to select cmp_eq ?@Vector(1, u8) |(none)| xmm0 |(none)| xmm1
fn cmp(x: ?@Vector(1, u8), y: ?@Vector(1, u8)) bool {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is a frontend bug for not rejecting the code unless and until the operation is defined in the language spec at which point it would become a backend bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviorfrontendTokenization, parsing, AstGen, Sema, and Liveness.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions