рдХреНрд▓реИрдВрдЧ рдХреИрд╕реЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрд▓реИрдВрдЧ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рд╕реА рдпрд╛ рд╕реА ++ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред

рдЫрд╡рд┐


рдХреНрд▓реИрдВрдЧ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд▓реИрдВрдЧ рдЖрдЙрдЯрдкреБрдЯ рдЗрдирдкреБрдЯ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рд╣рдо рд╕реА ++ рдХреА рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЪрдХреНрд░реАрдп рдЕрдиреБрдХреВрд▓рди рдкрд░ рдЙрддреНрдХреГрд╖реНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдерд╛:

bool is_sorted(int *a, int n) { for (int i = 0; i < n - 1; i++) if (a[i] > a[i + 1]) return false; return true; } 

рдЪреВрдВрдХрд┐ рдХреНрд▓реИрдВрдЧ рдХреЛрдИ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реА рдФрд░ рд╕реА ++ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВ Cl86 6.0.1 (рдпрд╛ рдПрдХ рдХрд░реАрдмреА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ) x86-64 рдкрд░ред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 clang++ is_sorted.cpp -O0 -S -emit-llvm 

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рд╣рдо is_sorted.cpp рдлрд╝рд╛рдЗрд▓ рдХреЛ C ++ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ LLVM рдЯреВрд▓рдЪрд┐рди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрддрд╛рддреЗ рд╣реИрдВ: рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рдПрдХ рдкрд╛рдареАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рди рдХрд░реЗрдВред LLVM IR рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдпрд╛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдмрд┐рдЯрдХреЛрдб рдкреНрд░рд╛рд░реВрдк рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреВрд░реНрдг рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╣реИ, рд╣рдо рдЗрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред

рдЪрд▓реЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 ; ModuleID = 'is_sorted.cpp' source_filename = "is_sorted.cpp" target datalayout = "em:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" 

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

LLVM рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ:

 ; Function Attrs: noinline nounwind optnone uwtable 

рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ (рдЬреИрд╕реЗ рдпреЗ) рдлреНрд░рдВрдЯ-рдПрдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рдЕрдиреНрдп рдХреЛ рдмрд╛рдж рдореЗрдВ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХреЛрдб рдХреЗ рдЕрд░реНрде рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдпрд╣рд╛рдВ рдЙрдирдХреА рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп:

 define zeroext i1 @_Z9is_sortedPii(i32* %a, i32 %n) #0 { 

"рдЬрд╝реАрд░реЛрдХреНрд╕реНрдЯ" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ (i1, рдПрдХ рдПрдХрд▓-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ) рдХреЛ рдмреИрдХреЗрдВрдб рдореЗрдВ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдЙрд╕ рдЪреМрдбрд╝рд╛рдИ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреА рдПрдмреАрдЖрдИ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ "mangled" рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдЖрддрд╛ рд╣реИ, рдлрд┐рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА, рдореВрд▓ рд░реВрдк рд╕реЗ C ++ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ i32 рдПрдХ 32-рдмрд┐рдЯ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред # 1 рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдореВрд╣ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдкрд╣рд▓реА рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рд╣реИ:

 entry: %retval = alloca i1, align 1 %a.addr = alloca i32*, align 8 %n.addr = alloca i32, align 4 %i = alloca i32, align 4 store i32* %a, i32** %a.addr, align 8 store i32 %n, i32* %n.addr, align 4 store i32 0, i32* %i, align 4 br label %for.cond 

рдкреНрд░рддреНрдпреЗрдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬрд┐рд╕рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХрд╛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рдирд┐рд░реНрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдЕрдЧрд▓реА рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдореЗрдВ "рд╡рд┐рдлрд▓" рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдмреНрд▓реЙрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╣реИрдВред рдЖрдИрдЖрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдФрд░ рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ; рдЗрди рдореЙрдбреНрдпреВрд▓ рдХреЛ "рдореЙрдбреНрдпреВрд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛" рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдПрдХ рдкрд╛рд╕ рдПрдХ рдЕрд╡реИрдз рдЖрдИрдЖрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

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

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

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

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд▓реВрдк рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 for (initializer; condition; modifier) { body } 

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ:

  initializer goto COND COND: if (condition) goto BODY else goto EXIT BODY: body modifier goto COND EXIT: 

рдмреЗрд╢рдХ, рдРрд╕рд╛ рдЕрдиреБрд╡рд╛рдж рдХреНрд▓реИрдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рднреА C рдФрд░ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред

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

 for.cond: ; preds = %for.inc, %entry %0 = load i32, i32* %i, align 4 %1 = load i32, i32* %n.addr, align 4 %sub = sub nsw i32 %1, 1 %cmp = icmp slt i32 %0, %sub br i1 %cmp, label %for.body, label %for.end 

рдХреНрд▓реИрдВрдЧ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА рднреА рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ for.inc рдпрд╛ рдЗрдирдкреБрдЯ рдмреЗрд╕ рдмреНрд▓реЙрдХ рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмреНрд▓реЙрдХ i рдФрд░ n рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, n рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ (nsw рдлрд╝реНрд▓реИрдЧ C рднрд╛рд╖рд╛ рдЧреБрдг рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рдлрд╝реНрд▓реИрдЧ рдХреЗ рдмрд┐рдирд╛ LLVM рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдореИрдВрдиреЗ slt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрдо рдорд╛рди рдХреА рддреБрд▓рдирд╛ рдХреА рд╣реИ (рд╕рд╛рдЗрди рдЗрди рд╕реЗ рдХрдо, рд╕реЗ рдХрдо рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВ) рдФрд░ рдлрд┐рд░ рдЕрдВрддрддрдГ for.body рдпрд╛ for.end рдмреНрд▓реЙрдХ рдореЗрдВ рд╢рд╛рдЦрд╛ред

рд▓реВрдк рдмреЙрдбреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗрд╡рд▓ for.cond рдмреНрд▓реЙрдХ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ:

 for.body: %2 = load i32*, i32** %a.addr, align 8 %3 = load i32, i32* %i, align 4 %idxprom = sext i32 %3 to i64 %arrayidx = getelementptr inbounds i32, i32* %2, i64 %idxprom %4 = load i32, i32* %arrayidx, align 4 %5 = load i32*, i32** %a.addr, align 8 %6 = load i32, i32* %i, align 4 %add = add nsw i32 %6, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32, i32* %5, i64 %idxprom1 %7 = load i32, i32* %arrayidx2, align 4 %cmp3 = icmp sgt i32 %4, %7 br i1 %cmp3, label %if.then, label %if.end 

рдкрд╣рд▓реЗ рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ SSA рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ i рд▓реЛрдб рдХрд░рддреА рд╣реИрдВ; рдореИрдВ рдлрд┐рд░ 64 рдмрд┐рдЯреНрд╕ рддрдХ рдлреИрд▓рддрд╛ рд╣реВрдВ рдФрд░ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВред Getelementptr рдХрдорд╛рдВрдб (рдпрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдЬрд┐рдк ) LLVM рдХрдорд╛рдВрдб рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рджрд┐рдЦрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕рд╣рд╛рдпрддрд╛ рдЕрдиреБрднрд╛рдЧ рднреА рд╣реИ ред рдорд╢реАрди рдХреА рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, LLVM рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИред рдпрд╣ рдЙрд░реНрдл тАЛтАЛрд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрдиреНрдп рдореЗрдореЛрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдПрдХ [i] рдФрд░ рдПрдХ [i + 1] рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢рд╛рдЦрд╛ рдХрд░рддрд╛ рд╣реИред

If.then рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ 0 рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдмреНрд▓реЙрдХ рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджрддрд╛ рд╣реИ:

 if.then: store i1 false, i1* %retval, align 1 br label %return 

рдЕрдиреНрдп рдмреНрд▓реЙрдХ рддреБрдЪреНрдЫ рд╣реИ:

 if.end: br label %for.inc 

рдФрд░ рдПрдХ рд▓реВрдк рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

 for.inc: %8 = load i32, i32* %i, align 4 %inc = add nsw i32 %8, 1 store i32 %inc, i32* %i, align 4 br label %for.cond 

рдпрд╣ рдХреЛрдб рд▓реВрдк рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХреВрджрддрд╛ рд╣реИред

рдпрджрд┐ рд▓реВрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рд╣реА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:

 for.end: store i1 true, i1* %retval, align 1 br label %return 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЬреЛ рд╣рдордиреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕реНрдЯреИрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ:

 return: %9 = load i1, i1* %retval, align 1 ret i1 %9 

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдкреЛрд╕реНрдЯ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреА рд╣реЛ рдЧрдИ рд╣реИ, рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдИрдЖрд░ рд╕реНрддрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

(рднреЗрдЬреЗ рдЧрдП рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╢реА рд╡рд╛рдВрдЧ рдФрд░ рдПрд▓реЗрдХреНрд╕ рд░реЛрд╕реЗрдирдмрд░реНрдЧ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж)

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


All Articles