Diferencia de rendimiento entre coincidencia de patrones y if-else

¿Por qué OCaml puede generar un código de máquina eficiente para la coincidencia de patrones y no para las pruebas if-else?

Estaba leyendo Real World OCaml y me encontré conesta sección donde compararon el rendimiento de la coincidencia de patrones con el rendimiento de las pruebas if-else. Resultó que la coincidencia de patrones en su ejemplo fue significativamente más rápida que las pruebas if-else. Aunque el código no utiliza ningún caso especial de coincidencia de patrones que no sería posible con las pruebas if-else, solo compara enteros.

Atribuyen la optimización del compilador para la coincidencia de patrones como la razón de la diferencia de rendimiento. El compilador podría generar código de máquina que salta directamente al caso coincidente en función de un conjunto de comprobaciones de tiempo de ejecución elegidas de manera eficiente.

Entiendo esto, pero realmente no entiendo por qué el compilador no puede hacer lo mismo para las pruebas if-else. Después de todo, el código solo compara enteros con enteros. ¿Esto se debe a que OCaml (todavía) no ha optimizado las pruebas if-else, o es porque es imposible optimizar las pruebas if-else como es posible con la coincidencia de patrones?

El código de coincidencia de patrón se ve así:

let plus_one_match x =
    match x with
    | 0 -> 1
    | 1 -> 2
    | 2 -> 3
    | _ -> x + 1

El código if-else se ve así:

let plus_one_if x =
    if      x = 0 then 1
    else if x = 1 then 2
    else if x = 2 then 3
    else x + 1