Get the latest tech news

How Clang compiles a function (2018)


I’ve been planning on writing a post about how LLVM optimizes a function, but it seems necessary to first write about how Clang translates C or C++ into LLVM. This is going to be fairly high-level: - rather than looking at Clang’s internals, I’m going to focus on how Clang’s output relates to its input - we’re not going to look at any non-trivial C++ features We’ll use this small function that I borrowed from these excellent lecture notes on loop optimizations: bool is_sorted(int *a, int n) { for (int i = 0; i < n - 1; i++) if (a[i] > a[i + 1]) return false; return true; } Since Clang doesn’t do any optimization, and since LLVM IR was initially designed as a target for C and C++, the translation is going to be relatively easy.

Textual IR is bulky and not particularly fast to print or parse; the binary “bitcode” format is always preferred when a human isn’t in the loop. This may all seem confusing and arbitrary but these design decisions have been found to allow many parts of a compiler to be expressed in natural and efficient ways. I haven’t seen the measurements but my understanding is that generating a lot of memory operations and then almost immediately optimizing many of them away isn’t a major source of compile-time overhead.

Get the Android app

Or read this on Hacker News

Read more on:

Photo of Function

Function

Photo of Clang

Clang

Related news:

News photo

Groq’s open-source Llama AI model tops leaderboard, outperforming GPT-4o and Claude in function calling

News photo

Samsung’s new Galaxy Buds are blatant AirPod clones in both form and function

News photo

How GCC and Clang handle statically known undefined behaviour