Combining of functions
Description
The pass combines several functions into one, merging the prototypes and substituting dummy values for unused arguments during calls.
Original Code
.file "lab8.bc"
.686
.MMX
.XMM
.model flat
EXTERN printf:near
EXTERN scanf:near
EXTERN putchar:near
.text
public _Z10InputArrayPA10_dii
.align 16
_Z10InputArrayPA10_dii proc near
push EBP
push EBX
push EDI
push ESI
sub ESP, 20
cmp DWORD PTR [ESP + 44], 0
jle .LBB1_6
.LBB1_1: ; %entry
mov ESI, DWORD PTR [ESP + 48]
test ESI, ESI
jle .LBB1_6
.LBB1_2: ; %entry.bb2.preheader_crit_edge
mov EAX, DWORD PTR [ESP + 40]
mov DWORD PTR [ESP + 12], EAX
mov DWORD PTR [ESP + 16], 0
jmp .LBB1_5
.align 16
.LBB1_3: ; %bb1
inc EBP
mov DWORD PTR [ESP + 8], EBP
mov DWORD PTR [ESP + 4], EDI
mov DWORD PTR [ESP], OFFSET .L_2E_str1
call printf
mov DWORD PTR [ESP + 4], EBX
mov DWORD PTR [ESP], OFFSET .L_2E_str2
call scanf
add EBX, 8
cmp EBP, ESI
jne .LBB1_3
.LBB1_4: ; %bb3
add DWORD PTR [ESP + 12], 80
mov EDI, DWORD PTR [ESP + 16]
inc EDI
mov DWORD PTR [ESP + 16], EDI
cmp EDI, DWORD PTR [ESP + 44]
je .LBB1_6
.LBB1_5: ; %bb2.preheader
mov EDI, DWORD PTR [ESP + 16]
lea EDI, DWORD PTR [EDI + 1]
xor EBP, EBP
mov EBX, DWORD PTR [ESP + 12]
jmp .LBB1_3
.LBB1_6: ; %return
add ESP, 20
pop ESI
pop EDI
pop EBX
pop EBP
ret
_Z10InputArrayPA10_dii endp
public _Z15ProcessingArrayPA10_dPdii
.align 16
_Z15ProcessingArrayPA10_dPdii proc near
push EBP
push EBX
push EDI
push ESI
sub ESP, 4
mov EAX, DWORD PTR [ESP + 36]
mov DWORD PTR [ESP], EAX
test EAX, EAX
jle .LBB2_10
.LBB2_1: ; %bb.nph16
mov EAX, DWORD PTR [ESP + 24]
lea EAX, DWORD PTR [EAX + 80]
mov ECX, DWORD PTR [ESP + 32]
lea ECX, DWORD PTR [ECX - 1]
xor EDX, EDX
.LBB2_2: ; %bb
mov ESI, DWORD PTR [ESP + 24]
cvttsd2si ESI, QWORD PTR [ESI + EDX]
lea EDI, DWORD PTR [EAX + EDX]
cmp DWORD PTR [ESP + 32], 1
jle .LBB2_11
.LBB2_3: ; %bb1.preheader
mov EBP, ECX
mov EBX, ESI
.align 16
.LBB2_4: ; %bb1
movsd XMM0, QWORD PTR [EDI]
cvtsi2sd XMM1, ESI
ucomisd XMM1, XMM0
jbe .LBB2_6
.LBB2_5: ; %bb2
cvttsd2si ESI, XMM0
.LBB2_6: ; %bb3
cvtsi2sd XMM1, EBX
ucomisd XMM0, XMM1
jbe .LBB2_8
.LBB2_7: ; %bb4
cvttsd2si EBX, XMM0
.LBB2_8: ; %bb5
add EDI, 80
dec EBP
jne .LBB2_4
.LBB2_9: ; %bb7
sub EBX, ESI
cvtsi2sd XMM0, EBX
mov ESI, DWORD PTR [ESP + 28]
movsd QWORD PTR [EDX + ESI], XMM0
add EDX, 8
dec DWORD PTR [ESP]
jne .LBB2_2
.LBB2_10: ; %return
add ESP, 4
pop ESI
pop EDI
pop EBX
pop EBP
ret
.LBB2_11: ; %bb.bb7_crit_edge
mov EBX, ESI
jmp .LBB2_9
_Z15ProcessingArrayPA10_dPdii endp
public _Z8OutArrayPdi
.align 16
_Z8OutArrayPdi proc near
push EBX
push EDI
push ESI
sub ESP, 16
mov ESI, DWORD PTR [ESP + 36]
test ESI, ESI
jle .LBB3_3
.LBB3_1: ; %entry.bb_crit_edge
mov EDI, DWORD PTR [ESP + 32]
xor EAX, EAX
mov EBX, EAX
.align 16
.LBB3_2: ; %bb
movsd XMM0, QWORD PTR [EDI + 8*EBX]
movsd QWORD PTR [ESP + 8], XMM0
mov DWORD PTR [ESP + 4], EBX
mov DWORD PTR [ESP], OFFSET .L_2E_str
call printf
inc EBX
cmp EBX, ESI
jne .LBB3_2
.LBB3_3: ; %return
add ESP, 16
pop ESI
pop EDI
pop EBX
ret
_Z8OutArrayPdi endp
public main
.align 16
main proc near
push EDI
push ESI
sub ESP, 508
mov DWORD PTR [ESP], OFFSET .L_2E_str3
call printf
lea EAX, DWORD PTR [ESP + 16]
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP], OFFSET .L_2E_str4
call scanf
cmp DWORD PTR [ESP + 16], 6
jl .LBB4_2
.LBB4_1: ; %bb
mov DWORD PTR [ESP], OFFSET .L_2E_str5
call printf
.LBB4_2: ; %bb1
mov DWORD PTR [ESP], OFFSET .L_2E_str6
call printf
lea EAX, DWORD PTR [ESP + 20]
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP], OFFSET .L_2E_str4
call scanf
cmp DWORD PTR [ESP + 20], 11
jl .LBB4_4
.LBB4_3: ; %bb2
mov DWORD PTR [ESP], OFFSET .L_2E_str7
call printf
.LBB4_4: ; %bb3
mov DWORD PTR [ESP], 10
call putchar
mov EAX, DWORD PTR [ESP + 16]
mov ECX, DWORD PTR [ESP + 20]
mov DWORD PTR [ESP + 8], ECX
mov DWORD PTR [ESP + 4], EAX
lea ESI, DWORD PTR [ESP + 24]
mov DWORD PTR [ESP], ESI
call _Z10InputArrayPA10_dii
mov EAX, DWORD PTR [ESP + 16]
mov ECX, DWORD PTR [ESP + 20]
mov DWORD PTR [ESP + 12], ECX
mov DWORD PTR [ESP + 8], EAX
lea EAX, DWORD PTR [ESP + 424]
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP], ESI
call _Z15ProcessingArrayPA10_dPdii
mov ESI, DWORD PTR [ESP + 20]
test ESI, ESI
jle .LBB4_7
.LBB4_5: ; %bb3.bb.i_crit_edge
xor EAX, EAX
mov EDI, EAX
.align 16
.LBB4_6: ; %bb.i
movsd XMM0, QWORD PTR [ESP + 8*EDI + 424]
movsd QWORD PTR [ESP + 8], XMM0
mov DWORD PTR [ESP + 4], EDI
mov DWORD PTR [ESP], OFFSET .L_2E_str
call printf
inc EDI
cmp EDI, ESI
jne .LBB4_6
.LBB4_7: ; %_Z8OutArrayPdi.exit
mov DWORD PTR [ESP + 4], 4
mov DWORD PTR [ESP], OFFSET .L_2E_str8
call printf
xor EAX, EAX
add ESP, 508
pop ESI
pop EDI
ret
main endp
.L_2E_str:; .str
db 'out[%d] = %lg',10,0
.L_2E_str1:; .str1
db 'Matrix[%d, %d] = ',0
.L_2E_str2:; .str2
db '%lg',0
.L_2E_str3:; .str3
db 'rows: N = ',0
.L_2E_str4:; .str4
db '%d',0
.L_2E_str5:; .str5
db 10,'Number of rows must be 5 or less',0
.L_2E_str6:; .str6
db 'cols: N = ',0
.L_2E_str7:; .str7
db 10,'Number of columns must be 10 or less',0
.L_2E_str8:; .str8
db 'sizeof(void*) = %d',10,0
end
Transformed Code
.686
.MMX
.XMM
.model flat
EXTERN printf:near
EXTERN scanf:near
EXTERN putchar:near
.text
public _Z10InputArrayPA10_dii
.align 16
_Z10InputArrayPA10_dii proc near
push EBP
push EBX
push EDI
push ESI
sub ESP, 20
cmp DWORD PTR [ESP + 44], 0
jle .LBB1_6
.LBB1_1: ; %entry
mov ESI, DWORD PTR [ESP + 48]
test ESI, ESI
jle .LBB1_6
.LBB1_2: ; %entry.bb2.preheader_crit_edge
mov EAX, DWORD PTR [ESP + 40]
mov DWORD PTR [ESP + 12], EAX
mov DWORD PTR [ESP + 16], 0
jmp .LBB1_5
.align 16
.LBB1_3: ; %bb1
inc EBP
mov DWORD PTR [ESP + 8], EBP
mov DWORD PTR [ESP + 4], EDI
mov DWORD PTR [ESP], OFFSET .L_2E_str1
call printf
mov DWORD PTR [ESP + 4], EBX
mov DWORD PTR [ESP], OFFSET .L_2E_str2
call scanf
add EBX, 8
cmp EBP, ESI
jne .LBB1_3
.LBB1_4: ; %bb3
add DWORD PTR [ESP + 12], 80
mov EDI, DWORD PTR [ESP + 16]
inc EDI
mov DWORD PTR [ESP + 16], EDI
cmp EDI, DWORD PTR [ESP + 44]
je .LBB1_6
.LBB1_5: ; %bb2.preheader
mov EDI, DWORD PTR [ESP + 16]
lea EDI, DWORD PTR [EDI + 1]
xor EBP, EBP
mov EBX, DWORD PTR [ESP + 12]
jmp .LBB1_3
.LBB1_6: ; %return
add ESP, 20
pop ESI
pop EDI
pop EBX
pop EBP
ret
_Z10InputArrayPA10_dii endp
public _Z15ProcessingArrayPA10_dPdii
.align 16
_Z15ProcessingArrayPA10_dPdii proc near
push EBP
push EBX
push EDI
push ESI
sub ESP, 4
mov EAX, DWORD PTR [ESP + 36]
mov DWORD PTR [ESP], EAX
test EAX, EAX
jle .LBB2_10
.LBB2_1: ; %bb.nph16
mov EAX, DWORD PTR [ESP + 24]
lea EAX, DWORD PTR [EAX + 80]
mov ECX, DWORD PTR [ESP + 32]
lea ECX, DWORD PTR [ECX - 1]
xor EDX, EDX
.LBB2_2: ; %bb
mov ESI, DWORD PTR [ESP + 24]
cvttsd2si ESI, QWORD PTR [ESI + EDX]
lea EDI, DWORD PTR [EAX + EDX]
cmp DWORD PTR [ESP + 32], 1
jle .LBB2_11
.LBB2_3: ; %bb1.preheader
mov EBP, ECX
mov EBX, ESI
.align 16
.LBB2_4: ; %bb1
movsd XMM0, QWORD PTR [EDI]
cvtsi2sd XMM1, ESI
ucomisd XMM1, XMM0
jbe .LBB2_6
.LBB2_5: ; %bb2
cvttsd2si ESI, XMM0
.LBB2_6: ; %bb3
cvtsi2sd XMM1, EBX
ucomisd XMM0, XMM1
jbe .LBB2_8
.LBB2_7: ; %bb4
cvttsd2si EBX, XMM0
.LBB2_8: ; %bb5
add EDI, 80
dec EBP
jne .LBB2_4
.LBB2_9: ; %bb7
sub EBX, ESI
cvtsi2sd XMM0, EBX
mov ESI, DWORD PTR [ESP + 28]
movsd QWORD PTR [EDX + ESI], XMM0
add EDX, 8
dec DWORD PTR [ESP]
jne .LBB2_2
.LBB2_10: ; %return
add ESP, 4
pop ESI
pop EDI
pop EBX
pop EBP
ret
.LBB2_11: ; %bb.bb7_crit_edge
mov EBX, ESI
jmp .LBB2_9
_Z15ProcessingArrayPA10_dPdii endp
public _Z8OutArrayPdi
.align 16
_Z8OutArrayPdi proc near
push EBX
push EDI
push ESI
sub ESP, 16
mov ESI, DWORD PTR [ESP + 36]
test ESI, ESI
jle .LBB3_3
.LBB3_1: ; %entry.bb_crit_edge
mov EDI, DWORD PTR [ESP + 32]
xor EAX, EAX
mov EBX, EAX
.align 16
.LBB3_2: ; %bb
movsd XMM0, QWORD PTR [EDI + 8*EBX]
movsd QWORD PTR [ESP + 8], XMM0
mov DWORD PTR [ESP + 4], EBX
mov DWORD PTR [ESP], OFFSET .L_2E_str
call printf
inc EBX
cmp EBX, ESI
jne .LBB3_2
.LBB3_3: ; %return
add ESP, 16
pop ESI
pop EDI
pop EBX
ret
_Z8OutArrayPdi endp
public main
.align 16
main proc near
push EDI
push ESI
sub ESP, 516
mov DWORD PTR [ESP], OFFSET .L_2E_str3
call printf
lea EAX, DWORD PTR [ESP + 24]
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP], OFFSET .L_2E_str4
call scanf
cmp DWORD PTR [ESP + 24], 6
jl .LBB4_2
.LBB4_1: ; %bb
mov DWORD PTR [ESP], OFFSET .L_2E_str5
call printf
.LBB4_2: ; %bb1
mov DWORD PTR [ESP], OFFSET .L_2E_str6
call printf
lea EAX, DWORD PTR [ESP + 28]
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP], OFFSET .L_2E_str4
call scanf
cmp DWORD PTR [ESP + 28], 11
jl .LBB4_4
.LBB4_3: ; %bb2
mov DWORD PTR [ESP], OFFSET .L_2E_str7
call printf
.LBB4_4: ; %bb3
mov DWORD PTR [ESP], 10
call putchar
mov EAX, DWORD PTR [ESP + 24]
mov ECX, DWORD PTR [ESP + 28]
mov DWORD PTR [ESP + 8], ECX
mov DWORD PTR [ESP + 4], EAX
lea ESI, DWORD PTR [ESP + 32]
mov DWORD PTR [ESP], ESI
mov DWORD PTR [ESP + 20], 0
mov DWORD PTR [ESP + 16], 7
mov DWORD PTR [ESP + 12], 0
call _2E__Z10InputArrayPA10_dii_2E__Z15ProcessingArrayPA10_dPdii_2E__Z8OutArrayPdi
mov EAX, DWORD PTR [ESP + 24]
mov ECX, DWORD PTR [ESP + 28]
lea EDX, DWORD PTR [ESP + 432]
mov DWORD PTR [ESP + 20], EDX
mov DWORD PTR [ESP + 12], ESI
mov DWORD PTR [ESP + 8], ECX
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP + 16], 8
mov DWORD PTR [ESP], 0
call _2E__Z10InputArrayPA10_dii_2E__Z15ProcessingArrayPA10_dPdii_2E__Z8OutArrayPdi
mov ESI, DWORD PTR [ESP + 28]
test ESI, ESI
jle .LBB4_7
.LBB4_5: ; %bb3.bb.i_crit_edge
xor EAX, EAX
mov EDI, EAX
.align 16
.LBB4_6: ; %bb.i
movsd XMM0, QWORD PTR [ESP + 8*EDI + 432]
movsd QWORD PTR [ESP + 8], XMM0
mov DWORD PTR [ESP + 4], EDI
mov DWORD PTR [ESP], OFFSET .L_2E_str
call printf
inc EDI
cmp EDI, ESI
jne .LBB4_6
.LBB4_7: ; %_Z8OutArrayPdi.exit
mov DWORD PTR [ESP + 4], 4
mov DWORD PTR [ESP], OFFSET .L_2E_str8
call printf
xor EAX, EAX
add ESP, 516
pop ESI
pop EDI
ret
main endp
public _2E__Z10InputArrayPA10_dii_2E__Z15ProcessingArrayPA10_dPdii_2E__Z8OutArrayPdi
.align 16
_2E__Z10InputArrayPA10_dii_2E__Z15ProcessingArrayPA10_dPdii_2E__Z8OutArrayPdi proc near
push EBP
.Llabel1:
push EBX
.Llabel2:
push EDI
.Llabel3:
push ESI
.Llabel4:
sub ESP, 28
.Llabel5:
mov EAX, DWORD PTR [ESP + 64]
cmp EAX, 7
mov ESI, DWORD PTR [ESP + 56]
mov ECX, DWORD PTR [ESP + 48]
mov DWORD PTR [ESP + 20], ECX
je .LBB5_3
.LBB5_1: ; %comb_entry
cmp EAX, 8
je .LBB5_9
.LBB5_2: ; %comb_entry
cmp EAX, 9
je .LBB5_19
.LBB5_3: ; %entry
cmp DWORD PTR [ESP + 52], 0
jle .LBB5_22
.LBB5_4: ; %entry
test ESI, ESI
jle .LBB5_22
.LBB5_5: ; %entry.bb2.preheader_crit_edge
mov DWORD PTR [ESP + 24], 0
jmp .LBB5_8
.align 16
.LBB5_6: ; %bb1
inc EBX
mov DWORD PTR [ESP + 8], EBX
mov DWORD PTR [ESP + 4], EBP
mov DWORD PTR [ESP], OFFSET .L_2E_str1
call printf
mov DWORD PTR [ESP + 4], EDI
mov DWORD PTR [ESP], OFFSET .L_2E_str2
call scanf
add EDI, 8
cmp EBX, ESI
jne .LBB5_6
.LBB5_7: ; %bb3
add DWORD PTR [ESP + 20], 80
mov EDI, DWORD PTR [ESP + 24]
inc EDI
mov DWORD PTR [ESP + 24], EDI
cmp EDI, DWORD PTR [ESP + 52]
je .LBB5_22
.LBB5_8: ; %bb2.preheader
mov EDI, DWORD PTR [ESP + 24]
lea EBP, DWORD PTR [EDI + 1]
xor EBX, EBX
mov EDI, DWORD PTR [ESP + 20]
jmp .LBB5_6
.LBB5_9: ; %entry2
test ESI, ESI
jle .LBB5_22
.LBB5_10: ; %bb.nph16
mov EAX, DWORD PTR [ESP + 60]
lea EAX, DWORD PTR [EAX + 80]
mov DWORD PTR [ESP + 24], EAX
mov EAX, DWORD PTR [ESP + 52]
lea EAX, DWORD PTR [EAX - 1]
xor ECX, ECX
.LBB5_11: ; %bb
mov EDX, DWORD PTR [ESP + 60]
cvttsd2si EDX, QWORD PTR [EDX + ECX]
mov EDI, DWORD PTR [ESP + 24]
lea EDI, DWORD PTR [EDI + ECX]
cmp DWORD PTR [ESP + 52], 1
jle .LBB5_23
.LBB5_12: ; %bb14.preheader
mov EBP, EAX
mov EBX, EDX
.align 16
.LBB5_13: ; %bb14
movsd XMM0, QWORD PTR [EDI]
cvtsi2sd XMM1, EDX
ucomisd XMM1, XMM0
jbe .LBB5_15
.LBB5_14: ; %bb2
cvttsd2si EDX, XMM0
.LBB5_15: ; %bb36
cvtsi2sd XMM1, EBX
ucomisd XMM0, XMM1
jbe .LBB5_17
.LBB5_16: ; %bb4
cvttsd2si EBX, XMM0
.LBB5_17: ; %bb5
add EDI, 80
dec EBP
jne .LBB5_13
.LBB5_18: ; %bb7
sub EBX, EDX
cvtsi2sd XMM0, EBX
mov EDX, DWORD PTR [ESP + 68]
movsd QWORD PTR [ECX + EDX], XMM0
add ECX, 8
dec ESI
jne .LBB5_11
jmp .LBB5_22
.LBB5_19: ; %entry9
cmp DWORD PTR [ESP + 52], 0
jle .LBB5_22
.LBB5_20: ; %entry9.bb10_crit_edge
xor EAX, EAX
mov ESI, EAX
.align 16
.LBB5_21: ; %bb10
mov EAX, DWORD PTR [ESP + 68]
movsd XMM0, QWORD PTR [EAX + 8*ESI]
movsd QWORD PTR [ESP + 8], XMM0
mov DWORD PTR [ESP + 4], ESI
mov DWORD PTR [ESP], OFFSET .L_2E_str
call printf
inc ESI
cmp ESI, DWORD PTR [ESP + 52]
jne .LBB5_21
.LBB5_22: ; %return
add ESP, 28
pop ESI
pop EDI
pop EBX
pop EBP
ret
.LBB5_23: ; %bb.bb7_crit_edge
mov EBX, EDX
jmp .LBB5_18
_2E__Z10InputArrayPA10_dii_2E__Z15ProcessingArrayPA10_dPdii_2E__Z8OutArrayPdi endp
.L_2E_str:; .str
db 'out[%d] = %lg',10,0
.L_2E_str1:; .str1
db 'Matrix[%d, %d] = ',0
.L_2E_str2:; .str2
db '%lg',0
.L_2E_str3:; .str3
db 'rows: N = ',0
.L_2E_str4:; .str4
db '%d',0
.L_2E_str5:; .str5
db 10,'Number of rows must be 5 or less',0
.L_2E_str6:; .str6
db 'cols: N = ',0
.L_2E_str7:; .str7
db 10,'Number of columns must be 10 or less',0
.L_2E_str8:; .str8
db 'sizeof(void*) = %d',10,0
end

