From b77f254ab14cb0fd91a8e1a9bd5ef7211db86b85 Mon Sep 17 00:00:00 2001 From: Dmitry Atamanov Date: Thu, 24 Aug 2023 17:19:09 +0500 Subject: [PATCH] Tune `@expect`, `@likely`, `@unlikely` and `@prefetch` macros. --- lib/std/core/builtin.c3 | 45 +++++++++++++++++---------- lib/std/core/env.c3 | 3 ++ test/test_suite/builtins/prefetch.c3t | 2 +- test/unit/stdlib/core/builtintests.c3 | 2 +- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/lib/std/core/builtin.c3 b/lib/std/core/builtin.c3 index 774f6b41a..99273abec 100644 --- a/lib/std/core/builtin.c3 +++ b/lib/std/core/builtin.c3 @@ -193,11 +193,14 @@ macro enum_by_name($Type, String enum_name) @builtin **/ macro bool @likely(bool #value, $probability = 1.0) @builtin { - $if $probability == 1.0: - return $$expect(#value, true); - $else - return $$expect_with_probability(#value, true, $probability); - $endif + $switch + $case env::BUILTIN_EXPECT_IS_DISABLED: + return #value; + $case $probability == 1.0: + return $$expect(#value, true); + $default: + return $$expect_with_probability(#value, true, $probability); + $endswitch } /** @@ -209,11 +212,14 @@ macro bool @likely(bool #value, $probability = 1.0) @builtin **/ macro bool @unlikely(bool #value, $probability = 1.0) @builtin { - $if $probability == 1.0: - return $$expect(#value, false); - $else - return $$expect_with_probability(#value, false, $probability); - $endif + $switch + $case env::BUILTIN_EXPECT_IS_DISABLED: + return #value; + $case $probability == 1.0: + return $$expect(#value, false); + $default: + return $$expect_with_probability(#value, false, $probability); + $endswitch } /** @@ -223,11 +229,14 @@ macro bool @unlikely(bool #value, $probability = 1.0) @builtin **/ macro @expect(#value, expected, $probability = 1.0) @builtin { - $if $probability == 1.0: - return $$expect(#value, ($typeof(#value))expected); - $else - return $$expect_with_probability(#value, expected, $probability); - $endif + $switch + $case env::BUILTIN_EXPECT_IS_DISABLED: + return #value == expected; + $case $probability == 1.0: + return $$expect(#value, ($typeof(#value))expected); + $default: + return $$expect_with_probability(#value, expected, $probability); + $endswitch } /** @@ -249,9 +258,11 @@ enum PrefetchLocality * @param $locality `Locality ranging from none to extremely local` * @param $write `Prefetch for write, otherwise prefetch for read.` **/ -macro prefetch(void* ptr, PrefetchLocality $locality = VERY_NEAR, bool $write = false) @builtin +macro @prefetch(void* ptr, PrefetchLocality $locality = VERY_NEAR, bool $write = false) @builtin { - $$prefetch(ptr, $write ? 1 : 0, $locality.ordinal); + $if !env::BUILTIN_PREFETCH_IS_DISABLED: + $$prefetch(ptr, $write ? 1 : 0, $locality.ordinal); + $endif } macro swizzle(v, ...) @builtin diff --git a/lib/std/core/env.c3 b/lib/std/core/env.c3 index 59623cd2d..154a79159 100644 --- a/lib/std/core/env.c3 +++ b/lib/std/core/env.c3 @@ -179,3 +179,6 @@ macro bool os_is_posix() return false; $endswitch } + +const BUILTIN_EXPECT_IS_DISABLED = $feature(DISABLE_BUILTIN_EXPECT); +const BUILTIN_PREFETCH_IS_DISABLED = $feature(DISABLE_BUILTIN_PREFETCH); diff --git a/test/test_suite/builtins/prefetch.c3t b/test/test_suite/builtins/prefetch.c3t index b2efdfc42..4bb042e60 100644 --- a/test/test_suite/builtins/prefetch.c3t +++ b/test/test_suite/builtins/prefetch.c3t @@ -7,7 +7,7 @@ fn void main() int a; $$prefetch(&a, 1, 3); $$prefetch(&a, 0, 1); - prefetch(&a); + @prefetch(&a); } /* #expect: test.ll diff --git a/test/unit/stdlib/core/builtintests.c3 b/test/unit/stdlib/core/builtintests.c3 index 7b0f886c8..a1abe2945 100644 --- a/test/unit/stdlib/core/builtintests.c3 +++ b/test/unit/stdlib/core/builtintests.c3 @@ -57,7 +57,7 @@ int abc; fn void test_prefetch() { - prefetch(&abc); + @prefetch(&abc); } fn void test_hash()