diff options
| author | Marc Tiehuis <marctiehuis@gmail.com> | 2019-03-02 00:44:52 +1300 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-03-01 08:23:11 -0500 |
| commit | c4887d7f5430b38787ec01368ab7eba1537f0487 (patch) | |
| tree | 450a3637d355756236028e78759f023c2e761e1d /src | |
| parent | 76b4e49178b72fb9b01e97aa6b46f9d5bdb83ab2 (diff) | |
| download | zig-c4887d7f5430b38787ec01368ab7eba1537f0487.tar.gz zig-c4887d7f5430b38787ec01368ab7eba1537f0487.zip | |
Use bitwise-and instead of modulo in __zig_return_error
Avoids emitting compiler-rt div calls on some targets.
Diffstat (limited to 'src')
| -rw-r--r-- | src/all_types.hpp | 3 | ||||
| -rw-r--r-- | src/codegen.cpp | 7 |
2 files changed, 6 insertions, 4 deletions
diff --git a/src/all_types.hpp b/src/all_types.hpp index 902c6e13c2..228e2e60a0 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -3463,7 +3463,8 @@ static const size_t err_union_err_index = 0; static const size_t err_union_payload_index = 1; // TODO call graph analysis to find out what this number needs to be for every function -static const size_t stack_trace_ptr_count = 30; +// MUST BE A POWER OF TWO. +static const size_t stack_trace_ptr_count = 32; // these belong to the async function #define RETURN_ADDRESSES_FIELD_NAME "return_addresses" diff --git a/src/codegen.cpp b/src/codegen.cpp index 0d6a8a7f50..3a9efc9fa9 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1236,7 +1236,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->type_ref; - // stack_trace.instruction_addresses[stack_trace.index % stack_trace.instruction_addresses.len] = return_address; + // stack_trace.instruction_addresses[stack_trace.index & (stack_trace.instruction_addresses.len - 1)] = return_address; LLVMValueRef err_ret_trace_ptr = LLVMGetParam(fn_val, 0); LLVMValueRef address_value = LLVMGetParam(fn_val, 1); @@ -1254,9 +1254,10 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { LLVMValueRef len_value = gen_load_untyped(g, len_field_ptr, 0, false, ""); LLVMValueRef index_val = gen_load_untyped(g, index_field_ptr, 0, false, ""); - LLVMValueRef modded_val = LLVMBuildURem(g->builder, index_val, len_value, ""); + LLVMValueRef len_val_minus_one = LLVMBuildSub(g->builder, len_value, LLVMConstInt(usize_type_ref, 1, false), ""); + LLVMValueRef masked_val = LLVMBuildAnd(g->builder, index_val, len_val_minus_one, ""); LLVMValueRef address_indices[] = { - modded_val, + masked_val, }; LLVMValueRef ptr_value = gen_load_untyped(g, ptr_field_ptr, 0, false, ""); |
