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 # false

How 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

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 = 4
A 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+0

You can also download the manifest file and the project file.