рдХрдореНрдкрд╛рдЗрд▓рд░ рдЬрд╛рдУ: SSA рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд░реВрд▓реНрд╕ рдбрд┐рдЯреЗрд▓реНрд╕ рд▓реИрдВрдЧреНрд╡реЗрдЬ


gc рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдПрд╕рдПрд╕рдП) рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рд╕реНрдк рдЬреИрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛ ( рдбреАрдПрд╕рдПрд▓ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдореБрдЦреНрдп рддрддреНрд╡реЛрдВ, рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреА рдкреАрдврд╝реА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ a*b+c рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдпрд╣ рдЧреЛ рдПрд╕рдПрд╕рдП рд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдб рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдирд┐рдпрдореЛрдВ рдХреЗ рдбреАрдПрд╕рдПрд▓ рд╡рд┐рд╡рд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрдзрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


рдкрд░рд┐рдЪрдп


рдРрдиреНрдЯреЗрдиреЗрдЯреЗрдб рдПрдПрд╕рдЯреА рд╕реЗ рдПрд╕рдПрд╕рдП рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдлреНрд░рдВрдЯрдПрдВрдб рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░реНрдп cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / gc / ssa.go. рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрд╕рдПрд╕рдП рдмреИрдХрдПрдВрдб рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ ssa.Compile рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ cmd / compile / рдЖрдВрддрд░рд┐рдХ / ssa / compile.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╢рдмреНрджрд╛рд╡рд▓реА
рдПрдирдЖрд░рдпреВрдореВрд▓реНрдп
рд╕рдВрдХрд▓рдХ рд╕рд╛рдордиреЗрд╕рдВрдХрд▓рдХ рд╕рд╛рдордиреЗрдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдХрднреА-рдХрднреА рдЯрд╛рдЗрдк рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдХрд░реАрдм рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрдЯ рдПрдПрд╕рдЯреАред
рд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдбрд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдбрдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдХреЛрдб рдкреАрдврд╝реАред
рдкреНрд░рдкрддреНрд░рдЖрдХрд╛рд░рд╢рдмреНрдж "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐" (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдПрдХ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреАред рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рд╕реНрдк рдореЗрдВ, form рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрддреНрд╡ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕реВрдЪреА рдпрд╛ рдПрдХ рдкрд░рдорд╛рдгреБ рд╣реЛред
рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕рдЕрдиреБрдХреВрд▓рди рдЪрд░рдгрдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред "рдкрд╛рд╕" рд╢рдмреНрдж рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЪрд░рдг рдХрдИ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ / рдпрд╛ рдПрдХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдо рд╣реИред

рдпрджрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╢рдмреНрдж рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЗрд╕реЗ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдПрд╕рдПрд╕рдП рдЧреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдХрдИ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдХреБрдЫ рдЪрд░рдг рддрдерд╛рдХрдерд┐рдд "рдкреБрдирд░реНрд▓реЗрдЦрди рдирд┐рдпрдо" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдПрд╕рдПрд╕рдП рдЕрдиреБрдХреНрд░рдо рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо, рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдоред


рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рднрд╛рд╡реЛрдВ рдХреЗ рддрддреНрд╡ ssa.Value рд╣реИрдВ ред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдирд┐рдпрдо рдЖрдкрдХреЛ рдПрдХ ssa.Value рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб 8-рдмрд┐рдЯ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЧреБрдгрди рдХреЛ рдврд╣рддрд╛ рд╣реИ:


 (Mul8 (Const8 [c]) (Const8 [d])) -> (Const8 [int64(int8(c*d))]) 

SSA рдорд╛рдиреЛрдВ рдХреА рджреЛ рдореБрдЦреНрдп рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВ: рдЙрдЪреНрдЪ-рд╕реНрддрд░, рд▓рдХреНрд╖реНрдп рдорд╢реАрди рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрд╡рддрдВрддреНрд░, рдФрд░ рдЬреЛ рдХрд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ 1-in-1 рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдк рдХреА рдЬрд╛рддреА рд╣реИрдВ)ред


рдЗрди рджреЛрдиреЛрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ, рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп, рдлрд┐рд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдЙрдиреНрдореБрдЦред


рдирд┐рдпрдореЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдХреЛрдб cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / ssa / gen рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВред рд╣рдо рджреЛ рд╕реЗрдЯреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:


  1. genericOps.go - рдорд╢реАрди-рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрдЪрд╛рд▓рдиред
  2. AMD64Ops.go - рд╕рдВрдЪрд╛рд▓рди GOARCH=AMD64 (64-рдмрд┐рдЯ x86) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

рдЕрдореВрд░реНрдд рдорд╢реАрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рддрдерд╛рдХрдерд┐рдд genericOps рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк genericOps рд╕реЗ genericOps рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ AMD64Ops рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж, рд╕рднреА рдмрд╛рдж рдХреЗ рдЪрд░рдг рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рд╕реЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред


рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрд╛рдж, рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред AMD64 рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреИрдХреЗрдЬ cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / amd64 рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдХрд╛рд░реНрдп ssa.Block рдФрд░ ssa.Value рдХреЛ рдЕрдиреБрдХреНрд░рдо obj рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред рдЕрд╕реЗрдВрдмрд▓рд░ рдорд╢реАрди рдХреЛрдб рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛, рдЬреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред


рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо


рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ " ${ARCH}Ops.go " рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреЛ " ${ARCH}.Rules " рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред


рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдирд┐рдпрдо рд╕рд░рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╣ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред


рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдирд┐рдпрдореЛрдВ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:


  1. рдХрдо рдХрд░рдирд╛ - рдорд╢реАрди рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрдЧрд╣ред
  2. рдЕрдиреБрдХреВрд▓рди рд╕реНрд╡рдпрдВред

рдПрдХ рдорд╢реАрди рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 (Const32 [val]) -> (MOVLconst [val]) // L - long, 32- (Const64 [val]) -> (MOVQconst [val]) // Q - quad, 64- | | generic op | AMD64 op 

рдпрд╣ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдирд╛ , рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдореЛрдб рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред


рдСрдкрд░реЗрд╢рдиреНрд╕ рдореЗрдВ рдПрдХ рдПрдордиреЛрдореЛрдирд┐рдХ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдУрдкрдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдирд┐рд░реНрднрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдСрдкрдХреЛрдб рдЖрдорддреМрд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред


рдирд┐рдпрдо рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рд╕рд┐рдВрдЯреЗрдХреНрд╕


рдореВрд▓ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред


 // rule syntax: // sexpr [&& extra conditions] -> [@block] sexpr // // sexpr are s-expressions (lisp-like parenthesized groupings) // sexpr ::= [variable:](opcode sexpr*) // | variable // | <type> // | [auxint] // | {aux} // // aux ::= variable | {code} // type ::= variable | {code} // variable ::= some token // opcode ::= one of the opcodes from the *Ops.go files 

рд╕реНрдирд┐рдкреЗрдЯ рдЕрдиреБрд╡рд╛рдж рдКрдкрд░
 //  : // sexpr [&&  ] -> [@block] sexpr // // sexpr -  S- (   ) // sexpr ::= [variable:](opcode sexpr*) // | variable // | <type> // | [auxint] // | {aux} // // aux ::= variable | {code} // type ::= variable | {code} // variable ::= Go  ( ) // opcode ::=   *Ops.go  


рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ " // " рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЕрдВрджрд░ .Rules рдлрд╝рд╛рдЗрд▓реЗрдВред


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд╕рднреА рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


  Opcode=ADDLconst -    32-  : AuxInt=c - ,    `x` : : (ADDLconst [c] x) && int32(c)==0 -> x | / | / | | / | / | | / | /    | /   ( `&&`    ) ,     

рдпреЗ рд╕рднреА рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡реИрдз рдирд┐рдпрдо рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред

рдпрд╣ рдирд┐рдпрдо x+0 рдХреЛ x рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╢рд░реНрддреЛрдВ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдХреЛрдб рд╣реИ,
рдЬрдм рддрдХ рднрд╛рд╡реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ bool рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдк rewrite.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзреЗрдп рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рд╛рдорд╛рдиреНрдп рдСрдкрдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ:


 (ADD(Q|L)const [off] x:(SP)) -> (LEA(Q|L) [off] x) //  Q|L alternation: (ADDQconst [off] x:(SP)) -> (LEAQ [off] x) (ADDLconst [off] x:(SP)) -> (LEAL [off] x) //    `x`: (ADDQconst [off] (SP)) -> (LEAQ [off] (SP)) (ADDLconst [off] (SP)) -> (LEAL [off] (SP)) 

(SP) рдЬреЗрдиреЗрд░рд┐рдХрдСрдкреНрд╕.рдУрдЧреЛ рдореЗрдВ рд╕реЗ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдХреЛрдИ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ SP , рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (S- рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдИрдВ рдУрд░ -> ):


  • рдЪрд░, рдЬреИрд╕реЗ x , рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ : рдХреБрдЫ рднреА рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ
  • рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрд░ рдХреА рддрд░рд╣, _ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 //       :    ADDQconst, //          : (ADDQconst _) -> v (ADDQconst x) -> (ADDQconst x) 

рдпрджрд┐ AuxInt рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐), рддреЛ рдирд┐рдпрдо рдХрд┐рд╕реА рднреА AuxInt рдорд╛рди рдкрд░ рдлрд╛рдпрд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рд╕реЗ {} -рдкреИрд░рд╛рдореАрдЯрд░ (рдиреАрдЪреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)ред


рдирд╛рдо v рдЕрд░реНрде рд╣реИ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░реВрдкред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (ADDQconst (SUBQconst x)) рдмрд╛рд╣рд░реА рд░реВрдк ADDQconst ред


рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:


 (ADDQconst [v] (ADDQconst [v] x)) // , ,  "x+2+2" (x+v+v). 

рдирд┐рдпрдореЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░


рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдФрд░ / рдпрд╛ рдорд┐рд▓рд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкреНрд░рдХрд╛рд░ рдХреЛ "рддреНрд░рд┐рдХреЛрдгреАрдп рдХреЛрд╖реНрдардХ" рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ:


 // typ.UInt32 -   BTSLconst. // BSFL    typ.UInt32,    //    . (Ctz16 x) -> (BSFL (BTSLconst <typ.UInt32> [16] x)) 

рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рд╡рд░реНрдг" рд╣реИрдВ (рдпрд╛, рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ - Aux рдЧреБрдг)ред


 (StaticCall [argsWidth] {target} mem) -> (CALLstatic [argsWidth] {target} mem) 

  • [argsWidth] - Value.AuxInt StaticCall - рддрд░реНрдХреЛрдВ рдХрд╛ рдХреБрд▓ рдЖрдХрд╛рд░ рдкрд╛рд░рд┐рдд рд╣реБрдЖ
  • {target} - Value.Aux ред StaticCall - рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
  • <typ.UInt32> - Value.Type ред рдорд╛рди рдкреНрд░рдХрд╛рд░

Aux рдФрд░ AuxInt рд╢рдмреНрджрд╛рд░реНрде рдСрдкрд░реЗрд╢рди рд╕реЗ рдСрдкрд░реЗрд╢рди рддрдХ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрд░реЛрдд *Ops.go рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ opData opcode opData рдореЗрдВ рдПрдХ aux рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИред


рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдПрд╕рдПрд╕рдП рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП types.TypeFlags , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП types.TypeFlags , рдмрд╛рдХреА cmd/compile/internal/gc рдФрд░ types.TypeFlags cmd/compile/internal/gc types.TypeFlags рдмреАрдЪ рдЖрдо рд╣реИрдВред


рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ


рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИред types.TypeMem , рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:


  1. рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ ssa.Value рдХреЛ рд╕реЙрд░реНрдЯ рдФрд░ рд╕рдореВрд╣ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдмреЗрд╕ рдмреНрд▓реЙрдХ (рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ) рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред
  2. рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореЗрдореЛрд░реА рд╕реНрдЯреНрд░реАрдо рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ SSA рдорд╛рди рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдк types.TypeMem рдЬрд╛рдПрдЧрд╛ред

OpPhi рдХреЗ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдХреА OpPhi , рдореЗрдореЛрд░реА рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИред


рдлреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛

Phi рдХреА рдПрдХ рднреВрдорд┐рдХрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЪрд░рдг рджрд░ рдЪрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИред


рд╕рдВрдХрд▓рдХ рдХреЗ рдПрд╕рдПрд╕рдП рдХрд╛рд░реНрдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, Phi рдЕрдкрдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореВрд▓реНрдп рдХреА рдкрд╕рдВрдж рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрд╛рдпрд╛ред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ рдЬрдВрдк рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХ рдХреЛ (Phi mem1 mem2) рдмрд░рд╛рдмрд░ рдореЗрдореЛрд░реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рдЪрдХреНрд░ рднреА Phi рдорд╛рди рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред


рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ types.TypeFlags рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╕реАрдкреАрдпреВ рдЭрдВрдбреЗ рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ADDQ рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЭрдВрдбреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред types.Flags , рд▓реЗрдХрд┐рди clobberFlags рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрддреЗ рд╣реИрдВред


types.Flags рдЙрдкрдпреЛрдЧ CMPQ рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯ рдСрдкрд░реЗрдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


SETL рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЛ рдЭрдВрдбреЗ рдХреЛ "рдкрдврд╝рдиреЗ" рдФрд░ ssa.Value рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


  L-less than G-greater than | | (SETL (InvertFlags x)) -> (SETG x) | ,   

SSA рдирд┐рд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ ( example.go ):


 package example func fusedMulAdd(a, b, c float64) float64 { return a*c + b } 

рд╣рдо SSA рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ fusedMulAdd рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП fusedMulAdd рд╣реИ:


 $ GOSSAFUNC=fusedMulAdd go tool compile example.go > ssa.txt 

рдЕрдм рдХрд╛рд░реНрдпрд╢реАрд▓ (рд╡рд░реНрддрдорд╛рди) рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


  • ssa.txt рдореЗрдВ рдЯреЗрдХреНрдЯ рдбрдВрдк рд╢рд╛рдорд┐рд▓ рд╣реИред
  • ssa.html , рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕рдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

FusedMulAdd рдХреЗ рд▓рд┐рдП рдорд╢реАрди рдХреЛрдб

рдЪрд░рд┐рддреНрд░ ~r3 рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


 v7 (4) MOVSD a(SP), X0 v11 (4) MOVSD c+16(SP), X1 v12 (4) MULSD X1, X0 v6 (4) MOVSD b+8(SP), X1 v13 (4) ADDSD X1, X0 v15 (4) MOVSD X0, ret+24(SP) b1 (4) RET 

lower рдЪрд░рдг рдХреЗ рдмрд╛рдж fusedMulAdd рд▓рд┐рдП рдпрд╣ SSA рдкреНрд░реЛрдЧреНрд░рд╛рдо fusedMulAdd рджрд┐рдЦрддрд╛ рд╣реИ: (ssa.html):



рдкрд╛рда рдкреНрд░рд╛рд░реВрдк SSA рдХрд╛рд░реНрдпрдХреНрд░рдо

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 lower [77667 ns] b1: v1 (?) = InitMem <mem> v2 (?) = SP <uintptr> v7 (?) = LEAQ <*float64> {~r3} v2 v8 (3) = Arg <float64> {a} v9 (3) = Arg <float64> {b} v10 (3) = Arg <float64> {c} v12 (+4) = MULSD <float64> v8 v10 v13 (4) = ADDSD <float64> v12 v9 v14 (4) = VarDef <mem> {~r3} v1 v15 (4) = MOVSDstore <mem> {~r3} v2 v13 v14 Ret v15 (line +4) 

рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:


 (MOVQstore {~r3} (SP) (ADDSD (MULSD (Arg {a}) (Arg {c})) (Arg {b}))) 

рд░реЗрдЧреЙрд▓реЙрдХ рдЪрд░рдг рдХреЗ рдмрд╛рдж рдПрд╕.рдПрд╕.рдП.

рдпрд╣ regalloc рдЪрд░рдг рдХреЗ рд▓рд┐рдП ssa.html рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред



 regalloc [87237 ns] b1: v1 (?) = InitMem <mem> v14 (4) = VarDef <mem> {~r3} v1 v2 (?) = SP <uintptr> : SP v8 (3) = Arg <float64> {a} : a[float64] v9 (3) = Arg <float64> {b} : b[float64] v10 (3) = Arg <float64> {c} : c[float64] v7 (4) = LoadReg <float64> v8 : X0 v11 (4) = LoadReg <float64> v10 : X1 v12 (+4) = MULSD <float64> v7 v11 : X0 v6 (4) = LoadReg <float64> v9 : X1 v13 (4) = ADDSD <float64> v12 v6 : X0 v15 (4) = MOVSDstore <mem> {~r3} v2 v13 v14 Ret v15 (line +4) 

рдирдП рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо рдЬреЛрдбрд╝рдирд╛


FMA рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ , рд╣рдо рджреЛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ a*c + b рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрд▓рд┐рдпрд╛ рддреЛрдХрд░ рдХреЗ рд▓реЗрдЦрди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ CL117295 рд▓реЗрдВред


рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ diff рдкреИрдЪ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред


1. рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ - FMASD


рдлрд╝рд╛рдЗрд▓ compile/internal/ssa/gen/AMD64Ops.go рдореЗрдВ AMD64ops рд╕реНрд▓рд╛рдЗрд╕ AMD64ops рдФрд░ рдПрдХ рдирдпрд╛ рддрддреНрд╡ (рдХрд╣реАрдВ рднреА) рдЬреЛрдбрд╝реЗрдВ:


 { // fp64 fma name: "FMASD", //   SSA argLength: 3, reg: fp31, //   regalloc,   resultInArg0: true, //     source,  destination asm: "VFMADD231SD", //   }, 

рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рдХреЛрдИ рдСрдкрд░реЗрд╢рди (fp,fp,fp -> fp) рдереЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдирдП рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  fp01 = regInfo{inputs: nil, outputs: fponly} fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: fponly} + fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: fponly} 

2. рдПрдХ рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо рдЬреЛрдбрд╝рдирд╛


 (ADDSD (MULSD xy) z) -> (FMASD zxy) 

рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд┐рдирд╛ рд╢рд░реНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ FMA рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред рд╣рдо рдпрд╣ рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЯрд╛рд░рдЧреЗрдЯ рдорд╢реАрди рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдлрдПрдордП рд╣реИред


рд╕рдВрдХрд▓рдХ рдРрд╕реЗ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП config рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 //  config.useFMA=false,    . (ADDSD (MULSD xy) z) && config.useFMA-> (FMASD zxy) 

рдПрдлрдПрдордП рд╕рдорд░реНрдерди рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ lscpu рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:


 $ lscpu | grep fma 

3. рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм, ssaGenValue рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, compile/internal/amd64/ssa.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ FMASD рд▓рд┐рдП рдХреЛрдб рдкреАрдврд╝реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { switch v.Op { case ssa.OpAMD64FMASD: p := s.Prog(v.Op.Asm()) //   obj.Prog    // From:  source . p.From = obj.Addr{Type: obj.TYPE_REG, Reg: v.Args[2].Reg()} // To: destination . // v.Reg()  ,      FMASD. p.To = obj.Addr{Type: obj.TYPE_REG, Reg: v.Reg()} // From3:  source . //  From3 .     //  RestArgs,    source ,  . p.SetFrom3(obj.Addr{ Type: obj.TYPE_REG, Reg: v.Args[1].Reg(), }) if v.Reg() != v.Args[0].Reg() { //   resultInArg0 s := v.LongString() v.Fatalf("input[0] and output not in same register %s", s) } //    ,     case. } } 

рдЕрдм рд╣рдорд╛рд░реЗ рдирдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдирдП рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрд╕рдПрд╕рдП рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдЬрд╛рдБрдЪ рдкрд░рд┐рдгрд╛рдо


рдкрд╣рд▓рд╛ рдХрджрдо рдЕрджреНрдпрддрди gen/AMD64Ops.go рдФрд░ gen/AMD64.Rules рд╕реЗ рдЧреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди gen/AMD64.Rules ред


 #  GOROOT  ,   ,   `go env GOROOT`. cd $GOROOT/src/cmd/compile/internal/ssa/gen && go run *.go 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЕрдкрдирд╛ рдирдпрд╛ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 go install cmd/compile 

рдЕрдм, рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдорд╢реАрди рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ:


 - v7 (4) MOVSD a(SP), X0 - v11 (4) MOVSD c+16(SP), X1 - v12 (4) MULSD X1, X0 - v6 (4) MOVSD b+8(SP), X1 - v13 (4) ADDSD X1, X0 - v15 (4) MOVSD X0, ret+24(SP) - b1 (4) RET + v12 (4) MOVSD b+8(SP), X0 + v7 (4) MOVSD a(SP), X1 + v11 (4) MOVSD c+16(SP), X2 + v13 (4) VFMADD231SD X2, X1, X0 + v15 (4) MOVSD X0, ret+24(SP) + b1 (4) RET 

рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ


рдЕрдм рдЬрдм рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред


рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдордиреЗ рдКрдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИрдВ, рдФрд░ рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИрдВред


рдмреНрд▓реЙрдХ, рдЬреИрд╕реЗ ssa.Value , рд╕рд╛рд░ рдФрд░ рдорд╢реАрди-рдирд┐рд░реНрднрд░ рд╣реИрдВред рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдареАрдХ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ 0 рд╕реЗ 2 рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХреЛрдВ (рдмреНрд▓реЙрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рд╣реИред


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмреНрд▓реЙрдХ рд╣реИрдВ If , Exit рдФрд░ Plain :


  • Exit рдмреНрд▓реЙрдХ рдореЗрдВ 0 рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмреНрд▓реЙрдХ рд╣реИрдВред рдпреЗ рдкрддреНрддреА рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬреЛ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдХреВрдж рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, panic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
  • Plain рдмреНрд▓реЙрдХ рдореЗрдВ 1 рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИред рдмреНрд▓реЙрдХ рдХреЗ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • If рдмреНрд▓реЙрдХ рдореЗрдВ 2 рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХ рд╣реИрдВред рд╕рдВрдХреНрд░рдордг рдХреА рд╕реНрдерд┐рддрд┐ ( Block.Control ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ AMD64 рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рд╛рд░ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:


   "then" ( ) |  "else" ( ) | | (If (SETL cmp) yes no) -> (LT cmp yes no) (If (SETLE cmp) yes no) -> (LE cmp yes no) 

рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдПрд╕рдПрд╕рдП рднрд╛рдЧ рдореЗрдВ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рдЪрд░рдгреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреА рд╕реАрдорд╛рдПрдВ


рдПрд╕рдПрд╕рдП рдмреИрдХреЗрдВрдб рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди O(1) рдореЗрдВ рд╕рдВрднрд╡ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рднреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЕрдХреЗрд▓реЗ рдЕрдиреБрдХреВрд▓рдХ рдХрд╛ SSA рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рддрдм рддрдХ рдЬрдм рддрдХ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдирд╣реАрдВ рдмрджрд▓ рдЬрд╛рддреЗред


рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк append рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 xs = append(xs, 'a') xs = append(xs, 'b') // => xs = append(xs, 'a', 'b') 

рдЬрд┐рд╕ рд╕рдордп рдПрд╕рдПрд╕рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕ рд╕рдордп рдХреЛрдб рдХреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдВрд░рдЪрдирд╛ рдЦреЛ рдЬрд╛рддреА рд╣реИ рдФрд░ append , рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреБрдХреНрдд рдмреНрд▓реЙрдХ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдмреЛрдЭрд┐рд▓ рдирд┐рдпрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ append рд▓рд┐рдП рд╕реГрдЬрд┐рдд рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред


рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ .Rules рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдлрд┐рд░ рдЗрд╕ DSL рдореЗрдВ рдмреНрд▓реЙрдХ ( ssa.Block ) рдХреЗ рд╕рд╛рде рдХрдордЬреЛрд░ рдХрд╛рдо рд╣реИред рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рдХреЛрдИ рднреА рдирд┐рд░рдВрдХреБрд╢ рдЕрдиреБрдХреВрд▓рди рдЕрд╕рдВрднрд╡ рд╣реИред рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХ рдЕрджреНрдпрддрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдмреНрд▓реЙрдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рднреА рдЕрд╕рдВрднрд╡ рд╣реИ (рд▓реЗрдХрд┐рди First рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реИрдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдб рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред


рднрд▓реЗ рд╣реА рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХрд▓ рдФрд░ рдмреЗрд╣рддрд░ рдордзреНрдпрд╡рд░реНрддреА рд░реВрдк рдирд╣реАрдВ рд╣реИред

рдЬрд╛рдУ рдХрд┐ рддреЗрдЬреА рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ


рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╢рд╛рдВрдд рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕реЗ go-review.googlesource.com рдкрд░ рднреЗрдЬреЗрдВред рдореБрдЭреЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА (CC рдореЗрдВ iskander.sharipov@intel.com рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ)ред


рд╣реИрдкреНрдкреА рд╣реИрдХрд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░!



рдмреЛрдирд╕ рд╕рд╛рдордЧреНрд░реА


рдЬрд╛рдиреЗ рдпрд╛ рдмрджрд▓реЗ рдЧрдП SSA рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкреИрдЪ рдХреЗ рдЙрджрд╛рд╣рд░рдг:



рдЗрддрдиреА рджреЗрд░ рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдПрдХ README рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрдХрд▓рдХ рдХреЗ рдПрд╕рдПрд╕рдП рднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреАред

Source: https://habr.com/ru/post/hi415771/


All Articles