assigns value based on what block we jumped from.
phi i32 [0, %start], [%i.new, %loop]means:
- Value should be 0 if we came from %startblock
- value should be %i.newif we came from%loopblock This allows you to have dynamic variables
Alternate Example
; After running through `opt -p mem2reg`
define i32 @pow(i32 %x, i32 %y) {
start:
  br label %loop_start
loop_start:
  %i.0 = phi i32 [0, %start], [%i.new, %loop]
  %r.0 = phi i32 [1, %start], [%r.new, %loop]
  %done = icmp eq i32 %i.0, %y
  br i1 %done, label %exit, label %loop
loop:
  %r.new = mul i32 %r.0, %x
  %i.new = add i32 %i.0, 1
  br label %loop_start
exit:
  ret i32 %r.0
}