authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-04 19:12:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-20 18:33:00-07:00
log9afa6835df021441d82b8d450d39a83808c5096a
tree06dc005a4400e358d283c4045424a437a9f473da
parent95439c982033bf56a54f4dd85e6de951b52aeb0d

frontend: replace elem_val_node with elem_ptr_load

avoids unnecessary copies

4 files changed, 23 insertions(+), 17 deletions(-)

lib/std/zig/AstGen.zig+3-3
......@@ -2728,7 +2728,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
27282728 .elem_ptr,
27292729 .elem_val,
27302730 .elem_ptr_node,
2731 .elem_val_node,
2731 .elem_ptr_load,
27322732 .elem_val_imm,
27332733 .field_ptr,
27342734 .field_ptr_load,
......@@ -6210,14 +6210,14 @@ fn arrayAccess(
62106210 },
62116211 else => {
62126212 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
6213 const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node);
6213 const lhs = try expr(gz, scope, .{ .rl = .ref }, lhs_node);
62146214
62156215 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
62166216
62176217 const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node);
62186218 try emitDbgStmt(gz, cursor);
62196219
6220 return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
6220 return rvalue(gz, ri, try gz.addPlNode(.elem_ptr_load, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
62216221 },
62226222 }
62236223}
lib/std/zig/Zir.zig+14-9
......@@ -441,12 +441,17 @@ pub const Inst = struct {
441441 /// Payload is `Bin`.
442442 /// No OOB safety check is emitted.
443443 elem_ptr,
444 /// Given an array, slice, or pointer, returns the element at the provided index.
444 /// Given a pointer to an array, slice, or pointer, loads the element
445 /// at the provided index.
446 ///
445447 /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
446 elem_val_node,
447 /// Same as `elem_val_node` but used only for for loop.
448 /// Uses the `pl_node` union field. AST node is the condition of a for loop.
449 /// Payload is `Bin`.
448 elem_ptr_load,
449 /// Given an array, slice, or pointer, returns the element at the
450 /// provided index.
451 ///
452 /// Uses the `pl_node` union field. AST node is the condition of a for
453 /// loop. Payload is `Bin`.
454 ///
450455 /// No OOB safety check is emitted.
451456 elem_val,
452457 /// Same as `elem_val` but takes the index as an immediate value.
......@@ -1146,7 +1151,7 @@ pub const Inst = struct {
11461151 .elem_ptr,
11471152 .elem_val,
11481153 .elem_ptr_node,
1149 .elem_val_node,
1154 .elem_ptr_load,
11501155 .elem_val_imm,
11511156 .ensure_result_used,
11521157 .ensure_result_non_error,
......@@ -1440,7 +1445,7 @@ pub const Inst = struct {
14401445 .elem_ptr,
14411446 .elem_val,
14421447 .elem_ptr_node,
1443 .elem_val_node,
1448 .elem_ptr_load,
14441449 .elem_val_imm,
14451450 .field_ptr,
14461451 .field_ptr_load,
......@@ -1687,7 +1692,7 @@ pub const Inst = struct {
16871692 .elem_ptr = .pl_node,
16881693 .elem_ptr_node = .pl_node,
16891694 .elem_val = .pl_node,
1690 .elem_val_node = .pl_node,
1695 .elem_ptr_load = .pl_node,
16911696 .elem_val_imm = .elem_val_imm,
16921697 .ensure_result_used = .un_node,
16931698 .ensure_result_non_error = .un_node,
......@@ -4223,7 +4228,7 @@ fn findTrackableInner(
42234228 .div,
42244229 .elem_ptr_node,
42254230 .elem_ptr,
4226 .elem_val_node,
4231 .elem_ptr_load,
42274232 .elem_val,
42284233 .elem_val_imm,
42294234 .ensure_result_used,
src/Sema.zig+5-4
......@@ -1193,7 +1193,7 @@ fn analyzeBodyInner(
11931193 .elem_ptr => try sema.zirElemPtr(block, inst),
11941194 .elem_ptr_node => try sema.zirElemPtrNode(block, inst),
11951195 .elem_val => try sema.zirElemVal(block, inst),
1196 .elem_val_node => try sema.zirElemValNode(block, inst),
1196 .elem_ptr_load => try sema.zirElemPtrLoad(block, inst),
11971197 .elem_val_imm => try sema.zirElemValImm(block, inst),
11981198 .elem_type => try sema.zirElemType(block, inst),
11991199 .indexable_ptr_elem_type => try sema.zirIndexablePtrElemType(block, inst),
......@@ -10102,7 +10102,7 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1010210102 return sema.elemVal(block, src, array, elem_index, src, false);
1010310103}
1010410104
10105fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
10105fn zirElemPtrLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1010610106 const tracy = trace(@src());
1010710107 defer tracy.end();
1010810108
......@@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1011010110 const src = block.nodeOffset(inst_data.src_node);
1011110111 const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node });
1011210112 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
10113 const array = try sema.resolveInst(extra.lhs);
10113 const array_ptr = try sema.resolveInst(extra.lhs);
1011410114 const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
1011510115 const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src);
10116 return sema.elemVal(block, src, array, elem_index, elem_index_src, true);
10116 const elem_ptr = try elemPtr(sema, block, src, array_ptr, elem_index, elem_index_src, false, true);
10117 return analyzeLoad(sema, block, src, elem_ptr, elem_index_src);
1011710118}
1011810119
1011910120fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
src/print_zir.zig+1-1
......@@ -406,7 +406,7 @@ const Writer = struct {
406406 .memset,
407407 .memmove,
408408 .elem_ptr_node,
409 .elem_val_node,
409 .elem_ptr_load,
410410 .elem_ptr,
411411 .elem_val,
412412 .array_type,