Belajar LLVM IR - Fundamentals
Episode 4 of 28

Belajar LLVM IR - Fundamentals

Memahami LLVM IR sebagai RISC-like low-level ISA, SSA form (static single assignment), hierarki module → function → basic block → instruction, serta tipe data int, float, pointer, struct, vector, dan function type — dengan praktik dump IR dari program C.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 3 kita memahami struktur proyek LLVM dan cara build dari source, pada episode ini kita memasuki jantung LLVM: LLVM IR (Intermediate Representation).

LLVM IR adalah bahasa assembly textual yang berada di tengah-tengah antara source code tingkat tinggi dan assembly target spesifik. Memahami IR adalah kunci untuk menulis pass optimasi (episode 7-8), membangun front-end (episode 10-13), dan menggunakan LLVM API (episode 9). Tanpa pemahaman IR yang solid, semua topik lanjutan akan terasa seperti menghafal tanpa mengerti.

Apa Itu LLVM IR?

LLVM IR adalah Intermediate Representation — format representasi kode yang bukan source code tingkat tinggi dan bukan assembly target spesifik. IR ini dirancang sebagai RISC-like low-level ISA yang cukup dekat dengan hardware untuk optimasi performa, tetapi cukup abstrak untuk menjadi target front-end bahasa apapun.

Tiga bentuk LLVM IR:

BentukKegunaan
Textual (.ll)Dibaca manusia, diedit manual, ditampilkan di terminal
Bitcode (.bc)Binary format, lebih kompak, lebih cepat diproses
In-memoryRepresentasi di memori saat optimasi berjalan

SSA Form: Konsep Kunci

LLVM IR menggunakan SSA (Static Single Assignment) — setiap variabel hanya di-assign tepat sekali. Konsekuensinya: tidak ada "mutation" variabel; untuk mengubah nilai, kalian membuat variabel baru.

Contoh SSA: setiap variabel hanya di-assign sekali
%x1 = add i32 1, 2
%x2 = add i32 %x1, 3
ret i32 %x2

SSA memudahkan optimasi: karena setiap nilai punya tepat satu definisi, analisis data-flow jauh lebih sederhana. Kita akan melihat bagaimana mem2reg mengonversi memory access ke SSA di episode 8.

Hierarki: Module → Function → BasicBlock → Instruction

100%
  • Module: Container teratas. Berisi semua function, global variable, dan metadata.
  • Function: Kumpulan basic blocks. Bisa declare (external) atau define (implementation).
  • BasicBlock: Sequence instruksi tanpa branch di tengah. Diakhiri terminator (ret, br, switch).
  • Instruction: Operasi tunggal (add, load, store, br, call).

Tipe Data dalam LLVM IR

TipeContohKeterangan
Integeri1, i8, i32, i641 bit sampai 64 bit (atau lebih)
Floating pointfloat, doubleIEEE 754
PointerptrOpaque pointers (LLVM 15+, tidak ada lagi i32*)
Struct%struct.Name = { i32, float }Struct definisi
Vector<4 x float>SIMD vector tetap
Array[10 x i32]Array statis
Functioni32 (i32, i32)*Function pointer

Note

LLVM 15+ menggunakan opaque pointers — semua pointer memiliki tipe ptr tanpa menunjuk ke tipe tertentu. Ini menyederhanakan IR dan mengurangi kebutuhan bitcast. Jika kalian membaca tutorial lama yang masih memakai i32* atau float*, ketahuilah bahwa ini sudah deprecated.

Praktik: Dump IR dari Program C

Cara paling cepat mempelajari IR: tulis program C sederhana, lalu dump IR-nya:

Cprogram.c
int add(int a, int b) {
    return a + b;
}
 
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

Dump IR:

Dump LLVM IR dari program C
clang -emit-llvm -S -o - program.c

Hasilnya adalah .ll file yang bisa kalian baca dan edit. Mari kita bedah satu bagian:

LLVM IR untuk fungsi add
define i32 @add(i32 %a, i32 %b) {
entry:
  %result = add i32 %a, %b
  ret i32 %result
}
ElemenArti
define i32 @addFungsi bernama add yang mengembalikan i32
(i32 %a, i32 %b)Dua parameter: %a dan %b
entry:Basic block pertama
%result = add i32 %a, %bInstruksi add operasi integer
ret i32 %resultReturn hasil

Perhatikan: setiap nilai (%a, %b, %result) hanya di-assign sekali — itulah SSA.

Penutup

Inti yang harus dibawa pulang:

  • LLVM IR adalah RISC-like low-level ISA yang menjadi jembatan antara source code dan assembly.
  • SSA form: setiap variabel hanya di-assign satu kali — kunci untuk optimasi data-flow.
  • Hierarki: Module → Function → BasicBlock → Instruction.
  • Tipe utama: i1/i8/i32/i64, float/double, ptr, struct, vector, array, function.
  • Gunakan clang -emit-llvm -S untuk dump IR dari program C.

Di episode 5 selanjutnya kita akan belajar menulis & membaca .ll manual — syntax global, define, attributes, unnamed values, serta tools llvm-as, llvm-dis, dan opt -verify. Kita akan menulis fungsi aritmatika dan rekursif murni dalam teks IR tanpa bahasa sumber. Sampai jumpa di episode 5!