<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LLVM on Cedric Bail</title><link>http://bluebugs.github.io/tags/llvm/</link><description>Recent content in LLVM on Cedric Bail</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 15 Apr 2026 10:02:00 -0700</lastBuildDate><atom:link href="http://bluebugs.github.io/tags/llvm/index.xml" rel="self" type="application/rss+xml"/><item><title>How SPMD Lives in the Compiler: Lessons from Building It</title><link>http://bluebugs.github.io/blogs/spmd-compiler-internals/</link><pubDate>Wed, 15 Apr 2026 10:02:00 -0700</pubDate><guid>http://bluebugs.github.io/blogs/spmd-compiler-internals/</guid><description>&lt;p>We added a way to express data parallelism in idiomatic Go. Earlier discussions around this space often stalled on a simple question: how would it actually work in the compiler? A working proof of concept that compiles &lt;code>go for&lt;/code> loops to WASM SIMD128, x86 SSE, and x86 AVX2, with end-to-end tests passing and a base64 decoder reaching ~77% of simdutf C++ throughput, is a better answer than another round of speculation. The goal here is to make the implementation strategy concrete. Along the way we learned one lesson the hard way: &lt;strong>SPMD is a compiler feature that has to live at the heart of the SSA form.&lt;/strong> Everything else follows from that.&lt;/p>
&lt;p>This article is for compiler engineers. If you want to see the benchmarks and the short version, read &lt;a href="../spmd-results/">the overview&lt;/a>. If you want to write SPMD Go code, the &lt;a href="../writing-spmd-go/">practical guide&lt;/a> is for you. Here, we talk about what we built inside the compiler, what we got wrong, and what we would do differently.&lt;/p></description></item></channel></rss>