Skip to content

Sema: missed simplifications of OPVs #22419

@jacobly0

Description

@jacobly0
pub const panic = @import("std").debug.no_panic;
fn ptrAddr(ptr: [*]const void, index: usize) *const void {
    return &ptr[index];
}
fn ptrAccess(ptr: [*]const void, index: usize) void {
    return ptr[index];
}
fn sliceAddr(slice: []const void, index: usize) *const void {
    return &slice[index];
}
fn sliceAccess(slice: []const void, index: usize) void {
    return slice[index];
}
fn unionInit(val: u8) union(enum) { val: u8 } {
    return .{ .val = val };
}
fn unionAccess(val: union(enum(u1)) { only }) void {
    return val.only;
}
fn errUnion(eu: error{Oops}!void) void {
    if (eu) |_| {} else |_| {}
}
comptime {
    _ = .{ &ptrAddr, &ptrAccess, &sliceAddr, &sliceAccess, &unionInit, &unionAccess, &errUnion };
}
$ zig build-obj repro.zig --verbose-air
# Begin Function AIR: repro.ptrAddr:
# Total AIR+Liveness bytes: 283B
# AIR Instructions:         11 (99B)
# AIR Extra Data:           18 (72B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      0 (0B)
# Liveness special table:   0 (0B)
  %0 = arg([*]const void, "ptr")
  %1 = arg(usize, "index")
  %2!= save_err_return_trace_index()
  %3 = alloc(*[*]const void)
  %4!= store_safe(%3, %0!)
  %5 = bitcast(*const [*]const void, %3!)
  %6!= dbg_stmt(2:16)
  %7 = load([*]const void, %5!)
  %8 = ptr_elem_ptr(*const void, %7!, %1!)
  %9!= dbg_stmt(2:5)
  %10!= ret_safe(%8!)
# End Function AIR: repro.ptrAddr

# Begin Function AIR: repro.ptrAccess:
# Total AIR+Liveness bytes: 223B
# AIR Instructions:         7 (63B)
# AIR Extra Data:           12 (48B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      0 (0B)
# Liveness special table:   0 (0B)
  %0 = arg([*]const void, "ptr")
  %1 = arg(usize, "index")
  %2!= save_err_return_trace_index()
  %3!= dbg_stmt(2:15)
  %4 = ptr_elem_val(%0!, %1!)
  %5!= dbg_stmt(2:5)
  %6!= ret_safe(%4!)
# End Function AIR: repro.ptrAccess

# Begin Function AIR: repro.sliceAddr:
# Total AIR+Liveness bytes: 458B
# AIR Instructions:         18 (162B)
# AIR Extra Data:           33 (132B)
# Liveness tomb_bits:       16B
# Liveness Extra Data:      7 (28B)
# Liveness special table:   2 (16B)
  %0 = arg([]const void, "slice")
  %1 = arg(usize, "index")
  %2!= save_err_return_trace_index()
  %3 = alloc(*[]const void)
  %4!= store_safe(%3, %0!)
  %5 = bitcast(*const []const void, %3!)
  %6!= dbg_stmt(2:18)
  %7 = load([]const void, %5!)
  %8 = slice_len(usize, %7)
  %9 = cmp_lt(%1, %8)
  %12!= block(void, {
    %13!= cond_br(%9!, likely {
      %8!
      %14!= br(%12, @Air.Inst.Ref.void_value)
    }, cold {
      %7!
      %10!= call(<fn (usize, usize) noreturn, (function 'outOfBounds')>, [%1!, %8!])
      %11!= unreach()
    })
  } %8! %9!)
  %15 = slice_elem_ptr(*const void, %7!, %1!)
  %16!= dbg_stmt(2:5)
  %17!= ret_safe(%15!)
# End Function AIR: repro.sliceAddr

# Begin Function AIR: repro.sliceAccess:
# Total AIR+Liveness bytes: 390B
# AIR Instructions:         14 (126B)
# AIR Extra Data:           27 (108B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      7 (28B)
# Liveness special table:   2 (16B)
  %0 = arg([]const void, "slice")
  %1 = arg(usize, "index")
  %2!= save_err_return_trace_index()
  %3!= dbg_stmt(2:17)
  %4 = slice_len(usize, %0)
  %5 = cmp_lt(%1, %4)
  %8!= block(void, {
    %9!= cond_br(%5!, likely {
      %4!
      %10!= br(%8, @Air.Inst.Ref.void_value)
    }, cold {
      %0!
      %6!= call(<fn (usize, usize) noreturn, (function 'outOfBounds')>, [%1!, %4!])
      %7!= unreach()
    })
  } %5! %4!)
  %11 = slice_elem_val(%0!, %1!)
  %12!= dbg_stmt(2:5)
  %13!= ret_safe(%11!)
# End Function AIR: repro.sliceAccess

# Begin Function AIR: repro.unionInit:
# Total AIR+Liveness bytes: 241B
# AIR Instructions:         9 (81B)
# AIR Extra Data:           12 (48B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      0 (0B)
# Liveness special table:   0 (0B)
  %0 = arg(u8, "val")
  %1!= save_err_return_trace_index()
  %2!= dbg_stmt(2:5)
  %3 = ret_ptr(*repro.unionInit__union_197)
  %4 = struct_field_ptr_index_0(*u8, %3)
  %5!= store_safe(%4!, %0!)
  %6!= set_union_tag(%3, <@typeInfo(repro.unionInit__union_197).@"union".tag_type.?, .val>)
  %7!= dbg_stmt(2:5)
  %8!= ret_load(%3!)
# End Function AIR: repro.unionInit

# Begin Function AIR: repro.unionAccess:
# Total AIR+Liveness bytes: 210B
# AIR Instructions:         6 (54B)
# AIR Extra Data:           11 (44B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      0 (0B)
# Liveness special table:   0 (0B)
  %0 = arg(repro.unionAccess__union_203, "val")
  %1!= save_err_return_trace_index()
  %2!= dbg_stmt(2:15)
  %3 = struct_field_val(%0!, 0)
  %4!= dbg_stmt(2:5)
  %5!= ret_safe(%3!)
# End Function AIR: repro.unionAccess

# Begin Function AIR: repro.errUnion:
# Total AIR+Liveness bytes: 328B
# AIR Instructions:         12 (108B)
# AIR Extra Data:           19 (76B)
# Liveness tomb_bits:       8B
# Liveness Extra Data:      4 (16B)
# Liveness special table:   2 (16B)
  %0 = arg(error{Oops}!void, "eu")
  %1!= save_err_return_trace_index()
  %2!= dbg_stmt(2:9)
  %3!= block(void, {
    %4 = is_non_err(%0!)
    %10!= cond_br(%4!, poi {
      %5!= unwrap_errunion_payload(void, %0)
      %6!= br(%3, @Air.Inst.Ref.void_value)
    }, poi {
      %7!= unwrap_errunion_err(error{Oops}, %0)
      %8!= unwrap_errunion_err(error{Oops}, %0)
      %9!= br(%3, @Air.Inst.Ref.void_value)
    })
  } %0!)
  %11!= ret_safe(@Air.Inst.Ref.void_value)
# End Function AIR: repro.errUnion

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions