C ++ рдФрд░ C # рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдореЗрдВ Peephole microoptimization

рд╕реНрдХреВрд▓ рдореЗрдВ, рдЬрдм рд╣рдордиреЗ рд╕рдореАрдХрд░рдг рд╣рд▓ рдХрд┐рдП рдпрд╛ рд╕реВрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдХрдИ рдмрд╛рд░ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Z = X - (Y + X) рдХреЛ Z = -Y рдШрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдореЗрдВ, рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдкреАрдкрд╣реЛрд▓ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣рдо рднрд╛рд╡реЛрдВ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдРрд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рдВрдХрд▓рди рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ LLVM, GCC рдФрд░ .NET рдХреЛрд░ (CoreCLR) рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдкрд╛рдП рдЧрдП рдереЗред


рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


  X * 1 => X -X * -Y => X * Y -(X - Y) => Y - XX * Z - Y * Z => Z * (X - Y) 

C ++ рдФрд░ C # рдореЗрдВ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:


 int Test(int x, int y, int z) { return x * z - y * z; // => z * (x - y) } 

рдФрд░ Clang (LLVM), GCC, MSVC рдФрд░ .NET рдХреЛрд░ рд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рджреЗрдЦреЗрдВ:


рд╕рднреА рддреАрди рд╕реА ++ рдХрдВрдкрд╛рдЗрд▓рд░ (рдЬреАрд╕реАрд╕реА, imul ) рдиреЗ рдПрдХ рдЧреБрдгрд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ (рд╣рдо рдХреЗрд╡рд▓ рдПрдХ imul рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рджреЗрдЦрддреЗ рд╣реИрдВ)ред C # рдиреЗ RyuJIT рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдбрд╛рдВрдЯрдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рди рдХрд░реЗрдВ, рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, LLVM рдореЗрдВ рд╕рдВрдкреВрд░реНрдг InstCombine рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдб рдХреА 30k рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ (+ DAGCombiner.cpp рдкрд░ + 20k рд▓рд╛рдЗрдиреЗрдВ) рд▓рдЧрддреА рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдХреНрд╕рд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдВрдХрд▓рди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рд╛рдЗрдЯ рд╣реИред рдЬреАрд╕реАрд╕реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреАрдПрд╕рдПрд▓ рд╣реИ рдЬреЛ рдЕрдиреБрдХреВрд▓рди piphole рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ )ред


рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛, рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ C # JIT (рдореЗрд░реА рдмрд┐рдпрд░ рдкрдХрдбрд╝реЛ) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


рдЫрд╡рд┐


рдкреВрд░реНрдг рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдпрд╣рд╛рдВ рдИрдЧреЛрд░рдмреЛ / рдХреЙрд░реНрдХреНрд▓рд░ рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЖрдЗрдП рдЕрдм рдореЗрд░реЗ рд╕реБрдзрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ (рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдореЗрдВ + рдбрд┐рд╕реНрдореЛ:


рдЫрд╡рд┐


рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! lea + imul рдЬрдЧрд╣ imul , imul рдФрд░ add ред


рдЖрдЗрдП C ++ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ Clang рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ LLVM IR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ -emit-llvm -g0 рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП -emit-llvm -g0 , рдФрд░ рдлрд┐рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рдЯреАрдХ рдХреНрд╖рдг рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП -O2 -print-before-all -print-after-all рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрдиреБрдХреВрд▓рдХ рдХреЛ LLVM рдХреЛ рджреЗрдВред рд╕реЗрдЯ -O2 рд╕реЗ рдЧреБрдгрд╛ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ (рдпрд╣ рд╕рдм рдЕрджреНрднреБрдд рд╕рдВрд╕рд╛рдзрди Godbolt.org рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):


 ; *** IR Dump Before Combine redundant instructions *** define dso_local i32 @_Z5Case1iii(i32, i32, i32) { %4 = mul nsw i32 %0, %2 %5 = mul nsw i32 %1, %2 %6 = sub nsw i32 %4, %5 ret i32 %6 } ; *** IR Dump After Combine redundant instructions *** define dso_local i32 @_Z5Case1iii(i32, i32, i32) { %4 = sub i32 %0, %1 %5 = mul i32 %4, %2 ret i32 %5 } 

рдЖрдк рдПрд▓рдПрд▓рд╡реАрдПрдо рдЯреВрд▓реНрд╕ - рдСрдкреНрдЯ (рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░) рдФрд░ рдПрд▓рдПрд▓рд╕реА (рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рдПрд╕рдо рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдЧреЙрдбрдмреЙрд▓реНрдЯ рдкрд░ рднреА рдордЬрд╝реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рд╡рд╛рдкрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдЬреАрд╕реАрд╕реА рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рд╛ред


 X == C - X => false if C is odd 

рдФрд░ рдпрд╣ рд╕рдЪ рд╣реИ: рдпрджрд┐ (рд╕реНрдерд┐рд░, рд╢рд╛рдмреНрджрд┐рдХ) рддрдм рднреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк 4 == 8 - 4 рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ 8 рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХреЛрдИ рдЕрдЬреАрдм рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдРрд╕рд╛ X рдирд╣реАрдВ рдЦреЛрдЬ рд╕рдХрддреЗ рдЬрд┐рд╕рд╕реЗ рд╕рдорд╛рдирддрд╛ рдкреВрд░реА рд╣реЛ:



IEEE754 рд╕реНрдЯреНрд░рд╛рдЗрдХреНрд╕ рдмреИрдХ


рдХрдИ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, byte , int , unsigned , float , double ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд╕рд╛рде, рдЪреАрдЬреЗрдВ рдЗрддрдиреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ IEEE754 рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ A - B - A рдЯреВ рдпрд╛ -B (A * B) * C рдХрдо рдХрд░рдиреЗ рдкрд░ рдкрд╛рдЧрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ A * (B * C) рдЯреА рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред рдПрдХред рд╕рдВрдЪрд╛рд▓рди рд╕рд╣рдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЛрдб рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдФрд░ рд╕реАрдорд╛ рдореВрд▓реНрдпреЛрдВ (NaN, + -Inf, + -0.0) рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрд╣ рдлрд╛рд╕реНрдЯ рдореИрде рд╣реИ (C рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЛрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкреАрдЖрд░ рдЕрдиреБрд░реЛрдз рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) )ред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЗрди -ffast-math рджреЛ рдФрд░ vsubss :


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рднреА рдЧрдгрд┐рдд рд╕реЗ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдЬреАрдЧрд░реА рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ X рдХреЗ рдореЛрдбреБрд▓реА рдХрд╛ рдЙрддреНрдкрд╛рдж рд╕рдВрдЦреНрдпрд╛ X рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:


 abs(X) * abs(X) => X * X 

рд╡рд░реНрдЧрдореВрд▓ рд╣рдореЗрд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ:


 sqrt(X) < Y => false, if Y is negative. sqrt(X) < 0 => false 

рд░реВрдЯ рдХреА рдЧрдгрдирд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ, рдпрджрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ ?:


 sqrt(X) > C => X > C * C 

рдЫрд╡рд┐


рдЕрдзрд┐рдХ рд░реВрдЯ рд╕рдВрдЪрд╛рд▓рди:


 sqrt(X) == sqrt(Y) => X == Y sqrt(X) * sqrt(X) => X sqrt(X) * sqrt(Y) => sqrt(X * Y) logN(sqrt(X)) => 0.5*logN(X) 

рдХреБрдЫ рдФрд░ рд╕реНрдХреВрд▓ рдЧрдгрд┐рдд:


 expN(X) * expN(Y) -> expN(X + Y) 

рдФрд░ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдЕрдиреБрдХреВрд▓рди:


 sin(X) / cos(X) => tan(X) 

рдЫрд╡рд┐


рдмреЛрд░рд┐рдВрдЧ рдмрд┐рдЯ рдФрд░ рдмреВрд▓рд┐рдпрди рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ:


 ((a ^ b) | a) -> (a | b) (a & ~b) | (a ^ b) --> a ^ b ((a ^ b) | a) -> (a | b) (X & ~Y) |^+ (~X & Y) -> X ^ Y A - (A & B) into ~B & A X <= Y - 1 equals to X < Y A < B || A >= B -> true ...   ! 

рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди


рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ t.z рдХреЗ рд╕рд╛рде рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдЧрдгрд┐рддрдЬреНрдЮ, рд▓реЗрдХрд┐рди рд▓реЛрд╣реЗ рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реИрдВред


 X / 2 => X * 0.5 

рдЧреБрдгрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:



рдмреЗрдбрд╝реЗ рдХреЗ рдЧреБрдгрд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рднрд╛рдЬрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╡рд┐рд▓рдВрдмрддрд╛ / рдкреНрд░рд╡рд╛рд╣ рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЗрдВрдЯреЗрд▓ рд╣рд╕рд╡реЗрд▓ рдХреЗ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:


рдЧреИрд░-рдлрд╛рд╕реНрдЯ-рдЧрдгрд┐рдд рдореЛрдб рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕реНрдерд┐рд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╣реЛред
рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реА # рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╛рдиреА рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 3 рдбреА рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдФрд░ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ 10 рдЧреБрдирд╛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ * 0.1 рдЗрд╕ 20-100% рддреЗрдЬреА рд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рддрд░реНрдХ:


 X * 2 => X + X 

рд╢реВрдиреНрдп ( test ) рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЗрдХрд╛рдИ ( cmp ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ - рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкреАрдЖрд░ рдбреЙрдЯрдиреЗрдЯ / рдХреЛрд░рдХреНрд▓рд░ # 25458 рд╣реИ :


 X >= 1 => X > 0 X < 1 => X <= 0 X <= -1 => X >= 0 X > -1 => X >= 0 

рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдХреИрд╕реЗ рдкрд╕рдВрдж рд╣реИ:


 pow(X, 0.5) => sqrt(x) pow(X, 0.25) => sqrt(sqrt(X)) pow(X, 2) => X * X ; 1 mul pow(X, 3) => X * X * X ; 2 mul 


рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, mod(X, 4) рдпрд╛ X * X * X * X рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рддрдиреЗ рдЧреБрдгрд╛ рдСрдкрд░реЗрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИ?


рдЫрд╡рд┐


рджреЛ! 3 рдбрд┐рдЧреНрд░реА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рдорд╛рдорд▓реЗ 4 рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ xmm0 рдЙрдкрдпреЛрдЧ xmm0 ред


рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢ (FMA) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдЧреБрдгрди рдФрд░ рдЬреЛрдбрд╝ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд▓рд╣рд╕реБрди рдХреЛ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ:


 X * Y + Z => fmadd(X, Y, Z) 


рдореЗрд░реЗ рджреЛ рдФрд░ рдкрд╕рдВрджреАрджрд╛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ (рдпрджрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ):


рдЕрдиреБрдХреВрд▓рди рдЬрд╛рд▓


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рддреАрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


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

рдЖрдЗрдП рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ (рдХрдВрдкрд╛рдЗрд▓рд┐рдВрдЧ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЬрд╛рд╕реВрд╕реА)ред


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реИ:


 int Foo1(int a, int b) { int na = -a; int nb = -b; return na + nb; } 

рд╣рдореЗрдВ рддреАрди рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 0 - a , 0 - b , рдФрд░ na + nb ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдЗрд╕реЗ рджреЛ - return -(a + b); рдШрдЯрд╛ рджреЗрддрд╛ рд╣реИ return -(a + b); :


 define dso_local i32 @_Z4Foo1ii(i32, i32) { %3 = add i32 %0, %1 ; a + b %4 = sub i32 0, %3 ; 0 - %3 ret i32 %4 } 

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рдордзреНрдпрд╡рд░реНрддреА рдорд╛рди na рдФрд░ nb рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:


 int x, y; int Foo2(int a, int b) { int na = -a; int nb = -b; x = na; y = nb; return na + nb; } 

рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдЕрднреА рднреА рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ (рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рд╕рдВрдЪрд╛рд▓рди 0 - a рдФрд░ 0 - b , рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ! рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рдЗрди "рдЕрдирд╛рд╡рд╢реНрдпрдХ" рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ! рдпрд╣ рдЗрд╕ рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:


 define dso_local i32 @_Z4Foo2ii(i32, i32) { %3 = sub nsw i32 0, %0 ; 0 - a %4 = sub nsw i32 0, %1 ; 0 - b store i32 %3, i32* @x, align 4, !tbaa !2 store i32 %4, i32* @y, align 4, !tbaa !2 %5 = add i32 %0, %1 ; a + b %6 = sub i32 0, %5 ; 0 - %5 ret i32 %6 } 

рддреАрди рдХреЗ рдмрдЬрд╛рдп рдЪрд╛рд░ рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди! рд╣рдорд╛рд░реЗ рдЖрд╢рд╛рд╡рд╛рджреА рдиреЗ рд╣рдореЗрдВ рд╡рд┐рдлрд▓ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рдерд╛ рдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдЕрднреА рднреА рдХрд┐рд╕реА рдХреА рдЬрд╝рд░реВрд░рдд рдереАред рдЕрдм рдЖрдЗрдП C # RuyJIT рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕реНрдорд╛рд░реНрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдирд╣реАрдВ рд╣реИ:



рдЪрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рддреАрди рдСрдкрд░реЗрд╢рди - C # C ++ :-) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рдирд┐рдХрд▓рд╛ред!


рдХреНрдпрд╛ рдРрд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?


рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛрдб рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦреЗрдЧрд╛, рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░рдВрддрд░ рддрд╣, рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рдЪрд╛рд░, рд╕реАрдПрд╕рдИ, рдЖрджрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИред - рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд╕реНрд╡реАрд░ рдЦреБрд▓ рдЬрд╛рдПрдЧреАред LLVM IR рдФрд░ .NET IL рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ / рдирдпрд╛ PL рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ IR рдкрд░ рд╣реА рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ InstCombine рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ;-)ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЕрдВрддрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИред


C # рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЬрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА, рдЙрдирдореЗрдВ C # рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ C # рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд░рдирдЯрд╛рдЗрдо CoreCLR рдФрд░ RyuJIT рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрд░рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рдПрдХ рдмреИрдХреЗрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреНрдп рд░рдирдЯрд╛рдЗрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдореЛрдиреЛ (рдореЗрд░реЗ рдЯреНрд╡реАрдЯ рджреЗрдЦреЗрдВ), рдпреВрдирд┐рдЯреА рдмрд░реНрд╕реНрдЯ, IL2CPP (рдХреНрд▓реИрдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдФрд░ LILLC - рдпрд╣рд╛рдВ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд▓реИрдВрдЧ рдХреЗ рд╕рд╛рде ++ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреВрдирд┐рдЯреА рдХреЗ рд▓реЛрдЧ C # рдореЗрдВ рдЖрдВрддрд░рд┐рдХ C ++ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдкреНрд░рджрд░реНрд╢рди, рдкреНрд░рдорд╛рдг рдореЗрдВ рдХрд┐рд╕реА рднреА рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛!


рдпрд╣рд╛рдВ рдХреБрдЫ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рдЗрдкрд╣реЛрд▓ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ morph.cpp рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ morph.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╣реИрдВ):


 *(&X) => X X % 1 => 0 X / 1 => X X % Y => X - (X / Y) * Y X ^ -1 => ~x X >= 1 => X > 0 X < 1 => X <= 0 X + 1 == C2 => X == C2 - C1 ((X + C1) + C2) => (X + (C1 + C2)) ((X + C1) + (Y + C2)) => ((X + Y) + (C1 + C2)) 

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


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


 (simplify (plus (mult (SIN @0) (SIN @0)) (mult (COS @0) (COS @0))) (if (flag_unsafe_math_optimizations)1. { build_one_cst (TREE_TYPE (@0)); })) 

рдПрдХ рдЧрдгрд┐рдд рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рд╕реЗ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП ;-):


 cos^2(X) + sin^2(X) equals to 1 

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


  1. "рдлреНрдпреВрдЪрд░ рдбрд╛рдпрд░реЗрдХреНрд╢рдиреНрд╕ рдлреЙрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдореНрдкрд╛рдЗрд▓рд░реНрд╕" , рдиреВрдиреЛ рдкреАред рд▓реЛрдкреНрд╕ рдФрд░ рдЬреЙрди рд░реЗрдЧреЗрд░
  2. "рдПрд▓рдПрд▓рд╡реАрдПрдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ" , рдЬреЙрди рд░реЗрдЧреЗрд░
  3. "рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдХреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪрддреБрд░рд╛рдИ" , рдбреИрдирд┐рдпрд▓ рд▓реЗрдорд╛рдпрд░
  4. "рдЬреАрд╕реАрд╕реА рдореЗрдВ рдкреАрдкрд╣реЛрд▓ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЬреЛрдбрд╝рдирд╛" , рдкреНрд░рдердореЗрд╢ рдХреБрд▓рдХрд░реНрдгреА
  5. 5. "рд╕реА ++, рд╕реА # рдФрд░ рдпреВрдирд┐рдЯреА" , рд▓реБрдХрд╛рд╕ рдореАрдЬреЗрд░
  6. "рдЖрдзреБрдирд┐рдХ" рд╕реА ++ рд╡рд┐рд▓рд╛рдк " , рдЕрд░рд╛рд╕ рдкреНрд░рд╛рдгрдХреЗрд╡рд┐рдпрд╕
  7. "рдПрд▓реАрд╡ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреАрдкрд╣реЛрд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди" , рдиреВрдиреЛ рдкреАред рд▓реЛрдкреНрд╕, рдбреЗрд╡рд┐рдб рдореЗрдиреЗрдВрдбреЗрдЬрд╝, рд╕рдВрддреЛрд╖ рдирд╛рдЧрд░рдХрд╛рдЯреЗ рдФрд░ рдЬреЙрди рд░реЗрдЧрд░

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


All Articles