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...@@ -2728,7 +2728,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
2728 .elem_ptr,2728 .elem_ptr,
2729 .elem_val,2729 .elem_val,
2730 .elem_ptr_node,2730 .elem_ptr_node,
2731 .elem_val_node,2731 .elem_ptr_load,
2732 .elem_val_imm,2732 .elem_val_imm,
2733 .field_ptr,2733 .field_ptr,
2734 .field_ptr_load,2734 .field_ptr_load,
...@@ -6210,14 +6210,14 @@ fn arrayAccess(...@@ -6210,14 +6210,14 @@ fn arrayAccess(
6210 },6210 },
6211 else => {6211 else => {
6212 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;6212 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
6215 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);6215 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
62166216
6217 const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node);6217 const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node);
6218 try emitDbgStmt(gz, cursor);6218 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);
6221 },6221 },
6222 }6222 }
6223}6223}
lib/std/zig/Zir.zig+14-9
...@@ -441,12 +441,17 @@ pub const Inst = struct {...@@ -441,12 +441,17 @@ pub const Inst = struct {
441 /// Payload is `Bin`.441 /// Payload is `Bin`.
442 /// No OOB safety check is emitted.442 /// No OOB safety check is emitted.
443 elem_ptr,443 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 ///
445 /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.447 /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
446 elem_val_node,448 elem_ptr_load,
447 /// Same as `elem_val_node` but used only for for loop.449 /// Given an array, slice, or pointer, returns the element at the
448 /// Uses the `pl_node` union field. AST node is the condition of a for loop.450 /// provided index.
449 /// Payload is `Bin`.451 ///
452 /// Uses the `pl_node` union field. AST node is the condition of a for
453 /// loop. Payload is `Bin`.
454 ///
450 /// No OOB safety check is emitted.455 /// No OOB safety check is emitted.
451 elem_val,456 elem_val,
452 /// Same as `elem_val` but takes the index as an immediate value.457 /// Same as `elem_val` but takes the index as an immediate value.
...@@ -1146,7 +1151,7 @@ pub const Inst = struct {...@@ -1146,7 +1151,7 @@ pub const Inst = struct {
1146 .elem_ptr,1151 .elem_ptr,
1147 .elem_val,1152 .elem_val,
1148 .elem_ptr_node,1153 .elem_ptr_node,
1149 .elem_val_node,1154 .elem_ptr_load,
1150 .elem_val_imm,1155 .elem_val_imm,
1151 .ensure_result_used,1156 .ensure_result_used,
1152 .ensure_result_non_error,1157 .ensure_result_non_error,
...@@ -1440,7 +1445,7 @@ pub const Inst = struct {...@@ -1440,7 +1445,7 @@ pub const Inst = struct {
1440 .elem_ptr,1445 .elem_ptr,
1441 .elem_val,1446 .elem_val,
1442 .elem_ptr_node,1447 .elem_ptr_node,
1443 .elem_val_node,1448 .elem_ptr_load,
1444 .elem_val_imm,1449 .elem_val_imm,
1445 .field_ptr,1450 .field_ptr,
1446 .field_ptr_load,1451 .field_ptr_load,
...@@ -1687,7 +1692,7 @@ pub const Inst = struct {...@@ -1687,7 +1692,7 @@ pub const Inst = struct {
1687 .elem_ptr = .pl_node,1692 .elem_ptr = .pl_node,
1688 .elem_ptr_node = .pl_node,1693 .elem_ptr_node = .pl_node,
1689 .elem_val = .pl_node,1694 .elem_val = .pl_node,
1690 .elem_val_node = .pl_node,1695 .elem_ptr_load = .pl_node,
1691 .elem_val_imm = .elem_val_imm,1696 .elem_val_imm = .elem_val_imm,
1692 .ensure_result_used = .un_node,1697 .ensure_result_used = .un_node,
1693 .ensure_result_non_error = .un_node,1698 .ensure_result_non_error = .un_node,
...@@ -4223,7 +4228,7 @@ fn findTrackableInner(...@@ -4223,7 +4228,7 @@ fn findTrackableInner(
4223 .div,4228 .div,
4224 .elem_ptr_node,4229 .elem_ptr_node,
4225 .elem_ptr,4230 .elem_ptr,
4226 .elem_val_node,4231 .elem_ptr_load,
4227 .elem_val,4232 .elem_val,
4228 .elem_val_imm,4233 .elem_val_imm,
4229 .ensure_result_used,4234 .ensure_result_used,
src/Sema.zig+5-4
...@@ -1193,7 +1193,7 @@ fn analyzeBodyInner(...@@ -1193,7 +1193,7 @@ fn analyzeBodyInner(
1193 .elem_ptr => try sema.zirElemPtr(block, inst),1193 .elem_ptr => try sema.zirElemPtr(block, inst),
1194 .elem_ptr_node => try sema.zirElemPtrNode(block, inst),1194 .elem_ptr_node => try sema.zirElemPtrNode(block, inst),
1195 .elem_val => try sema.zirElemVal(block, inst),1195 .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),
1197 .elem_val_imm => try sema.zirElemValImm(block, inst),1197 .elem_val_imm => try sema.zirElemValImm(block, inst),
1198 .elem_type => try sema.zirElemType(block, inst),1198 .elem_type => try sema.zirElemType(block, inst),
1199 .indexable_ptr_elem_type => try sema.zirIndexablePtrElemType(block, inst),1199 .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...@@ -10102,7 +10102,7 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
10102 return sema.elemVal(block, src, array, elem_index, src, false);10102 return sema.elemVal(block, src, array, elem_index, src, false);
10103}10103}
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 {
10106 const tracy = trace(@src());10106 const tracy = trace(@src());
10107 defer tracy.end();10107 defer tracy.end();
1010810108
...@@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
10110 const src = block.nodeOffset(inst_data.src_node);10110 const src = block.nodeOffset(inst_data.src_node);
10111 const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node });10111 const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node });
10112 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;10112 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);
10114 const uncoerced_elem_index = try sema.resolveInst(extra.rhs);10114 const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
10115 const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src);10115 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);
10117}10118}
1011810119
10119fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {10120fn 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 {...@@ -406,7 +406,7 @@ const Writer = struct {
406 .memset,406 .memset,
407 .memmove,407 .memmove,
408 .elem_ptr_node,408 .elem_ptr_node,
409 .elem_val_node,409 .elem_ptr_load,
410 .elem_ptr,410 .elem_ptr,
411 .elem_val,411 .elem_val,
412 .array_type,412 .array_type,