| 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,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); |
| 6214 | 6214 | ||
| 6215 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); | 6215 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 6216 | 6216 | ||
| 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); |
| 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,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 | } |
| 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 | const tracy = trace(@src()); | 10106 | const tracy = trace(@src()); |
| 10107 | defer tracy.end(); | 10107 | defer tracy.end(); |
| 10108 | 10108 | ||
| ... | @@ -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 | } |
| 10118 | 10119 | ||
| 10119 | fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,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, |