$30 off During Our Annual Pro Sale. View Details »

GCC

Avatar for note35 note35
October 06, 2025

 GCC

This is a study report from my time on the Compiler team at Marvell. It covers how the GCC back-end generates and optimizes machine code.

Avatar for note35

note35

October 06, 2025
Tweet

More Decks by note35

Other Decks in Research

Transcript

  1. Outline Chapter1 - Compile r – Complication … P 3

    – GCC compiler … P1 2 Chapter2 - GCC Source Code – Configuration & Building … P1 7 – Cross Compile GCC compiler … P2 1 Chapter3 - Gray box probing of GC C – Gray box probing of GCC … P2 9 – Passes … P3 3 – Gimple Optimization … P4 6 Reference … P57  2
  2. Binding conceptualizing Programming Compile linking loading Executing Problem Algorithm, Data

    Structure, Strategy Function, Variable, Type、Control Flow Instruction, Register Function addressing, library Code, Data addressing Value of Variable unbind object time  4
  3.  5 Problem Algorithm, Data Structure, Strategy Function, Variable, Type、Control

    Flow Instruction, Register Function addressing, library Code, Data addressing Value of Variable unbind object time Binding conceptualizing Programming Compile linking loading Executing
  4. Interpreter VS Compiler Source Program Inpu t Data  6

    Interpreter Machine Develo p Flexibility
  5. Model Front-End Optimizer Code Generator AST Ind. IR Targe t

    Program Front-End Expander Optimizer Recognizer AST Register Transfer Register Transfer Aho Ullman Model Davidson Fraser Model Machine & Optimizer Independent  8 Machine & Optimizer Dependent
  6. Structure of Compiler Front-End Back-End Parser Scanner Semantic Analyzer Symbol

    table Handler Source Program Instruction Selector Assembly Emitter Register Allocator Assembl y Program AST  9
  7. Typical Front-End Parser Scanner Semantic Analyzer Symbol table Handler Source

    Program AST Parse Tree Error Handler Token AST / IR + Symbol Table  10
  8. Typical Back-End Ind. Optimizer Code Generator Register Allocator Assembl y

    Program Instruction Scheduler Peephole Optimizer Ind. IR Dep. IR AST / IR + Symbol Table  11 Assembly Code Generator
  9. GCC GCC compiler GCC Source Program Targe t Program 

    13 CC1 CPP AS LD LIB compiler assembler linker C Preprocessor GCC is a collection that invokes compiler, assembler and linker… Static dynamic
  10.  14 Parser Source Program Assembl y Program 14 Architecture

    Gimplifer TreeSS A Optimizer Expander Optimizer Recoginer Input language Target name Language & Machine Independent Generic Code Machine Dependent Generator Code Machine Descriptions Language Specific Code
  11.  15 Parser Source Program Assembl y Program 15 Different

    Time Gimplifer TreeSS A Optimizer Expander Optimizer Recoginer Input language Target name Language & Machine Independent Generic Code Machine Dependent Generator Code Machine Descriptions Language Specific Code Develop GCC Time Build GCC time Use GCC time Select Copy Copy Generate Generate
  12.  16 Parser Source Program Assembl y Program 16 Different

    View Gimplifer TreeSS A Optimizer Expander Optimizer Recoginer Input language Target name Language & Machine Independent Generic Code Machin e Dependent Generato r Code Machin e Descriptions Language Specific Code C or C++? Arm or x86?
  13. Pre-requisites • ISO C9 0 • GC C • GNU

    Bas h • Aw k • bzip, gzip, unta r • GNU Make  18 Mpfr librar y Mpc librar y Pp l C LooG-PP L Ja r Libel f GMP https://gcc.gnu.org/install/prerequisites.html
  14. Directory • GCC Source – source cod e – $(SOURCE_D

    ) • GCC Build – make source cod e – $(BUILD ) • GCC Install – install binary fil e – $(INSTALL)  19 *GCC will generate file in build time
  15. Step 1. Build pre-requisite s 2. --prefix = /usr/loca l

    3. ldconfi g 4. Build gc c cd $(BUILD ) $(SOURCE_D)/configure make; make install  20 => #create makefile => #install path => #link library
  16. What is Gray box?  23 Black Box Input Output

    White Box Input Output Obj Obj Obj Obj Obj Obj Obj Obj
  17. What is Gray box?  24 Black Box Input Output

    White Box Input Output Gray Box Input Output Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
  18. Passes  26 Parse Gimplify TreeSS A Optimize Generat e

    RTL RT L Optimize Generat e ASM Target Ind. Target dep. Gimple Passes RTL -> ASM RTL Passes Gimple -> RTL
  19. Command • gcc -fdump-<stage>-<passname> <file > – ex. gcc -fdump-tree-original

    test. c – ex. gcc -fdump-tree-cfg-raw test. c – ex. gcc -fdump-ipa-all test. c – Stage : • tre e • ip a • rtl  27
  20. Important passes  28 Parse Gimplify Source Program CFG Grammer

    RTL Generator Reg Allocator pro_epilogue generator Pattern Matcher AS M Program AST: 003t.original GIMPLE: 004t.gimple CFG: 013t.cfg RTL expand: 144r.expand IRA: 191r.ira 198r.prologue-and- epilogue
  21. test.c.004t.gimpl e 2. gcc -fdump-tree-gimple test.c test. c Examples: GIMPLE

    dumps  31 int main( ) { int a[3], x ; a[1] = a[2] = 10 ; x = a[1] + a[2] ; a[0] = a[1] + a[1]*x ; } main ( ) { int D.1589 ; int D.1590 ; int D.1591 ; int D.1592 ; int D.1593 ; int D.1594 ; int a[3] ; int x; a[2] = 10 ; D.1589 = a[2] ; a[1] = D.1589 ; D.1590 = a[1] ; D.1591 = a[2] ; x = D.1590 + D.1591 ; D.1592 = x + 1 ; D.1593 = a[1] ; D.1594 = D.1592 * D.1593 ; a[0] = D.1594 ; }
  22. Examples: CFG dumps 3. gcc -fdump-tree-cfg test.c  32 test.c.004t.gimple

    (part ) if (a<=12) goto <D.1200 > else goto <D.1201 > <D.1200> : D.1199 = a + b ; a = D.1199 + c ; <D.1201>: test.c (part ) If (a<=12 ) a = a+b+c;
  23. Examples: RTL dumps 4. gcc -fdump-rtl-expand test.c  33 test.c.144r.expand

    (part) test. c int a ; main( ) { a = a+1 ; } (insn 5 4 6 3 (set (reg:SI 59 [ a.0 ] ) (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S 4 A32])) test.c:4 - 1 (nil) ) (insn 6 5 7 3 (parallel [ (set (reg:SI 60 [ a.1 ] ) (plus:SI (reg:SI 59 [ a.0 ] ) (const_int 1 [0x1])) ) (clobber (reg:CC 17 flags) ) ]) test.c:4 - 1 (nil) ) (insn 7 6 13 3 (set (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S4 A32] ) (reg:SI 60 [ a.1 ])) test.c:4 - 1 (nil))
  24.  34 (insn 5 4 6 3 (set (reg:SI 59

    [ a.0 ] ) (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S 4 A32])) test.c:4 - 1 (nil) ) (insn 6 5 7 3 (parallel [ (set (reg:SI 60 [ a.1 ] ) (plus:SI (reg:SI 59 [ a.0 ] ) (const_int 1 [0x1])) ) (clobber (reg:CC 17 flags) ) ]) test.c:4 - 1 (nil) ) (insn 7 6 13 3 (set (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S4 A32] ) (reg:SI 60 [ a.1 ])) test.c:4 - 1 (nil)) r59 = a; r60 = r59 + 1 a = r60
  25.  35 (insn 5 4 6 3 (set (reg:SI 59

    [ a.0 ] ) (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S 4 A32])) test.c:4 - 1 (nil) ) (insn 6 5 7 3 (parallel [ (set (reg:SI 60 [ a.1 ] ) (plus:SI (reg:SI 59 [ a.0 ] ) (const_int 1 [0x1])) ) (clobber (reg:CC 17 flags) ) ]) test.c:4 - 1 (nil) ) (insn 7 6 13 3 (set (mem/c/i:SI (symbol_ref:DI ("a") <var_decl 0x7f13bdac3000 a>) [0 a+0 S4 A32] ) (reg:SI 60 [ a.1 ])) test.c:4 - 1 (nil)) Current Inst Previous Inst Next Inst CFG: Basic Block Single Integar Register Integer 1 Scalar Memory reference
  26. Examples: Assembly dumps 5. gcc -S test.c | | objdump

    -d a.out  36 test.s (part ) test.c main : .LFB0 : .cfi_startpro c pushq %rb p .cfi_def_cfa_offset 1 6 .cfi_offset 6, -1 6 movq %rsp, %rb p .cfi_def_cfa_register 6 movl $1, -4(%rbp ) popq %rb p .cfi_def_cfa 7, 8 re t .cfi_endproc int main( ) { int a ; a=1 ; } test.c.144r.expand (part ) (insn 5 4 11 3 (set (mem/c/i:SI (plus:DI (reg/f:DI 54 virtual-stack-vars ) (const_int -4 [0xfffffffffffffffc])) [0 a+0 S4 A32] ) (const_int 1 [0x1])) test.c:4 - 1 (nil))
  27. Passes  38 Parse Gimplify TreeSS A Optimize Generat e

    RTL RT L Optimize Generat e ASM Target Ind. Target dep. Gimple Passes RTL -> ASM RTL Passes Gimple -> RTL
  28. Brief 0. Pre-procedure (017t.ssa) (022t.copyrename1 ) 1. constant propagation (023t.ccp1)

    (059t.ccp2 ) 2. copy propagation (027t.copyprop1 ) 3. loop unrolling (058t.cunrolli) 4. dead code elimination (029t.cddce1) Command : gcc -fdump-tree-all -O2 test.c  39
  29. Source Code int main( ) { int a=1 ; int

    b=2 ; int c=3 ; int n=c*2 ; while (a<=n ) a = a+1 ; if (a<12 ) a = a+b+c ; return a ; }  40
  30. cfg (Control Flow Graph)  41 a=1 b=2 c=3 n=c*2

    B2 If a<=n B4 If a<12 B5 If a<12 B3 D.1200 = a+ b a=D.1200+c B6 D.1201=a return D.1201 B7 T T F F
  31. cfg -> ssa (017t.ssa)  42 a_3=1 b_4=2 c_5=3 n_6=c_5*2

    B2 a_1=phi(a_3, a_7) If a_1<=n_6 B4 If a_1<12 B5 If a_7<12 B3 D.1200_8 = a_1+b_4 a_9=D.1200_8+c_5 B6 a_2 = phi(a_1, a_9) D.1201_10=a_2 return D.1201_10 B7 T T F F
  32. ssa -> copyrename (022t) <bb 7> : #a_2 = PHI<a_1(5),a_9(6)

    > D.1201_10=a_2 ; return D.1201_10 ; <bb 7> : #a_2 = PHI<a_1(5),a_9(6) > a_10=a_2 ; return a_10;  43 017t.ssa 022t.copyrename1
  33. copyrename -> ccp (023t) <bb 2 > a_3=1 ; b_4=2

    ; c_5=3 ; n_6=c_5*2 ; goto <bb 4 > <bb 2 > a_3=1 ; b_4=2 ; c_5=3 ; n_6=6 ; goto <bb 4>  44 022t.copyrename1 023t.ccp1
  34. ccp -> copyprop (027t) <bb 7> : #a_2 = PHI<a_1(5),a_9(6)

    > a_10=a_2 ; return a_10 ; <bb 7> : #a_2 = PHI<a_1(5),a_9(6) > return a_2;  45 023t.ccp1 027t.copyprop1
  35. copyprop -> cddc (029t)  46 029t.cddc <bb 2> :

    a_3 = 1 ; b_4 = 2 ; c_5 = 3 ; n_6 = 6 ; goto <bb 4> ; <bb 3> : a_7 = a_1 + 1 ; <bb 4> : … <bb 2> : goto <bb 4> ; <bb 3> : a_7 = a_1 + 1 ; <bb 4> : … 029t.cddc
  36. cddc ->cunrolli (058t)  47 <bb 2> : goto <bb

    4> ; <bb 3> : a_7 = a_1 + 1 ; <bb 4> : # a_1 = PHI <1(2), a 7(3) > if (a_1 <= 6) goto <bb 3> ; else goto <bb 5> ; <bb 5> : if (a_1 <= 11) goto <bb 6> ; else goto <bb 7> ; <bb 6> : a_9 = a_1 + 5 ; <bb 7> : # a_2 = PHI <a_1(5), a_9(6) > return a_2; a= 1 a=a+ 1 a=a+ 1 a=a+ 1 a=a+ 1 a=a+ 1 a=a+1 <bb 2> : a_12 = 2 ; a_14 = a_12 + 1 ; a_16 = a_14 + 1 ; a_18 = a_16 + 1 ; a_20 = a_18 + 1 ; a_22 = a_20 + 1 ; if (a_22 <= 11) goto <bb 3> ; else goto <bb 4> ; <bb 3> : a_9 = a_22 + 5 ; <bb 4> : # a_2 = PHI <a_22(2), a_9(3) > return a_2; 029t.cddc 058t.cunrolli
  37. cunrolli -> ccp2 (059t) main( ) { <bb 2> :

    return 12 ; }  48 <bb 2> : a_12 = 2 ; a_14 = a_12 + 1 ; a_16 = a_14 + 1 ; a_18 = a_16 + 1 ; a_20 = a_18 + 1 ; a_22 = a_20 + 1 ; if (a_22 <= 11) goto <bb 3> ; else goto <bb 4> ; <bb 3> : a_9 = a_22 + 5 ; <bb 4> : # a_2 = PHI <a_22(2), a_9(3) > return a_2; 058t.cunrolli 059t.ccp2
  38. Reference • GCC Source Cod e – https://github.com/mirrors/gc c •

    IITB GCC workshop OC W – http://www.cse.iitb.ac.in/grc/index.php? page=gcc-pldi14-tut  49