Any processor has registers (except very rare and now dead stack-based architectures). The keyword register
in C is just a hint for the compiler to map that variable in a register and not on the stack. This comes from "ancient" times when the algorithms to map variables to registers weren't that efficient. Nowadays these algorithms map better than a human could, so there is really no need to use the register
hint.
I really don't know about iPhone ARM compilers, but I really don't think they don't use modern algorithms to map variables to registers.
Also note that what I have told you is valid for compiling with optimization flags.
Register are the fastest memory a processor has, it resides inside the CPU, they run at the speed of the processor and have no time penalty to access it. However, registers are limited and very few, from 4-6 general purpose registers (on CISC architectures) to 10-20 registers (on RISC architectures). A compiler will try to map the most used accessed variables to these registers. When he runs out of registers he has to map the variables on the stack, which is much slower (it is in RAM, but mostly it is cached in cache L1 or L2).
So the decision as which variables are mapped to registers and which variables are mapped on the stack has significant impact on performance, but, as I have said, nowadays the compilers are doing a better job than a human could at mapping variables to registers.