diff options
| author | gingerBill <bill@gingerbill.org> | 2022-08-10 11:36:25 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-08-10 11:36:25 +0100 |
| commit | 84f9fb706b90d97e7e52819af8388f64e38970e3 (patch) | |
| tree | 53372c99787a82ed953c81a89ec975eab9dc5a2e /src/llvm_backend_utility.cpp | |
| parent | 812823cad83d76987ee6b924b70427fbffe34f02 (diff) | |
General clean up of LLVM*GEP2 code
Diffstat (limited to 'src/llvm_backend_utility.cpp')
| -rw-r--r-- | src/llvm_backend_utility.cpp | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 3485c8436..ce7b43321 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1002,6 +1002,7 @@ lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) { index = lb_convert_struct_index(p->module, t, index); if (lb_is_const(s)) { + // NOTE(bill): this cannot be replaced with lb_emit_epi lbModule *m = p->module; lbValue res = {}; LLVMValueRef indices[2] = {llvm_zero(m), LLVMConstInt(lb_type(m, t_i32), index, false)}; @@ -1252,27 +1253,13 @@ lbValue lb_emit_array_ep(lbProcedure *p, lbValue s, lbValue index) { Type *ptr = base_array_type(st); lbValue res = {}; - res.value = LLVMBuildGEP2(p->builder, lb_type(p->module, st), s.value, indices, 2, ""); - res.type = alloc_type_pointer(ptr); - return res; -} -// This emits a GEP at 0, index -static inline lbValue lb_emit_gep(lbProcedure *p, Type *type, LLVMValueRef value, isize index) -{ - LLVMValueRef indices[2] = { - LLVMConstInt(lb_type(p->module, t_int), 0, false), - LLVMConstInt(lb_type(p->module, t_int), cast(unsigned)index, false), - }; - LLVMTypeRef llvm_type = lb_type(p->module, type); - lbValue res = {}; - Type *ptr = base_array_type(type); - res.type = alloc_type_pointer(ptr); - if (LLVMIsConstant(value)) { - res.value = LLVMConstGEP2(llvm_type, value, indices, gb_count_of(indices)); + if (LLVMIsConstant(s.value) && LLVMIsConstant(index.value)) { + res.value = LLVMConstGEP2(lb_type(p->module, st), s.value, indices, gb_count_of(indices)); } else { - res.value = LLVMBuildGEP2(p->builder, llvm_type, value, indices, gb_count_of(indices), ""); + res.value = LLVMBuildGEP2(p->builder, lb_type(p->module, st), s.value, indices, gb_count_of(indices), ""); } + res.type = alloc_type_pointer(ptr); return res; } @@ -1282,7 +1269,15 @@ lbValue lb_emit_array_epi(lbProcedure *p, lbValue s, isize index) { Type *st = base_type(type_deref(t)); GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); GB_ASSERT(0 <= index); - return lb_emit_gep(p, st, s.value, index); + return lb_emit_epi(p, s, index); +} +lbValue lb_emit_array_epi(lbModule *m, lbValue s, isize index) { + Type *t = s.type; + GB_ASSERT(is_type_pointer(t)); + Type *st = base_type(type_deref(t)); + GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); + GB_ASSERT(0 <= index); + return lb_emit_epi(m, s, index); } lbValue lb_emit_ptr_offset(lbProcedure *p, lbValue ptr, lbValue index) { @@ -1306,16 +1301,16 @@ lbValue lb_emit_matrix_epi(lbProcedure *p, lbValue s, isize row, isize column) { Type *mt = base_type(type_deref(t)); if (column == 0) { GB_ASSERT_MSG(is_type_matrix(mt) || is_type_array_like(mt), "%s", type_to_string(mt)); - return lb_emit_gep(p, mt, s.value, row); + return lb_emit_epi(p, s, row); } else if (row == 0 && is_type_array_like(mt)) { - return lb_emit_gep(p, mt, s.value, column); + return lb_emit_epi(p, s, column); } GB_ASSERT_MSG(is_type_matrix(mt), "%s", type_to_string(mt)); isize offset = matrix_indices_to_offset(mt, row, column); - return lb_emit_gep(p, mt, s.value, offset); + return lb_emit_epi(p, s, offset); } lbValue lb_emit_matrix_ep(lbProcedure *p, lbValue s, lbValue row, lbValue column) { |