Compile in different optimization modes

This commit is contained in:
David Gonzalez Martin 2024-07-24 11:00:17 +02:00
parent 43472683b3
commit 5174819a5b
3 changed files with 61 additions and 36 deletions

View File

@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Build and test - name: Build and test
run: | run: |
./run_tests.sh ./run_tests.sh 1
# macos_build_and_test: # macos_build_and_test:
# runs-on: macos-latest # runs-on: macos-latest
# timeout-minutes: 15 # timeout-minutes: 15

View File

@ -857,7 +857,7 @@ fn int syscall_fstat(int fd, struct stat *buffer)
#endif #endif
} }
fn u64 file_get_size(int fd) may_be_unused fn u64 file_get_size(int fd)
{ {
struct stat stat_buffer; struct stat stat_buffer;
int stat_result = syscall_fstat(fd, &stat_buffer); int stat_result = syscall_fstat(fd, &stat_buffer);
@ -1282,13 +1282,13 @@ fn String arena_join_string(Arena* arena, Slice(String) pieces)
memcpy(it, piece.pointer, piece.length); memcpy(it, piece.pointer, piece.length);
it += piece.length; it += piece.length;
} }
assert(it - pointer == size); assert((u64)(it - pointer) == size);
*it = 0; *it = 0;
return (String) { .pointer = pointer, .length = size }; return (String) { .pointer = pointer, .length = size };
} }
#define arena_allocate(arena, T, count) arena_allocate_bytes(arena, sizeof(T) * count, alignof(T)) #define arena_allocate(arena, T, count) (T*)(arena_allocate_bytes(arena, sizeof(T) * count, alignof(T)))
#define arena_allocate_slice(arena, T, count) (Slice(T)){ .pointer = arena_allocate(arena, T, count), .length = count } #define arena_allocate_slice(arena, T, count) (Slice(T)){ .pointer = arena_allocate(arena, T, count), .length = count }
fn void arena_reset(Arena* arena) fn void arena_reset(Arena* arena)
@ -1323,16 +1323,18 @@ fn s32 string_map_find_slot(StringMap* map, u32 original_index, String key, u32
for (u32 i = 0; i < existing_capacity; i += 1) for (u32 i = 0; i < existing_capacity; i += 1)
{ {
auto index = it_index & (existing_capacity - 1); auto index = it_index & (existing_capacity - 1);
u32 key = map->pointer[index]; u32 existing_key = map->pointer[index];
// Not set // Not set
if (key == 0) if (existing_key == 0)
{ {
result = index; result = index;
break; break;
} }
else else
{ {
unused(value);
unused(key);
trap(); trap();
} }
@ -1467,7 +1469,8 @@ fn int file_write(String file_path, String file_data)
assert(file_descriptor != -1); assert(file_descriptor != -1);
auto bytes = syscall_write(file_descriptor, file_data.pointer, file_data.length); auto bytes = syscall_write(file_descriptor, file_data.pointer, file_data.length);
assert(bytes == file_data.length); assert(bytes >= 0);
assert((u64)bytes == file_data.length);
int close_result = syscall_close(file_descriptor); int close_result = syscall_close(file_descriptor);
assert(close_result == 0); assert(close_result == 0);
@ -1487,7 +1490,7 @@ fn String file_read(Arena* arena, String path)
u64 file_size = stat_buffer.st_size; u64 file_size = stat_buffer.st_size;
result = (String){ result = (String){
.pointer = (u8*)arena_allocate_bytes(arena, file_size, 64), .pointer = arena_allocate_bytes(arena, file_size, 64),
.length = file_size, .length = file_size,
}; };
@ -1721,12 +1724,12 @@ fn u8* vb_generic_add_assume_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32
return vb->pointer + (index * item_size); return vb->pointer + (index * item_size);
} }
fn u8* vb_generic_append_assume_capacity(VirtualBuffer(u8)* vb, void* item_pointer, u32 item_size, u32 item_count) // fn u8* vb_generic_append_assume_capacity(VirtualBuffer(u8)* vb, void* item_pointer, u32 item_size, u32 item_count)
{ // {
u8* new_memory = vb_generic_add_assume_capacity(vb, item_size, item_count); // u8* new_memory = vb_generic_add_assume_capacity(vb, item_size, item_count);
memcpy(new_memory, item_pointer, item_size * item_count); // memcpy(new_memory, item_pointer, item_size * item_count);
return new_memory; // return new_memory;
} // }
fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count)
{ {
@ -1735,11 +1738,11 @@ fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count)
} }
fn u8* vb_generic_append(VirtualBuffer(u8)* vb, void* item_pointer, u32 item_size, u32 item_count) // fn u8* vb_generic_append(VirtualBuffer(u8)* vb, void* item_pointer, u32 item_size, u32 item_count)
{ // {
vb_generic_ensure_capacity(vb, item_size, item_count); // vb_generic_ensure_capacity(vb, item_size, item_count);
return vb_generic_append_assume_capacity(vb, item_pointer, item_size, item_count); // return vb_generic_append_assume_capacity(vb, item_pointer, item_size, item_count);
} // }
#define vb_add(a, count) (typeof((a)->pointer)) vb_generic_add((VirtualBuffer(u8)*)(a), sizeof(*((a)->pointer)), count) #define vb_add(a, count) (typeof((a)->pointer)) vb_generic_add((VirtualBuffer(u8)*)(a), sizeof(*((a)->pointer)), count)
#define vb_append_one(a, item) (typeof((a)->pointer)) vb_generic_append((VirtualBuffer(u8)*)(a), &(item), sizeof(*((a)->pointer)), 1) #define vb_append_one(a, item) (typeof((a)->pointer)) vb_generic_append((VirtualBuffer(u8)*)(a), &(item), sizeof(*((a)->pointer)), 1)
@ -4705,7 +4708,7 @@ void entry_point(int argc, const char* argv[])
arguments.pointer = arena_allocate(global_arena, String, argc); arguments.pointer = arena_allocate(global_arena, String, argc);
arguments.length = argc; arguments.length = argc;
for (u32 i = 0; i < argc; i += 1) for (int i = 0; i < argc; i += 1)
{ {
u64 len = strlen(argv[i]); u64 len = strlen(argv[i]);
arguments.pointer[i] = (String) { arguments.pointer[i] = (String) {
@ -4736,15 +4739,15 @@ void entry_point(int argc, const char* argv[])
NodeIndex start_node_index = function->start; NodeIndex start_node_index = function->start;
NodeIndex stop_node_index = function->stop; NodeIndex stop_node_index = function->stop;
iterate_peepholes(thread, stop_node_index); iterate_peepholes(thread, stop_node_index);
print_string(strlit("Before optimizations\n")); // print_string(strlit("Before optimizations\n"));
print_function(thread, function); // print_function(thread, function);
gcm_build_cfg(thread, start_node_index, stop_node_index); gcm_build_cfg(thread, start_node_index, stop_node_index);
print_string(strlit("After optimizations\n")); // print_string(strlit("After optimizations\n"));
print_function(thread, function); // print_function(thread, function);
} }
auto lowered_source = c_lower(thread); auto lowered_source = c_lower(thread);
print("Transpiled to C:\n```\n{s}\n```\n", lowered_source); // print("Transpiled to C:\n```\n{s}\n```\n", lowered_source);
auto c_source_path = arena_join_string(thread->arena, (Slice(String)) array_to_slice(((String[]) { auto c_source_path = arena_join_string(thread->arena, (Slice(String)) array_to_slice(((String[]) {
strlit("nest/"), strlit("nest/"),

View File

@ -2,25 +2,47 @@
set -e set -e
source ./compile.sh source ./compile.sh
all=$1
build_dir="build" build_dir="build"
exe_name="nest" exe_name="nest"
exe_path=$build_dir/$exe_name exe_path=$build_dir/$exe_name
debug_flags="-g" debug_flags="-g"
no_optimization_flags="" no_optimization_flags=""
optimization_flags="-O3 -march=native"
test_names="first" test_names="first"
compile $build_dir $exe_name $debug_flags $no_optimization_flags; if [ "$all" == "1" ]
then
optimization_modes=("" "-O1" "-O2 march=native", "-Os march=native" "-Oz march=native" "-O3 march=native")
else
optimization_modes=("")
fi
printf "\n======================\n" for optimization_mode in "${optimization_modes[@]}"
printf "TESTS"
printf "\n======================\n\n"
for test_name in "${test_names[@]}"
do do
echo "$test_name..."
build/nest "tests/$test_name.nat" printf "\n===========================\n"
echo "$test_name [COMPILATION] [OK]" echo "TESTS ($optimization_mode)"
nest/$test_name printf "===========================\n\n"
echo "$test_name [RUN] [OK]"
compile $build_dir $exe_name $debug_flags $optimization_mode;
printf "\n===========================\n"
echo "COMPILER BUILD OK"
printf "===========================\n\n"
for test_name in "${test_names[@]}"
do
printf "\n===========================\n"
echo "$test_name..."
printf "===========================\n\n"
build/nest "tests/$test_name.nat"
printf "\n===========================\n"
echo "$test_name [COMPILATION] [OK]"
printf "===========================\n\n"
nest/$test_name
printf "\n===========================\n"
echo "$test_name [RUN] [OK]"
printf "===========================\n\n"
done
done done