Initial MachineInstructions (with parallel copies)

InstrBlock(id = 0, seq = 9, h = 0, succ = [1])
mov signed int r v1, 111
mov signed int u v1, 222
mov signed int i v1, 0
jmp .block_1
InstrBlock(id = 1, seq = 8, h = 1, succ = [2, 3])
signed int r v2 ← φ(n0 v1, n9 v4)
signed int u v2 ← φ(n0 v1, n9 v4)
signed int i v2 ← φ(n0 v1, n9 v3)
signed int __postfix_copy_0 v1 ← φ(n0 v0, n9 v2)
cmp signed int i v2, 2
jl .block_2
jmp .block_3
InstrBlock(id = 2, seq = 4, h = 2, succ = [4, 6])
mov signed int i v4, signed int i v2
parallel copy [signed int r v7, signed int u v7, signed int i v7] ← [signed int r v2, signed int u v2, signed int i v4]
	mov rdi, "%d"
	mov rax, 0
call printf
	[constrains signed int i v2 to register rsi]
	[result signed int vreg8 constrained to register rax]
	[dummy args: rax | dummy res: rax, rcx, rdx, rsi, rdi, r8, r9, r10, r11, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm8, zmm9, zmm10, zmm11, zmm12, zmm13, zmm14, zmm15, zmm16, zmm17, zmm18, zmm19, zmm20, zmm21, zmm22, zmm23, zmm24, zmm25, zmm26, zmm27, zmm28, zmm29, zmm30, zmm31]
	add rsp, 0
mov signed int vreg0, signed int vreg8
cmp signed int i v7, 1
jge .block_4
jmp .block_6
InstrBlock(id = 3, seq = 7, h = 2, succ = [10, 12])
mov signed int vreg6, signed int r v2
imul signed int vreg6, signed int u v2
cmp signed int vreg6, 20
je .block_10
jmp .block_12
InstrBlock(id = 4, seq = 3, h = 3, succ = [6])
mov signed int r v3, 4
jmp .block_6
InstrBlock(id = 6, seq = 2, h = 4, succ = [7, 9])
signed int r v4 ← φ(n2 v7, n4 v3)
signed int i v5 ← φ(n2 v7, n4 v4)
signed int u v5 ← φ(n2 v7, n4 v2)
cmp signed int i v5, 1
jl .block_7
jmp .block_9
InstrBlock(id = 7, seq = 1, h = 5, succ = [9])
mov signed int u v3, 5
jmp .block_9
InstrBlock(id = 9, seq = 0, h = 6, succ = [1])
signed int u v4 ← φ(n6 v5, n7 v3)
signed int i v6 ← φ(n6 v5, n7 v5)
mov signed int __postfix_copy_0 v2, signed int i v6
mov signed int vreg3, signed int i v6
add signed int vreg3, 1
mov signed int i v3, signed int vreg3
jmp .block_1
InstrBlock(id = 10, seq = 6, h = 3, succ = [12])
mov signed int r v5, 8
jmp .block_12
InstrBlock(id = 12, seq = 5, h = 4, succ = [])
signed int r v6 ← φ(n3 v2, n10 v5)
signed int u v6 ← φ(n3 v2, n10 v2)
mov signed int vreg7, signed int r v6
add signed int vreg7, signed int u v6
mov rax, signed int vreg7
jmp .block_14

Register allocation

IRValue MachineRegister
signed int r v1
register rax
signed int u v1
register rbx
signed int i v1
register rcx
signed int r v2
register rax
signed int u v2
register rbx
signed int i v2
register rsi
signed int __postfix_copy_1 v1
register rdx
signed int i v4
register rcx
signed int r v7
register r12
signed int u v7
register rbx
signed int i v7
register r13
signed int vreg8
register rax
signed int vreg0
register rax
signed int r v3
register rax
signed int r v4
register rax
signed int i v5
register rbx
signed int u v5
register rcx
signed int u v3
register rbx
signed int u v4
register rbx
signed int i v6
register rcx
signed int __postfix_copy_1 v2
register rdx
signed int vreg3
register rcx
signed int i v3
register rcx
signed int vreg6
register rcx
signed int r v5
register rax
signed int r v6
register rax
signed int u v6
register rbx
signed int vreg7
register rax

Allocation violations

[SOFT] coloring violation for register rcx at (block 3, index 1)
-->imul signed int vreg6, signed int u v2
[SOFT] coloring violation for register rcx at (block 9, index 2)
-->add signed int vreg3, 1
[SOFT] coloring violation for register rax at (block 12, index 1)
-->add signed int vreg7, signed int u v6

Processed MachineInstructions (with applied allocation)

InstrBlock(id = 15, seq = 9, h = 0, succ = [16])
mov eax, 111
mov ebx, 222
mov ecx, 0
mov rsi, rcx
jmp .block_16
InstrBlock(id = 16, seq = 8, h = 1, succ = [17, 18])
cmp esi, 2
jl .block_17
jmp .block_18
InstrBlock(id = 17, seq = 4, h = 2, succ = [19, 30])
mov ecx, esi
mov r12, rax
mov r13, rcx
mov rdi, "%d"
mov al, 0
call printf
add rsp, 0
mov eax, eax
cmp r13d, 1
jge .block_19
jmp .block_30
InstrBlock(id = 18, seq = 7, h = 2, succ = [25, 27])
mov ecx, eax
imul ecx, ebx
cmp ecx, 20
je .block_25
jmp .block_27
InstrBlock(id = 19, seq = 3, h = 3, succ = [21])
mov eax, 4
mov rbx, rbx
mov rbx, rcx
mov rcx, rbx
jmp .block_21
InstrBlock(id = 21, seq = 2, h = 4, succ = [22, 31])
cmp ebx, 1
jl .block_22
jmp .block_31
InstrBlock(id = 22, seq = 1, h = 5, succ = [24])
mov ebx, 5
mov rcx, rbx
jmp .block_24
InstrBlock(id = 24, seq = 0, h = 6, succ = [16])
mov edx, ecx
mov ecx, ecx
add ecx, 1
mov ecx, ecx
mov rsi, rcx
jmp .block_16
InstrBlock(id = 25, seq = 6, h = 3, succ = [27])
mov eax, 8
jmp .block_27
InstrBlock(id = 27, seq = 5, h = 4, succ = [])
mov eax, eax
add eax, ebx
mov eax, eax
jmp .block_29
InstrBlock(id = 29, seq = 0, h = 2147483647, succ = [])
InstrBlock(id = 30, seq = 11, h = 4, succ = [21])
mov rax, r12
mov rcx, rbx
mov rbx, r13
jmp .block_21
InstrBlock(id = 31, seq = 12, h = 6, succ = [24])
mov rdx, rbx
mov rbx, rcx
mov rcx, rdx
jmp .block_24

Optimized MachineInstructions

InstrBlock(id = 15, seq = 9, h = 0, succ = [16])
mov eax, 111
mov ebx, 222
mov ecx, 0
mov rsi, rcx
jmp .block_16
(initial: 5 | optimized: 5)

InstrBlock(id = 16, seq = 8, h = 1, succ = [17, 18])
cmp esi, 2
jl .block_17
jmp .block_18
(initial: 3 | optimized: 3)

InstrBlock(id = 17, seq = 4, h = 2, succ = [19, 30])
mov ecx, esi
mov r12, rax
mov r13, rcx
mov rdi, "%d"
mov al, 0
call printf
add rsp, 0
cmp r13d, 1
jge .block_19
jmp .block_30
(initial: 11 | optimized: 10)

InstrBlock(id = 18, seq = 7, h = 2, succ = [25, 27])
mov ecx, eax
imul ecx, ebx
cmp ecx, 20
je .block_25
jmp .block_27
(initial: 5 | optimized: 5)

InstrBlock(id = 19, seq = 3, h = 3, succ = [21])
mov eax, 4
mov rbx, rcx
mov rcx, rbx
jmp .block_21
(initial: 5 | optimized: 4)

InstrBlock(id = 21, seq = 2, h = 4, succ = [22, 31])
cmp ebx, 1
jl .block_22
jmp .block_31
(initial: 3 | optimized: 3)

InstrBlock(id = 22, seq = 1, h = 5, succ = [24])
mov ebx, 5
mov rcx, rbx
jmp .block_24
(initial: 3 | optimized: 3)

InstrBlock(id = 24, seq = 0, h = 6, succ = [16])
mov edx, ecx
add ecx, 1
mov rsi, rcx
jmp .block_16
(initial: 6 | optimized: 4)

InstrBlock(id = 25, seq = 6, h = 3, succ = [27])
mov eax, 8
jmp .block_27
(initial: 2 | optimized: 2)

InstrBlock(id = 27, seq = 5, h = 4, succ = [])
add eax, ebx
jmp .block_29
(initial: 4 | optimized: 2)

InstrBlock(id = 29, seq = 0, h = 2147483647, succ = [])
(initial: 0 | optimized: 0)

InstrBlock(id = 30, seq = 11, h = 4, succ = [21])
mov rax, r12
mov rcx, rbx
mov rbx, r13
jmp .block_21
(initial: 4 | optimized: 4)

InstrBlock(id = 31, seq = 12, h = 6, succ = [24])
mov rdx, rbx
mov rbx, rcx
mov rcx, rdx
jmp .block_24
(initial: 4 | optimized: 4)

Original source

#include <stdio.h>
int main() {
  int r = 111;
  int u = 222;
  for (int i = 0; i < 2; i++) {
    printf("%d", i);
    if (i >= 1) {
      r = 4;
    }
    if (i < 1) {
      u = 5;
    }
  }
  if (r * u == 20) {
    r = 8;
  }
  return r + u;
}