Skip to content

Commit b483def

Browse files
committed
Legalize: implement scalarization of binary operations
1 parent c1e9ef9 commit b483def

39 files changed

+1384
-835
lines changed

lib/std/zig/AstGen.zig

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11194,6 +11194,7 @@ fn rvalueInner(
1119411194
const as_void = @as(u64, @intFromEnum(Zir.Inst.Ref.void_type)) << 32;
1119511195
const as_comptime_int = @as(u64, @intFromEnum(Zir.Inst.Ref.comptime_int_type)) << 32;
1119611196
const as_usize = @as(u64, @intFromEnum(Zir.Inst.Ref.usize_type)) << 32;
11197+
const as_u1 = @as(u64, @intFromEnum(Zir.Inst.Ref.u1_type)) << 32;
1119711198
const as_u8 = @as(u64, @intFromEnum(Zir.Inst.Ref.u8_type)) << 32;
1119811199
switch ((@as(u64, @intFromEnum(ty_inst)) << 32) | @as(u64, @intFromEnum(result))) {
1119911200
as_ty | @intFromEnum(Zir.Inst.Ref.u1_type),
@@ -11237,10 +11238,11 @@ fn rvalueInner(
1123711238
as_ty | @intFromEnum(Zir.Inst.Ref.null_type),
1123811239
as_ty | @intFromEnum(Zir.Inst.Ref.undefined_type),
1123911240
as_ty | @intFromEnum(Zir.Inst.Ref.enum_literal_type),
11241+
as_ty | @intFromEnum(Zir.Inst.Ref.ptr_usize_type),
11242+
as_ty | @intFromEnum(Zir.Inst.Ref.ptr_const_comptime_int_type),
1124011243
as_ty | @intFromEnum(Zir.Inst.Ref.manyptr_u8_type),
1124111244
as_ty | @intFromEnum(Zir.Inst.Ref.manyptr_const_u8_type),
1124211245
as_ty | @intFromEnum(Zir.Inst.Ref.manyptr_const_u8_sentinel_0_type),
11243-
as_ty | @intFromEnum(Zir.Inst.Ref.single_const_pointer_to_comptime_int_type),
1124411246
as_ty | @intFromEnum(Zir.Inst.Ref.slice_const_u8_type),
1124511247
as_ty | @intFromEnum(Zir.Inst.Ref.slice_const_u8_sentinel_0_type),
1124611248
as_ty | @intFromEnum(Zir.Inst.Ref.anyerror_void_error_union_type),
@@ -11249,27 +11251,45 @@ fn rvalueInner(
1124911251
as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero),
1125011252
as_comptime_int | @intFromEnum(Zir.Inst.Ref.one),
1125111253
as_comptime_int | @intFromEnum(Zir.Inst.Ref.negative_one),
11254+
as_usize | @intFromEnum(Zir.Inst.Ref.undef_usize),
1125211255
as_usize | @intFromEnum(Zir.Inst.Ref.zero_usize),
1125311256
as_usize | @intFromEnum(Zir.Inst.Ref.one_usize),
11257+
as_u1 | @intFromEnum(Zir.Inst.Ref.undef_u1),
11258+
as_u1 | @intFromEnum(Zir.Inst.Ref.zero_u1),
11259+
as_u1 | @intFromEnum(Zir.Inst.Ref.one_u1),
1125411260
as_u8 | @intFromEnum(Zir.Inst.Ref.zero_u8),
1125511261
as_u8 | @intFromEnum(Zir.Inst.Ref.one_u8),
1125611262
as_u8 | @intFromEnum(Zir.Inst.Ref.four_u8),
11263+
as_bool | @intFromEnum(Zir.Inst.Ref.undef_bool),
1125711264
as_bool | @intFromEnum(Zir.Inst.Ref.bool_true),
1125811265
as_bool | @intFromEnum(Zir.Inst.Ref.bool_false),
1125911266
as_void | @intFromEnum(Zir.Inst.Ref.void_value),
1126011267
=> return result, // type of result is already correct
1126111268

11269+
as_bool | @intFromEnum(Zir.Inst.Ref.undef) => return .undef_bool,
11270+
as_usize | @intFromEnum(Zir.Inst.Ref.undef) => return .undef_usize,
11271+
as_usize | @intFromEnum(Zir.Inst.Ref.undef_u1) => return .undef_usize,
11272+
as_u1 | @intFromEnum(Zir.Inst.Ref.undef) => return .undef_u1,
11273+
1126211274
as_usize | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_usize,
11275+
as_u1 | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_u1,
1126311276
as_u8 | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_u8,
1126411277
as_usize | @intFromEnum(Zir.Inst.Ref.one) => return .one_usize,
11278+
as_u1 | @intFromEnum(Zir.Inst.Ref.one) => return .one_u1,
1126511279
as_u8 | @intFromEnum(Zir.Inst.Ref.one) => return .one_u8,
1126611280
as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero,
11281+
as_u1 | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero_u1,
1126711282
as_u8 | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero_u8,
1126811283
as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one,
11284+
as_u1 | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one_u1,
1126911285
as_u8 | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one_u8,
11286+
as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_u1) => return .zero,
1127011287
as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero,
11288+
as_usize | @intFromEnum(Zir.Inst.Ref.zero_u1) => return .zero_usize,
1127111289
as_usize | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero_usize,
11290+
as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_u1) => return .one,
1127211291
as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one,
11292+
as_usize | @intFromEnum(Zir.Inst.Ref.one_u1) => return .one_usize,
1127311293
as_usize | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one_usize,
1127411294

1127511295
// Need an explicit type coercion instruction.

lib/std/zig/Zir.zig

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2142,7 +2142,7 @@ pub const Inst = struct {
21422142
ref_start_index = static_len,
21432143
_,
21442144

2145-
pub const static_len = 118;
2145+
pub const static_len = 124;
21462146

21472147
pub fn toRef(i: Index) Inst.Ref {
21482148
return @enumFromInt(@intFromEnum(Index.ref_start_index) + @intFromEnum(i));
@@ -2220,10 +2220,11 @@ pub const Inst = struct {
22202220
null_type,
22212221
undefined_type,
22222222
enum_literal_type,
2223+
ptr_usize_type,
2224+
ptr_const_comptime_int_type,
22232225
manyptr_u8_type,
22242226
manyptr_const_u8_type,
22252227
manyptr_const_u8_sentinel_0_type,
2226-
single_const_pointer_to_comptime_int_type,
22272228
slice_const_u8_type,
22282229
slice_const_u8_sentinel_0_type,
22292230
vector_8_i8_type,
@@ -2279,11 +2280,16 @@ pub const Inst = struct {
22792280
generic_poison_type,
22802281
empty_tuple_type,
22812282
undef,
2283+
undef_bool,
2284+
undef_usize,
2285+
undef_u1,
22822286
zero,
22832287
zero_usize,
2288+
zero_u1,
22842289
zero_u8,
22852290
one,
22862291
one_usize,
2292+
one_u1,
22872293
one_u8,
22882294
four_u8,
22892295
negative_one,

src/Air.zig

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,10 +1011,11 @@ pub const Inst = struct {
10111011
null_type = @intFromEnum(InternPool.Index.null_type),
10121012
undefined_type = @intFromEnum(InternPool.Index.undefined_type),
10131013
enum_literal_type = @intFromEnum(InternPool.Index.enum_literal_type),
1014+
ptr_usize_type = @intFromEnum(InternPool.Index.ptr_usize_type),
1015+
ptr_const_comptime_int_type = @intFromEnum(InternPool.Index.ptr_const_comptime_int_type),
10141016
manyptr_u8_type = @intFromEnum(InternPool.Index.manyptr_u8_type),
10151017
manyptr_const_u8_type = @intFromEnum(InternPool.Index.manyptr_const_u8_type),
10161018
manyptr_const_u8_sentinel_0_type = @intFromEnum(InternPool.Index.manyptr_const_u8_sentinel_0_type),
1017-
single_const_pointer_to_comptime_int_type = @intFromEnum(InternPool.Index.single_const_pointer_to_comptime_int_type),
10181019
slice_const_u8_type = @intFromEnum(InternPool.Index.slice_const_u8_type),
10191020
slice_const_u8_sentinel_0_type = @intFromEnum(InternPool.Index.slice_const_u8_sentinel_0_type),
10201021
vector_8_i8_type = @intFromEnum(InternPool.Index.vector_8_i8_type),
@@ -1070,11 +1071,16 @@ pub const Inst = struct {
10701071
generic_poison_type = @intFromEnum(InternPool.Index.generic_poison_type),
10711072
empty_tuple_type = @intFromEnum(InternPool.Index.empty_tuple_type),
10721073
undef = @intFromEnum(InternPool.Index.undef),
1074+
undef_bool = @intFromEnum(InternPool.Index.undef_bool),
1075+
undef_usize = @intFromEnum(InternPool.Index.undef_usize),
1076+
undef_u1 = @intFromEnum(InternPool.Index.undef_u1),
10731077
zero = @intFromEnum(InternPool.Index.zero),
10741078
zero_usize = @intFromEnum(InternPool.Index.zero_usize),
1079+
zero_u1 = @intFromEnum(InternPool.Index.zero_u1),
10751080
zero_u8 = @intFromEnum(InternPool.Index.zero_u8),
10761081
one = @intFromEnum(InternPool.Index.one),
10771082
one_usize = @intFromEnum(InternPool.Index.one_usize),
1083+
one_u1 = @intFromEnum(InternPool.Index.one_u1),
10781084
one_u8 = @intFromEnum(InternPool.Index.one_u8),
10791085
four_u8 = @intFromEnum(InternPool.Index.four_u8),
10801086
negative_one = @intFromEnum(InternPool.Index.negative_one),
@@ -1121,7 +1127,7 @@ pub const Inst = struct {
11211127
}
11221128

11231129
pub fn toType(ref: Ref) Type {
1124-
return Type.fromInterned(ref.toInterned().?);
1130+
return .fromInterned(ref.toInterned().?);
11251131
}
11261132
};
11271133

@@ -1393,7 +1399,7 @@ pub fn getMainBody(air: Air) []const Air.Inst.Index {
13931399

13941400
pub fn typeOf(air: *const Air, inst: Air.Inst.Ref, ip: *const InternPool) Type {
13951401
if (inst.toInterned()) |ip_index| {
1396-
return Type.fromInterned(ip.typeOf(ip_index));
1402+
return .fromInterned(ip.typeOf(ip_index));
13971403
} else {
13981404
return air.typeOfIndex(inst.toIndex().?, ip);
13991405
}
@@ -1483,7 +1489,7 @@ pub fn typeOfIndex(air: *const Air, inst: Air.Inst.Index, ip: *const InternPool)
14831489
.is_non_err_ptr,
14841490
.is_named_enum_value,
14851491
.error_set_has_value,
1486-
=> return Type.bool,
1492+
=> return .bool,
14871493

14881494
.alloc,
14891495
.ret_ptr,
@@ -1574,7 +1580,7 @@ pub fn typeOfIndex(air: *const Air, inst: Air.Inst.Index, ip: *const InternPool)
15741580
.ret_load,
15751581
.unreach,
15761582
.trap,
1577-
=> return Type.noreturn,
1583+
=> return .noreturn,
15781584

15791585
.breakpoint,
15801586
.dbg_stmt,
@@ -1597,22 +1603,22 @@ pub fn typeOfIndex(air: *const Air, inst: Air.Inst.Index, ip: *const InternPool)
15971603
.set_err_return_trace,
15981604
.vector_store_elem,
15991605
.c_va_end,
1600-
=> return Type.void,
1606+
=> return .void,
16011607

16021608
.slice_len,
16031609
.ret_addr,
16041610
.frame_addr,
16051611
.save_err_return_trace_index,
1606-
=> return Type.usize,
1612+
=> return .usize,
16071613

1608-
.wasm_memory_grow => return Type.isize,
1609-
.wasm_memory_size => return Type.usize,
1614+
.wasm_memory_grow => return .isize,
1615+
.wasm_memory_size => return .usize,
16101616

1611-
.tag_name, .error_name => return Type.slice_const_u8_sentinel_0,
1617+
.tag_name, .error_name => return .slice_const_u8_sentinel_0,
16121618

16131619
.call, .call_always_tail, .call_never_tail, .call_never_inline => {
16141620
const callee_ty = air.typeOf(datas[@intFromEnum(inst)].pl_op.operand, ip);
1615-
return Type.fromInterned(ip.funcTypeReturnType(callee_ty.toIntern()));
1621+
return .fromInterned(ip.funcTypeReturnType(callee_ty.toIntern()));
16161622
},
16171623

16181624
.slice_elem_val, .ptr_elem_val, .array_elem_val => {
@@ -1630,7 +1636,7 @@ pub fn typeOfIndex(air: *const Air, inst: Air.Inst.Index, ip: *const InternPool)
16301636

16311637
.reduce, .reduce_optimized => {
16321638
const operand_ty = air.typeOf(datas[@intFromEnum(inst)].reduce.operand, ip);
1633-
return Type.fromInterned(ip.indexToKey(operand_ty.ip_index).vector_type.child);
1639+
return .fromInterned(ip.indexToKey(operand_ty.ip_index).vector_type.child);
16341640
},
16351641

16361642
.mul_add => return air.typeOf(datas[@intFromEnum(inst)].pl_op.operand, ip),
@@ -1641,15 +1647,15 @@ pub fn typeOfIndex(air: *const Air, inst: Air.Inst.Index, ip: *const InternPool)
16411647

16421648
.@"try", .try_cold => {
16431649
const err_union_ty = air.typeOf(datas[@intFromEnum(inst)].pl_op.operand, ip);
1644-
return Type.fromInterned(ip.indexToKey(err_union_ty.ip_index).error_union_type.payload_type);
1650+
return .fromInterned(ip.indexToKey(err_union_ty.ip_index).error_union_type.payload_type);
16451651
},
16461652

16471653
.tlv_dllimport_ptr => return .fromInterned(datas[@intFromEnum(inst)].ty_nav.ty),
16481654

16491655
.work_item_id,
16501656
.work_group_size,
16511657
.work_group_id,
1652-
=> return Type.u32,
1658+
=> return .u32,
16531659

16541660
.inferred_alloc => unreachable,
16551661
.inferred_alloc_comptime => unreachable,
@@ -1696,7 +1702,7 @@ pub fn internedToRef(ip_index: InternPool.Index) Inst.Ref {
16961702
/// Returns `null` if runtime-known.
16971703
pub fn value(air: Air, inst: Inst.Ref, pt: Zcu.PerThread) !?Value {
16981704
if (inst.toInterned()) |ip_index| {
1699-
return Value.fromInterned(ip_index);
1705+
return .fromInterned(ip_index);
17001706
}
17011707
const index = inst.toIndex().?;
17021708
return air.typeOfIndex(index, &pt.zcu.intern_pool).onePossibleValue(pt);

0 commit comments

Comments
 (0)