FunctionProperties.jl: Compiler-Based Proofs of Function Properties
FunctionProperties.jl is a package which contains utilities for testing the properties of Julia functions. For example, do you need to know if f has internal branches (if statements) in order to know if a given AD optimization or symbolic pass is valid? This package's functions allows you to perform such analyses on functions from a user's code by doing a compiler-based code inspection.
Installation
To install FunctionProperties.jl, use the Julia package manager:
using Pkg
Pkg.add("FunctionProperties")Example
@test hasbranching(1, 2) do x, y
(x < 0 ? -x : x) + exp(y)
end # true
@test hasbranching(1, 2) do x, y
ifelse(x < 0, -x, x) + exp(y)
end # falseHow does this package work internally?
hasbranching inspects the type-inferred but unoptimized IR of the function (via code_typed(f, argtypes; optimize = false)) and checks for GotoIfNot nodes, which represent value-dependent conditional branches. Constructs that do not introduce data-dependent control flow, such as ifelse, do not produce GotoIfNot nodes and are therefore reported as branch-free.
If a function produces a false positive because its branches are known to resolve at compile time, opt it out with is_leaf.
Contributing
Please refer to the SciML ColPrac: Contributor's Guide on Collaborative Practices for Community Packages for guidance on PRs, issues, and other matters relating to contributing to SciML.
See the SciML Style Guide for common coding practices and other style decisions.
There are a few community forums:
- The #diffeq-bridged and #sciml-bridged channels in the Julia Slack
- The #diffeq-bridged and #sciml-bridged channels in the Julia Zulip
- On the Julia Discourse forums
- See also SciML Community page
Reproducibility
The documentation of this SciML package was built using these direct dependencies,
Status `~/_work/FunctionProperties.jl/FunctionProperties.jl/docs/Project.toml`
[e30172f5] Documenter v1.19.0
[f62d2435] FunctionProperties v1.0.0 `~/_work/FunctionProperties.jl/FunctionProperties.jl`and using this machine and Julia version.
Julia Version 1.13.1
Commit 96ca370cf0e (2026-09-25 19:34 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 112 × AMD EPYC 7663 56-Core Processor
WORD_SIZE: 64
LLVM: libLLVM-20.1.8 (ORCJIT, znver3)
GC: Built with stock GC
Threads: 1 default, 1 interactive, 1 GC (on 4 virtual cores)
Environment:
JULIA_CPU_THREADS = 4
JULIA_NUM_PRECOMPILE_TASKS = 4A more complete overview of all dependencies and their versions is also provided.
Status `~/_work/FunctionProperties.jl/FunctionProperties.jl/docs/Manifest.toml`
[a4c015fc] ANSIColoredPrinters v0.0.1
[1520ce14] AbstractTrees v0.4.5
[944b1d66] CodecZlib v0.7.9
[ffbed154] DocStringExtensions v0.9.5
[e30172f5] Documenter v1.19.0
[f62d2435] FunctionProperties v1.0.0 `~/_work/FunctionProperties.jl/FunctionProperties.jl`
[d7ba0133] Git v1.5.0
[b5f81e59] IOCapture v1.0.0
[692b3bcd] JLLWrappers v1.8.0
[682c06a0] JSON v1.10.0
[0e77f7df] LazilyInitializedFields v1.3.0
[d0879d2d] MarkdownAST v0.1.3
[69de0a69] Parsers v3.0.0
[aea7be01] PrecompileTools v1.3.4
[21216c6a] Preferences v1.6.0
[2792f1a3] RegistryInstances v0.1.0
[ec057cc2] StructUtils v2.9.2
[3bb67fe8] TranscodingStreams v0.11.3
[2e619515] Expat_jll v2.8.4+0
[020c3dae] Git_LFS_jll v3.7.1+0
[f8c6e375] Git_jll v2.56.0+0
[94ce4f54] Libiconv_jll v1.18.0+0
[9bd350c2] OpenSSH_jll v10.6.1+0
[0dad84c5] ArgTools v1.1.2
[56f22d72] Artifacts v1.11.0
[2a0f44e3] Base64 v1.11.0
[ade2ca70] Dates v1.11.0
[f43a241f] Downloads v1.7.0
[7b1f6079] FileWatching v1.11.0
[b77e0a4c] InteractiveUtils v1.11.0
[ac6e5ff7] JuliaSyntaxHighlighting v1.12.0
[b27032c2] LibCURL v1.0.0
[76f85450] LibGit2 v1.11.0
[8f399da3] Libdl v1.11.0
[56ddb016] Logging v1.11.0
[d6f4376e] Markdown v1.11.0
[ca575930] NetworkOptions v1.3.0
[44cfe95a] Pkg v1.13.0
[de0858da] Printf v1.11.0
[3fa0cd96] REPL v1.11.0
[9a3f8284] Random v1.11.0
[ea8e919c] SHA v1.0.0
[9e88b42a] Serialization v1.11.0
[6462fe0b] Sockets v1.11.0
[f489334b] StyledStrings v1.11.0
[fa267f1f] TOML v1.0.3
[a4e569a6] Tar v1.10.0
[8dfed614] Test v1.11.0
[cf7118a7] UUIDs v1.11.0
[4ec0a83e] Unicode v1.11.0
[e66e0078] CompilerSupportLibraries_jll v1.5.5+2
[deac9b47] LibCURL_jll v8.18.0+1
[e37daf67] LibGit2_jll v1.9.1+0
[29816b5a] LibSSH2_jll v1.11.104+0
[14a3606d] MozillaCACerts_jll v2026.8.13
[458c3c95] OpenSSL_jll v3.5.6+0
[efcefdf7] PCRE2_jll v10.46.0+0
[83775a58] Zlib_jll v1.3.1+2
[3161d3a3] Zstd_jll v1.5.7+1
[8e850ede] nghttp2_jll v1.67.1+0
[3f19e933] p7zip_jll v17.8.2+0You can also download the manifest file and the project file.