> You rely on being able to see all FRAME accesses as component refs, > thus nothing transforms them into just MEM[&FRAME, offset]. That's of > course something that can be easily "broken" by means of doing > some pointer arithmetic like (untested, but you get the idea) > > foo() > { > int c[32]; > int j; > bar() > { > int *p = &c[4]; > p = p + 1; > j = *p; > } > c[4] = 0; > bar(); > return j; > } > > this should get you j = MEM[<CHAIN>, 4]; in bar and thus a missing > component-ref when inlining.
The patch compiles hundreds of thousands of lines of Ada everyday at AdaCore, how could such a blatant hole have survived that? > I dont' think it's easily possible to recover from this in your scheme, > but it would be straight-forward for SRA (you basically look for the > base variable FRAME and special-case that completely for > replacement construction, also constraining accesses). Well, it's implemented in the 30-line block of code under the comment: + /* Deal with remaining MEM_REFs, i.e. those for which the field reference + has been replaced with the offset. */ > Marking the FRAME VAR_DECL looks useful, maybe you can split that out > of your patch? Sure. > As of doing it in SRA what I'd do there is special-case FRAME for both > candidate consideration (so you get around the addressable issue) > and replacement generation. OK, but you need to be able to split the FRAME structure without necessarily splitting its aggregate fields. Is that (easily) doable with current SRA? > Maybe you can open an enhancement bugreport for this and link > your patch / testcase to it? Will do. -- Eric Botcazou