| author | |
| committer | |
| log | 9afa6835df021441d82b8d450d39a83808c5096a |
| tree | 06dc005a4400e358d283c4045424a437a9f473da |
| parent | 95439c982033bf56a54f4dd85e6de951b52aeb0d |
avoids unnecessary copies4 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 | 2728 | .elem_ptr, |
| 2729 | 2729 | .elem_val, |
| 2730 | 2730 | .elem_ptr_node, |
| 2731 | .elem_val_node, | |
| 2731 | .elem_ptr_load, | |
| 2732 | 2732 | .elem_val_imm, |
| 2733 | 2733 | .field_ptr, |
| 2734 | 2734 | .field_ptr_load, |
| ... | ... | @@ -6210,14 +6210,14 @@ fn arrayAccess( |
| 6210 | 6210 | }, |
| 6211 | 6211 | else => { |
| 6212 | 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); | |
| 6214 | 6214 | |
| 6215 | 6215 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 6216 | 6216 | |
| 6217 | 6217 | const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node); |
| 6218 | 6218 | try emitDbgStmt(gz, cursor); |
| 6219 | 6219 | |
| 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 | 441 | /// Payload is `Bin`. |
| 442 | 442 | /// No OOB safety check is emitted. |
| 443 | 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 | 447 | /// 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 | /// | |
| 450 | 455 | /// No OOB safety check is emitted. |
| 451 | 456 | elem_val, |
| 452 | 457 | /// Same as `elem_val` but takes the index as an immediate value. |
| ... | ... | @@ -1146,7 +1151,7 @@ pub const Inst = struct { |
| 1146 | 1151 | .elem_ptr, |
| 1147 | 1152 | .elem_val, |
| 1148 | 1153 | .elem_ptr_node, |
| 1149 | .elem_val_node, | |
| 1154 | .elem_ptr_load, | |
| 1150 | 1155 | .elem_val_imm, |
| 1151 | 1156 | .ensure_result_used, |
| 1152 | 1157 | .ensure_result_non_error, |
| ... | ... | @@ -1440,7 +1445,7 @@ pub const Inst = struct { |
| 1440 | 1445 | .elem_ptr, |
| 1441 | 1446 | .elem_val, |
| 1442 | 1447 | .elem_ptr_node, |
| 1443 | .elem_val_node, | |
| 1448 | .elem_ptr_load, | |
| 1444 | 1449 | .elem_val_imm, |
| 1445 | 1450 | .field_ptr, |
| 1446 | 1451 | .field_ptr_load, |
| ... | ... | @@ -1687,7 +1692,7 @@ pub const Inst = struct { |
| 1687 | 1692 | .elem_ptr = .pl_node, |
| 1688 | 1693 | .elem_ptr_node = .pl_node, |
| 1689 | 1694 | .elem_val = .pl_node, |
| 1690 | .elem_val_node = .pl_node, | |
| 1695 | .elem_ptr_load = .pl_node, | |
| 1691 | 1696 | .elem_val_imm = .elem_val_imm, |
| 1692 | 1697 | .ensure_result_used = .un_node, |
| 1693 | 1698 | .ensure_result_non_error = .un_node, |
| ... | ... | @@ -4223,7 +4228,7 @@ fn findTrackableInner( |
| 4223 | 4228 | .div, |
| 4224 | 4229 | .elem_ptr_node, |
| 4225 | 4230 | .elem_ptr, |
| 4226 | .elem_val_node, | |
| 4231 | .elem_ptr_load, | |
| 4227 | 4232 | .elem_val, |
| 4228 | 4233 | .elem_val_imm, |
| 4229 | 4234 | .ensure_result_used, |
src/Sema.zig+5-4| ... | ... | @@ -1193,7 +1193,7 @@ fn analyzeBodyInner( |
| 1193 | 1193 | .elem_ptr => try sema.zirElemPtr(block, inst), |
| 1194 | 1194 | .elem_ptr_node => try sema.zirElemPtrNode(block, inst), |
| 1195 | 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 | 1197 | .elem_val_imm => try sema.zirElemValImm(block, inst), |
| 1198 | 1198 | .elem_type => try sema.zirElemType(block, inst), |
| 1199 | 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 | 10102 | return sema.elemVal(block, src, array, elem_index, src, false); |
| 10103 | 10103 | } |
| 10104 | 10104 | |
| 10105 | fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | |
| 10105 | fn zirElemPtrLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | |
| 10106 | 10106 | const tracy = trace(@src()); |
| 10107 | 10107 | defer tracy.end(); |
| 10108 | 10108 | |
| ... | ... | @@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10110 | 10110 | const src = block.nodeOffset(inst_data.src_node); |
| 10111 | 10111 | const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node }); |
| 10112 | 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 | 10114 | const uncoerced_elem_index = try sema.resolveInst(extra.rhs); |
| 10115 | 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 | } |
| 10118 | 10119 | |
| 10119 | 10120 | fn 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 | 406 | .memset, |
| 407 | 407 | .memmove, |
| 408 | 408 | .elem_ptr_node, |
| 409 | .elem_val_node, | |
| 409 | .elem_ptr_load, | |
| 410 | 410 | .elem_ptr, |
| 411 | 411 | .elem_val, |
| 412 | 412 | .array_type, |