On 29.01.2016 16:47 Bernd Schmidt wrote: > On 01/29/2016 04:41 PM, Jakub Jelinek wrote: >> On Fri, Jan 29, 2016 at 02:09:25AM +0100, Bernd Schmidt wrote: > >>> I think a better approach might be to just mark accesses at known >>> locations >>> in the frame, or arg pushes, as MEM_NOTRAP_P, and consider accesses with >>> non-constant or calculated offsets as potentially trapping. >> >> I don't see how that would work generally. Sure, if there is e.g. a >> constant >> offset array access, it could be checked easily, but if there is >> variable offset >> array access, that is at some point later on changed into a constant >> offset >> access, you'd need to be conservative, unless you can prove it is in >> range. > > Yes. What is the problem with that? If we have (plus sfp const_int) at > any point before reload, we can check whether that offset is inside > frame_size. If it isn't or if the offset isn't known, it could trap. > >
Usually we have "if (x==1234) { read MEM[FP+x]; }", so wo don't know, and then after reload: "if (x==1234) { read MEM[SP+x+sp_fp_offset]; }" but wait, in the if statement we know, that x==1234, so everything turns in one magic constant, and we have a totally new constant offset from the SP register "if (x==1234) { read MEM[SP+1234+sp_fp_offset]; }". Now if rtx_addr_can_trap_p(MEM[SP+1234+sp_fp_offset]) says it cannot trap we think we do not need the if at all => BANG. Bernd.