2013/11/11 Richard Biener <richard.guent...@gmail.com>: > On Fri, Nov 8, 2013 at 11:03 AM, Ilya Enkovich <enkovich....@gmail.com> wrote: >> 2013/11/8 Richard Biener <richard.guent...@gmail.com>: >>> On Thu, Nov 7, 2013 at 7:55 PM, Jeff Law <l...@redhat.com> wrote: >>>> On 11/07/13 04:50, Ilya Enkovich wrote: >>>>> >>>>> Hi, >>>>> >>>>> Here is an updated patch version. >>>> >>>> I think this needs to hold until we have a consensus on what the parameter >>>> passing looks like for bounded pointers. >>> >>> I still think the best thing to do on GIMPLE is >>> >>> arg_2 = __builtin_ia32_bnd_arg (arg_1(D)); >>> foo (arg_2); >>> >>> that is, make the parameter an implicit pair of {value, bound} where >>> the bound is determined by the value going through a bound association >>> builtin. No extra explicit argument to the calls so arguments match >>> the fndecl and fntype. All the complexity is defered to the expander >>> which can trivially lookup bound arguments via the SSA def (I suppose >>> it does that anyway now for getting at the explicit bound argument now). >>> >>> As far as I can see (well, think), all currently passed bound arguments >>> are the return value of such builtin already. >> >> All bounds are result of different builtin calls. Small example: >> >> int *global_p; >> void foo (int *p) >> { >> int buf[10]; >> bar (p, buf, global_p); >> } >> >> >> It is translated into: >> >> __bound_tmp.1_7 = __builtin_ia32_bndmk (&buf, 40); >> __bound_tmp.1_6 = __builtin_ia32_arg_bnd (p_3(D)(ab)); >> global_p.0_2 = global_p; >> __bound_tmp.1_8 = __builtin_ia32_bndldx (&global_p, global_p.0_2); >> bar (p_3(D)(ab), __bound_tmp.1_6, &buf, __bound_tmp.1_7, >> global_p.0_2, __bound_tmp.1_8); >> >> Bounds binding via calls as you suggest may be done as following: >> >> __bound_tmp.1_7 = __builtin_ia32_bndmk (&buf, 40); >> __bound_tmp.1_6 = __builtin_ia32_arg_bnd (p_3(D)(ab)); >> global_p.0_2 = global_p; >> __bound_tmp.1_8 = __builtin_ia32_bndldx (&global_p, global_p.0_2); >> _9 = __builtin_bind_bounds (p_3(D)(ab), __bound_tmp.1_6); >> _10 = __builtin_bind_bounds (&buf, __bound_tmp.1_7); >> _11 = __builtin_bind_bounds (global_p.0_2, __bound_tmp.1_8); >> bar (_9, _10, _11); >> >> Is it close to what you propose? > > Yes.
Is there a way to bind bounds with structures in a similar way? For SSA names I may easily find definition and check if it is a binding builtin call. But for structures it is not possible. The way I see it to mark all such args as addressable and load required bounds on expand pass. Ilya > > Richard. > >> Ilya >>> >>> Richard. >>> >>> >>> >>>> Jeff