[1] Its goal is to detect which of these indexing operations do not need to be validated at runtime, and eliminating those checks.
However, it may still be possible for the compiler or runtime to perform proper bounds-checking elimination in this case.
One technique for bounds-checking elimination is to use a typed static single assignment form representation and for each array to create a new type representing a safe index for that particular array.
The first use of a value as an array index results in a runtime type cast (and appropriate check), but subsequently the safe index value can be used without a type cast, without sacrificing correctness or safety.
Just-in-time compiled languages such as Java and C# often check indexes at runtime before accessing arrays.