Suppose that we have hardware with capability support. Untrusted programs access memory with instructions that reference a memory capability and an offset. This is a fairly conventional idea. The (non capability) IBM 360 introduced an architecture that did not include data addresses in the instruction stream. Given the popularity of Fortran with its array orientation most instructions that computed a memory address specified two general registers to whose sum was added a 12 bit offset found in the instruction. When several arrays were accessed in a short span and those accesses involved the same subscript value, then then one of the registers could hold the origin of one array and the other register could hold the index. I suspect that without the array orientation the following memory access patterns should suffice:
Of course with capability access to memory we can use a virtual cache.