aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-09-21 13:03:13 +0100
committergingerBill <bill@gingerbill.org>2022-09-21 13:03:13 +0100
commitff97a731521dbeb9a6457a889f30f4fa69e080f7 (patch)
tree984fa5a3fe7cc9cec973689f2553f0634b37920e /src/llvm_backend_expr.cpp
parent769d8dd038601d6e7ad0ddb445593e65c4596074 (diff)
Reduce unnecessary map gets
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp22
1 files changed, 8 insertions, 14 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 3ab73a27b..e8138d0a2 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -3670,16 +3670,14 @@ lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) {
if (is_type_map(t)) {
lbAddr map_addr = lb_build_addr(p, ie->expr);
- lbValue map_val = lb_addr_load(p, map_addr);
- if (deref) {
- map_val = lb_emit_load(p, map_val);
- }
-
lbValue key = lb_build_expr(p, ie->index);
key = lb_emit_conv(p, key, t->Map.key);
Type *result_type = type_of_expr(expr);
- lbValue map_ptr = lb_address_from_load_or_generate_local(p, map_val);
+ lbValue map_ptr = lb_addr_get_ptr(p, map_addr);
+ if (is_type_pointer(type_deref(map_ptr.type))) {
+ map_ptr = lb_emit_load(p, map_ptr);
+ }
return lb_addr_map(map_ptr, key, t, result_type);
}
@@ -4130,20 +4128,16 @@ lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) {
break;
}
GB_ASSERT(!build_context.no_dynamic_literals);
- {
- auto args = array_make<lbValue>(permanent_allocator(), 3);
- args[0] = lb_gen_map_header(p, v.addr, type);
- args[1] = lb_const_int(p->module, t_int, 2*cl->elems.count);
- args[2] = lb_emit_source_code_location(p, proc_name, pos);
- lb_emit_runtime_call(p, "__dynamic_map_reserve", args);
- }
+
+ lb_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos);
+
for_array(field_index, cl->elems) {
Ast *elem = cl->elems[field_index];
ast_node(fv, FieldValue, elem);
lbValue key = lb_build_expr(p, fv->field);
lbValue value = lb_build_expr(p, fv->value);
- lb_insert_dynamic_map_key_and_value(p, v, type, key, value, elem);
+ lb_insert_dynamic_map_key_and_value(p, v.addr, type, key, value, elem);
}
break;
}