You _might_ get it to in a very specific cases, like when "c = a + b" is a part of basic block where data-flow analysis tells you that a and b are absolutely guaranteed to be plain ints on input.
Even then you still get something like "unpack a and b from tagged value representation, check for overflow, just do asm("add a,b") if no overflow, add_and_promote_to_big_int(a,b) if overflowed, add type tag, store c".
In most cases though you get extra weight like 'look-up JIT cache for this combination of parameter types, jump there if i'm lucky, update counters and interpret it or JIT compile it if not" and so on, and so on, and so on.
You might get decent output in some cases, but in general optimizing dynamically typed languages is hard or sometimes just impossible.