Foundationপ্রথম নীতি থেকে
LEVEL 3 · Assembly Language

Compiler Optimization Level

কম্পাইলার অপ্টিমাইজেশন লেভেল

-O0 থেকে -O3 — কম্পাইলার কতগুলো optimization pass চালাবে তার পূর্বনির্ধারিত সংকলন। -O0 আক্ষরিক, প্রতিটা variable স্ট্যাকে, debugging-friendly; -O2 register-ভিত্তিক, দ্রুত, কিন্তু debugger-এ বিভ্রান্তিকর।

also: -O0, -O1, -O2, -O3, optimization level, -Og, -Os

Flagদর্শনDebug করা
-O0কোনো optimization না — ডিফল্টসবচেয়ে সহজ
-Ogdebugging-friendly optimizationতুলনামূলক সহজ
-O2প্রায় সব “নিরাপদ” optimizationকঠিন
-O3-O2 + loop unrolling, auto-vectorizationকঠিনতর
-Oscode size-এর জন্য optimizeকঠিন

-O0-এ প্রতিটা local variable-এর একটা fixed stack slot (register allocation pass বন্ধ), প্রতিটা source statement আলাদা, verbose instruction-block-এ — debugger-এ breakpoint/step করলে সবসময় predictable মান দেখায়।

; sum_array, -O0                    ; sum_array, -O2
movl -8(%rbp), %eax                 addl (%rdi,%rax,4), %ecx
cltq                                 addq $1, %rax
leaq 0(,%rax,4), %rdx               cmpq %rax, %rdx
movq -24(%rbp), %rax                jne .L3
addq %rdx, %rax
movl (%rax), %eax
addl %eax, -4(%rbp)

-O2-এ variable যতক্ষণ সম্ভব register-এ, memory access minimized, load+ALU প্রায়ই এক instruction-এ fuse হয় (addl (mem), %reg), branch মাঝে মাঝে cmov-এ elide হয়। কিন্তু frame pointer উধাও হতে পারে, instruction সোর্স-লাইনের সাথে ১-এ-১ না মিলতে পারে।

Undefined behavior optimization-কে বিপজ্জনক করে — কম্পাইলার UB নেই ধরে নেয়; UB থাকলে -O0-এ “কাজ করা” কোড -O2-এ ভিন্ন ফলাফল দিতে পারে। এটা optimizer-এর বাগ না, সোর্সের বাগ।

GCC-তে loop vectorization (-ftree-vectorize) -O3-এর অংশ, -O2-এর না — Clang-এ নিয়ম আলাদা।