From 4d7f26f16ee8826b404334654e011a6165aa73c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Bene=C5=A1?= Date: Wed, 29 Oct 2025 15:48:02 +0100 Subject: [PATCH 1/3] Mark unlikely calls in LLVM as cold --- libraries/llvm/forward-declare-c.ll | 4 ++-- libraries/llvm/panic.c | 2 ++ libraries/llvm/rts.ll | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/llvm/forward-declare-c.ll b/libraries/llvm/forward-declare-c.ll index a34fb1b79..491b4feef 100644 --- a/libraries/llvm/forward-declare-c.ll +++ b/libraries/llvm/forward-declare-c.ll @@ -6,8 +6,8 @@ declare %Pos @c_get_arg(i64) declare void @c_io_println(%Pos) declare %Pos @c_io_readln() -declare void @hole(i8*) -declare void @duplicated_prompt() +declare cold void @hole(i8*) +declare cold void @duplicated_prompt() declare %Pos @c_ref_fresh(%Pos) declare %Pos @c_ref_get(%Pos) diff --git a/libraries/llvm/panic.c b/libraries/llvm/panic.c index 7271f07c7..df9703575 100644 --- a/libraries/llvm/panic.c +++ b/libraries/llvm/panic.c @@ -7,11 +7,13 @@ // this should _morally_ be using `stderr`, but we don't tee it in tests // see PR #823 & issue #815 for context +__attribute__((cold)) void hole(const char* message) { printf("PANIC: %s not implemented yet\n", message); exit(1); } +__attribute__((cold)) void duplicated_prompt() { printf("PANIC: Continuation invoked itself\n"); exit(1); diff --git a/libraries/llvm/rts.ll b/libraries/llvm/rts.ll index 604d75a25..5c5763c35 100644 --- a/libraries/llvm/rts.ll +++ b/libraries/llvm/rts.ll @@ -406,8 +406,8 @@ define private void @invalidate(%Stack %stack, %Stack %end) { br i1 %isNull, label %error, label %check error: - call void @duplicated_prompt() - ret void + call cold void @duplicated_prompt() + unreachable check: %isEnd = icmp eq %Stack %next, %end From fd19a5694818991eebffe8fa35082bdcd0365ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Bene=C5=A1?= Date: Wed, 29 Oct 2025 15:57:20 +0100 Subject: [PATCH 2/3] Fix syntax --- libraries/llvm/rts.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/llvm/rts.ll b/libraries/llvm/rts.ll index 5c5763c35..9ea069159 100644 --- a/libraries/llvm/rts.ll +++ b/libraries/llvm/rts.ll @@ -406,7 +406,7 @@ define private void @invalidate(%Stack %stack, %Stack %end) { br i1 %isNull, label %error, label %check error: - call cold void @duplicated_prompt() + call void @duplicated_prompt() unreachable check: From b27b6517d2dd2575c71e984104e332e5e1eddd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Bene=C5=A1?= Date: Wed, 29 Oct 2025 16:03:18 +0100 Subject: [PATCH 3/3] Fix syntax again --- libraries/llvm/forward-declare-c.ll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/llvm/forward-declare-c.ll b/libraries/llvm/forward-declare-c.ll index 491b4feef..97e18fa88 100644 --- a/libraries/llvm/forward-declare-c.ll +++ b/libraries/llvm/forward-declare-c.ll @@ -6,8 +6,8 @@ declare %Pos @c_get_arg(i64) declare void @c_io_println(%Pos) declare %Pos @c_io_readln() -declare cold void @hole(i8*) -declare cold void @duplicated_prompt() +declare void @hole(i8*) cold +declare void @duplicated_prompt() cold declare %Pos @c_ref_fresh(%Pos) declare %Pos @c_ref_get(%Pos)