https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119474
--- Comment #1 from Andrew Stubbs <ams at gcc dot gnu.org> --- In the -O1 case, the problem seems to be that the "ivopts" pass has identified an item-in-an-array-in-a-struct as the IV, and that struct is in a different address space: Type: REFERENCE ADDRESS Use 0.0: At stmt: _9 = v1.values_[i_38]; At pos: v1.values_[i_38] IV struct: Type: int * Base: (int *) (unsigned long) &v1 Step: 4 Object: (void *) (&v1) Biv: N Overflowness wrto loop niter: Overflow When it tries to calculate the base address-of operator, it observes the type of "values_[i_38]", which doesn't have anything like an address space. In the -O2 case, the problem seems to be the same, except that it's happening in the "vect" pass: the compiler attempts to create a "vectp" to match &v1, but doesn't propogate the address space correctly. Question: are we just missing address-space handling in a bunch of places, or is the OpenACC lowering producing non-canonical IVs somehow?