DataType with type parameter

just looked at the respective compiled code and it looks really good indeed,
everything is stripped off

julia> @code_llvm do_this(1.0, 2.0)

; Function do_this
; Location: REPL[1]:2
; Function Attrs: uwtable
define double @julia_do_this_35437(double, double) #0 {
top:
; Location: REPL[1]:3
; Function +; {
; Location: float.jl:395
  %2 = fadd double %0, %1
;}
  ret double %2
}

julia> @code_llvm do_this(1,2)

; Function do_this
; Location: REPL[1]:2
; Function Attrs: uwtable
define i64 @julia_do_this_35439(i64, i64) #0 {
top:
; Location: REPL[1]:5
; Function -; {
; Location: int.jl:52
  %2 = sub i64 %0, %1
;}
  ret i64 %2
}

it would be awesome to have an overview, how far this goes, i.e. what if/else/try/catch/for/while kind of control flows are allowed for the compiler to still cleanly simplify the code