mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
frontend: replace elem_val_node with elem_ptr_load
avoids unnecessary copies
This commit is contained in:
parent
95439c9820
commit
9afa6835df
@ -2728,7 +2728,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
|
|||||||
.elem_ptr,
|
.elem_ptr,
|
||||||
.elem_val,
|
.elem_val,
|
||||||
.elem_ptr_node,
|
.elem_ptr_node,
|
||||||
.elem_val_node,
|
.elem_ptr_load,
|
||||||
.elem_val_imm,
|
.elem_val_imm,
|
||||||
.field_ptr,
|
.field_ptr,
|
||||||
.field_ptr_load,
|
.field_ptr_load,
|
||||||
@ -6210,14 +6210,14 @@ fn arrayAccess(
|
|||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
|
const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
|
||||||
const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node);
|
const lhs = try expr(gz, scope, .{ .rl = .ref }, lhs_node);
|
||||||
|
|
||||||
const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
|
const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
|
||||||
|
|
||||||
const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node);
|
const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node);
|
||||||
try emitDbgStmt(gz, cursor);
|
try emitDbgStmt(gz, cursor);
|
||||||
|
|
||||||
return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
|
return rvalue(gz, ri, try gz.addPlNode(.elem_ptr_load, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -441,12 +441,17 @@ pub const Inst = struct {
|
|||||||
/// Payload is `Bin`.
|
/// Payload is `Bin`.
|
||||||
/// No OOB safety check is emitted.
|
/// No OOB safety check is emitted.
|
||||||
elem_ptr,
|
elem_ptr,
|
||||||
/// Given an array, slice, or pointer, returns the element at the provided index.
|
/// Given a pointer to an array, slice, or pointer, loads the element
|
||||||
|
/// at the provided index.
|
||||||
|
///
|
||||||
/// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
|
/// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
|
||||||
elem_val_node,
|
elem_ptr_load,
|
||||||
/// Same as `elem_val_node` but used only for for loop.
|
/// Given an array, slice, or pointer, returns the element at the
|
||||||
/// Uses the `pl_node` union field. AST node is the condition of a for loop.
|
/// provided index.
|
||||||
/// Payload is `Bin`.
|
///
|
||||||
|
/// Uses the `pl_node` union field. AST node is the condition of a for
|
||||||
|
/// loop. Payload is `Bin`.
|
||||||
|
///
|
||||||
/// No OOB safety check is emitted.
|
/// No OOB safety check is emitted.
|
||||||
elem_val,
|
elem_val,
|
||||||
/// Same as `elem_val` but takes the index as an immediate value.
|
/// Same as `elem_val` but takes the index as an immediate value.
|
||||||
@ -1146,7 +1151,7 @@ pub const Inst = struct {
|
|||||||
.elem_ptr,
|
.elem_ptr,
|
||||||
.elem_val,
|
.elem_val,
|
||||||
.elem_ptr_node,
|
.elem_ptr_node,
|
||||||
.elem_val_node,
|
.elem_ptr_load,
|
||||||
.elem_val_imm,
|
.elem_val_imm,
|
||||||
.ensure_result_used,
|
.ensure_result_used,
|
||||||
.ensure_result_non_error,
|
.ensure_result_non_error,
|
||||||
@ -1440,7 +1445,7 @@ pub const Inst = struct {
|
|||||||
.elem_ptr,
|
.elem_ptr,
|
||||||
.elem_val,
|
.elem_val,
|
||||||
.elem_ptr_node,
|
.elem_ptr_node,
|
||||||
.elem_val_node,
|
.elem_ptr_load,
|
||||||
.elem_val_imm,
|
.elem_val_imm,
|
||||||
.field_ptr,
|
.field_ptr,
|
||||||
.field_ptr_load,
|
.field_ptr_load,
|
||||||
@ -1687,7 +1692,7 @@ pub const Inst = struct {
|
|||||||
.elem_ptr = .pl_node,
|
.elem_ptr = .pl_node,
|
||||||
.elem_ptr_node = .pl_node,
|
.elem_ptr_node = .pl_node,
|
||||||
.elem_val = .pl_node,
|
.elem_val = .pl_node,
|
||||||
.elem_val_node = .pl_node,
|
.elem_ptr_load = .pl_node,
|
||||||
.elem_val_imm = .elem_val_imm,
|
.elem_val_imm = .elem_val_imm,
|
||||||
.ensure_result_used = .un_node,
|
.ensure_result_used = .un_node,
|
||||||
.ensure_result_non_error = .un_node,
|
.ensure_result_non_error = .un_node,
|
||||||
@ -4223,7 +4228,7 @@ fn findTrackableInner(
|
|||||||
.div,
|
.div,
|
||||||
.elem_ptr_node,
|
.elem_ptr_node,
|
||||||
.elem_ptr,
|
.elem_ptr,
|
||||||
.elem_val_node,
|
.elem_ptr_load,
|
||||||
.elem_val,
|
.elem_val,
|
||||||
.elem_val_imm,
|
.elem_val_imm,
|
||||||
.ensure_result_used,
|
.ensure_result_used,
|
||||||
|
|||||||
@ -1193,7 +1193,7 @@ fn analyzeBodyInner(
|
|||||||
.elem_ptr => try sema.zirElemPtr(block, inst),
|
.elem_ptr => try sema.zirElemPtr(block, inst),
|
||||||
.elem_ptr_node => try sema.zirElemPtrNode(block, inst),
|
.elem_ptr_node => try sema.zirElemPtrNode(block, inst),
|
||||||
.elem_val => try sema.zirElemVal(block, inst),
|
.elem_val => try sema.zirElemVal(block, inst),
|
||||||
.elem_val_node => try sema.zirElemValNode(block, inst),
|
.elem_ptr_load => try sema.zirElemPtrLoad(block, inst),
|
||||||
.elem_val_imm => try sema.zirElemValImm(block, inst),
|
.elem_val_imm => try sema.zirElemValImm(block, inst),
|
||||||
.elem_type => try sema.zirElemType(block, inst),
|
.elem_type => try sema.zirElemType(block, inst),
|
||||||
.indexable_ptr_elem_type => try sema.zirIndexablePtrElemType(block, inst),
|
.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
|
|||||||
return sema.elemVal(block, src, array, elem_index, src, false);
|
return sema.elemVal(block, src, array, elem_index, src, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
|
fn zirElemPtrLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
|
||||||
const tracy = trace(@src());
|
const tracy = trace(@src());
|
||||||
defer tracy.end();
|
defer tracy.end();
|
||||||
|
|
||||||
@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
|
|||||||
const src = block.nodeOffset(inst_data.src_node);
|
const src = block.nodeOffset(inst_data.src_node);
|
||||||
const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node });
|
const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node });
|
||||||
const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
|
const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
|
||||||
const array = try sema.resolveInst(extra.lhs);
|
const array_ptr = try sema.resolveInst(extra.lhs);
|
||||||
const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
|
const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
|
||||||
const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src);
|
const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src);
|
||||||
return sema.elemVal(block, src, array, elem_index, elem_index_src, true);
|
const elem_ptr = try elemPtr(sema, block, src, array_ptr, elem_index, elem_index_src, false, true);
|
||||||
|
return analyzeLoad(sema, block, src, elem_ptr, elem_index_src);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
|
fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
|
||||||
|
|||||||
@ -406,7 +406,7 @@ const Writer = struct {
|
|||||||
.memset,
|
.memset,
|
||||||
.memmove,
|
.memmove,
|
||||||
.elem_ptr_node,
|
.elem_ptr_node,
|
||||||
.elem_val_node,
|
.elem_ptr_load,
|
||||||
.elem_ptr,
|
.elem_ptr,
|
||||||
.elem_val,
|
.elem_val,
|
||||||
.array_type,
|
.array_type,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user