Skip to content

Commit 4a167bb

Browse files
committed
AstGen: avoid intermediate loads during field/array access
Closes ziglang#15685 Closes ziglang#15280
1 parent 54c0857 commit 4a167bb

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

lib/std/zig/AstGen.zig

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6072,8 +6072,9 @@ fn fieldAccess(
60726072
switch (ri.rl) {
60736073
.ref, .ref_coerced_ty => return addFieldAccess(.field_ptr, gz, scope, .{ .rl = .ref }, node),
60746074
else => {
6075-
const access = try addFieldAccess(.field_val, gz, scope, .{ .rl = .none }, node);
6076-
return rvalue(gz, ri, access, node);
6075+
const ptr = try addFieldAccess(.field_ptr, gz, scope, .{ .rl = .ref }, node);
6076+
const result = try gz.addUnNode(.load, ptr, node);
6077+
return rvalue(gz, ri, result, node);
60776078
},
60786079
}
60796080
}
@@ -6125,14 +6126,16 @@ fn arrayAccess(
61256126
return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });
61266127
},
61276128
else => {
6128-
const lhs = try expr(gz, scope, .{ .rl = .none }, node_datas[node].lhs);
6129+
const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs);
61296130

61306131
const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
61316132

61326133
const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[node].rhs);
61336134
try emitDbgStmt(gz, cursor);
61346135

6135-
return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
6136+
const ptr = try gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });
6137+
const result = try gz.addUnNode(.load, ptr, node);
6138+
return rvalue(gz, ri, result, node);
61366139
},
61376140
}
61386141
}

test/behavior/basic.zig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,3 +1386,12 @@ test "loading array from struct is not optimized away" {
13861386
var s = S{};
13871387
try s.doTheTest();
13881388
}
1389+
1390+
test "length of array in global struct is comptime-known" {
1391+
const S = struct {
1392+
arr: [5]u8 = undefined,
1393+
var x: @This() = .{};
1394+
};
1395+
1396+
try expect(comptime S.x.arr.len == 5);
1397+
}

0 commit comments

Comments
 (0)