Llvm

mohitmishra786/low-level-dev-skills/skills/compilers/llvm

by mohitmishra786bdc58472fa9fNo license253 starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 3 months ago

LLVM IR and pass pipeline skill. Use when working directly with LLVM Intermediate Representation (IR), running opt passes, generating IR with llc, inspecting or writing LLVM IR for custom passes, or understanding how the LLVM backend lowers IR to assembly. Activates on queries about LLVM IR, opt, llc, llvm-dis, LLVM passes, IR transformations, or building LLVM-based tools.

Instructions onlySoftware Development
AI-generated overview

Guides agents through using LLVM tooling to generate, inspect, optimise and lower LLVM IR.

What it does
This skill explains how to work with LLVM Intermediate Representation as a user: emitting textual IR or bitcode with clang, running optimisation passes with opt, lowering IR to assembly or object files with llc, and inspecting IR constructs. It also covers diagnosing missed optimisations and lists useful LLVM utilities such as llvm-dis, llvm-as, llvm-link and llvm-mca. It produces command guidance and reference explanations rather than files or code of its own.
When to use it
Use it when you need to generate or read LLVM IR, run or debug opt pass pipelines, lower IR with llc, or understand why an optimisation such as auto-vectorisation did not happen. It is aimed at using LLVM tools, not at authoring new LLVM passes.
Requirements
Requires an LLVM toolchain (clang, opt, llc and related llvm-* tools) available in the environment. Instructions only; no scripts are shipped.

LLVM IR and Tooling

Purpose

Guide agents through LLVM as a user: generating and inspecting IR, running existing optimisation passes with opt, lowering to assembly with llc, and diagnosing missed optimisations. For writing new LLVM passes (PassPlugin, llvm-lit testing), use skills/compiler-internals/llvm-passes instead.

Triggers

  • "Show me the LLVM IR for this function"
  • "How do I run an LLVM optimisation pass?"
  • "What does this LLVM IR instruction mean?"
  • "How do I write a custom LLVM pass?"
  • "Why isn't auto-vectorisation happening in LLVM?"

Workflow

1. Generate LLVM IR

bash
# Emit textual IR (.ll)clang -O0 -emit-llvm -S src.c -o src.ll
# Emit bitcode (.bc)clang -O2 -emit-llvm -c src.c -o src.bc
# Disassemble bitcode to textllvm-dis src.bc -o src.ll

2. Run optimisation passes with opt

bash
# Apply a specific passopt -passes='mem2reg,instcombine,simplifycfg' src.ll -S -o out.ll
# Standard optimisation pipelinesopt -passes='default<O2>' src.ll -S -o out.llopt -passes='default<O3>' src.ll -S -o out.ll
# List available passesopt --print-passes 2>&1 | less
# Print IR before and after a passopt -passes='instcombine' --print-before=instcombine --print-after=instcombine src.ll -S -o out.ll 2>&1 | less

3. Lower IR to assembly with llc

bash
# Compile IR to object filellc -filetype=obj src.ll -o src.o
# Compile to assemblyllc -filetype=asm -masm-syntax=intel src.ll -o src.s
# Target a specific CPUllc -mcpu=skylake -mattr=+avx2 src.ll -o src.s
# Show available targetsllc --version

4. Inspect IR

Key IR constructs to understand:

ConstructMeaning
allocaStack allocation (pre-SSA; mem2reg promotes to registers)
load/storeMemory access
getelementptr (GEP)Pointer arithmetic / field access
phiSSA φ-node: merges values from predecessor blocks
call/invokeFunction call (invoke has exception edges)
icmp/fcmpInteger/float comparison
brBranch (conditional or unconditional)
retReturn
bitcastReinterpret bits (no-op in codegen)
ptrtoint/inttoptrPointer↔integer (avoid where possible)

5. Key passes

PassEffect
mem2regPromote alloca to SSA registers
instcombineInstruction combining / peephole
simplifycfgCFG cleanup, dead block removal
loop-vectorizeAuto-vectorisation
slp-vectorizeSuperword-level parallelism (straight-line vectorisation)
inlineFunction inlining
gvnGlobal value numbering (common subexpression elimination)
licmLoop-invariant code motion
loop-unrollLoop unrolling
argpromotionPromote pointer args to values
sroaScalar Replacement of Aggregates

6. Debugging missed optimisations

bash
# Why was a loop not vectorised?clang -O2 -Rpass-missed=loop-vectorize -Rpass-analysis=loop-vectorize src.c
# Dump pass pipelineclang -O2 -mllvm -debug-pass=Structure src.c -o /dev/null 2>&1 | less
# Print IR after each pass (very verbose)opt -passes='default<O2>' -print-after-all src.ll -S 2>&1 | less

7. Useful llvm tools

ToolPurpose
llvm-disBitcode → textual IR
llvm-asTextual IR → bitcode
llvm-linkLink multiple bitcode files
llvm-ltoStandalone LTO
llvm-nmSymbols in bitcode/object
llvm-objdumpDisassemble objects
llvm-profdataMerge/show PGO profiles
llvm-covCoverage reporting
llvm-mcaMachine code analyser (throughput/latency)

For binutils equivalents, see skills/binaries/binutils.

Related skills

  • Use skills/compiler-internals/llvm-passes for writing and testing custom LLVM passes
  • Use skills/compiler-internals/compiler-frontend for generating LLVM IR from an AST
  • Use skills/compiler-internals/jit-compilation for ORC JIT execution of LLVM IR
  • Use skills/compilers/clang for source-level Clang flags
  • Use skills/binaries/linkers-lto for LTO at link time
  • Use skills/profilers/linux-perf combined with llvm-mca for micro-architectural analysis

Source and attribution

Source:mohitmishra786/low-level-dev-skillsinskills/compilers/llvmat commitbdc5847

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal