> That looks backwards. Why should > > struct { V i; V j[0]; } > > have a different mode than > > struct { V j[0]; V i; } > > ?
Because we support out-of-bounds access for the array in the former case and not in the latter case. > And why should the same issue not exist for > > struct { V a[1]; } > > which is also "flexible enough" that we support accesses beyond it > via a pointer? That struct also has V2DImode. And this is all > because > > /* If this field is the whole struct, remember its mode so > that, say, we can put a double in a class into a DF > register instead of forcing it to live in the stack. */ > if (simple_cst_equal (TYPE_SIZE (type), DECL_SIZE (field))) > mode = DECL_MODE (field); > > which is IMHO ok. It's OK *only* if TYPE_SIZE (type) is really the size of all the objects of the type; if it isn't, i.e. if we allow access past TYPE_SIZE (type), then we cannot use the field's mode. So we need to decide where to draw the line. -- Eric Botcazou