2013/11/6 Richard Biener <richard.guent...@gmail.com>: > On Wed, Nov 6, 2013 at 12:59 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: >> 2013/11/6 Richard Biener <richard.guent...@gmail.com>: >>> On Wed, Nov 6, 2013 at 12:00 PM, Ilya Enkovich <enkovich....@gmail.com> >>> wrote: >>>> 2013/11/6 Richard Biener <richard.guent...@gmail.com>: >>>>> On Tue, Nov 5, 2013 at 3:24 PM, Ilya Enkovich <enkovich....@gmail.com> >>>>> wrote: >>>>>> 2013/11/5 Richard Biener <richard.guent...@gmail.com>: >>>>>>> On Tue, Nov 5, 2013 at 1:52 PM, Ilya Enkovich <enkovich....@gmail.com> >>>>>>> wrote: >>>>>>>> >>>>>>>> For input parameter P I need to have >>>>>>>> BOUNDS = __builtin_arg_bnd (P) >>>>>>>> to somehow refer to bounds of P in GIMPLE. Optimizations may modify >>>>>>>> __builtin_arg_bnd (P) replacing P with its copy or some value. It >>>>>>>> makes call useless because removes information about parameter whose >>>>>>>> bounds we refer to. I want such optimization to ignore >>>>>>>> __builtin_arg_bnd calls and always leave default SSA_NAME of PARM_DECL >>>>>>>> there as arg. >>>>>>> >>>>>>> How does a compilable testcase look like that shows how the default def >>>>>>> is used? And what transforms break that use? I really cannot see >>>>>>> how this would happen (and you didn't add a testcase). >>>>>> >>>>>> Here is a test source: >>>>>> >>>>>> extern int bar1 (int *p); >>>>>> extern int bar2 (int); >>>>>> >>>>>> int foo (int *p) >>>>>> { >>>>>> if (!p) >>>>>> return bar1 (p); >>>>>> return bar2 (10); >>>>>> } >>>>>> >>>>>> After instrumentation GIMPLE looks like: >>>>>> >>>>>> foo (int * p) >>>>>> { >>>>>> <unnamed type> __bound_tmp.0; >>>>>> int _1; >>>>>> int _6; >>>>>> int _8; >>>>>> >>>>>> <bb 6>: >>>>>> __bound_tmp.0_9 = __builtin_ia32_arg_bnd (p_3(D)); >>>>>> >>>>>> <bb 2>: >>>>>> if (p_3(D) == 0B) >>>>>> goto <bb 3>; >>>>>> else >>>>>> goto <bb 4>; >>>>>> >>>>>> <bb 3>: >>>>>> _6 = bar1 (p_3(D), __bound_tmp.0_9); >>>>>> goto <bb 5>; >>>>>> >>>>>> <bb 4>: >>>>>> _8 = bar2 (10); >>>>>> >>>>>> <bb 5>: >>>>>> # _1 = PHI <_6(3), _8(4)> >>>>>> return _1; >>>>>> >>>>>> } >>>>>> >>>>>> Here is optimized GIMPLE (if I do not apply my changes in >>>>>> tree-ssa-dom.c): >>>>>> >>>>>> foo (int * p) >>>>>> { >>>>>> <unnamed type> __bound_tmp.0; >>>>>> int _1; >>>>>> int _6; >>>>>> int _8; >>>>>> >>>>>> <bb 2>: >>>>>> if (p_3(D) == 0B) >>>>>> goto <bb 3>; >>>>>> else >>>>>> goto <bb 4>; >>>>>> >>>>>> <bb 3>: >>>>>> __bound_tmp.0_9 = __builtin_ia32_arg_bnd (0B); [return slot >>>>>> optimization] >>>>>> _6 = bar1 (0B, __bound_tmp.0_9); [tail call] >>>>>> goto <bb 5>; >>>>>> >>>>>> <bb 4>: >>>>>> _8 = bar2 (10); [tail call] >>>>>> >>>>>> <bb 5>: >>>>>> # _1 = PHI <_6(3), _8(4)> >>>>>> return _1; >>>>>> >>>>>> } >>>>>> >>>>>> Now during expand or inline of foo I cannot determine the value for >>>>>> __bound_tmp.0_9. >>>>> >>>>> Well, but clearly you can see that bounds for p == NULL are >>>>> useless and thus there is no problem with the transform. >>>> >>>> This example just demonstrates the issue. I may use some var's address >>>> in comparison with the similar result. And value does not always allow >>>> to determine bounds, because pointers with the same value may have >>>> different bounds. >>> >>> Some vars address can be used for better bounds deriving though. >>> Well, it clearly shows it's a "get me good results" issue and not >>> a correctness issue. And for "good results" you trade in missed >>> general optimizations. That doesn't sound very good to me. >> >> That is definitely a correctness issue. > > Then please add a runtime testcase that fails before and passes after > your patch. > >> Compiler cannot assume bounds >> by pointer value ignoring bounds passed to the function. > > But it can certainly drop bounds to "unknown"? You certainly cannot > rely on no such transform taking place. Maybe this just shows that > your "refering to the parameter" is done wrong and shouldn't have > used the SSA name default def. What do you do for parameters > that have their address taken btw? You'll get > > foo (void *p) > { > p_2 = *p; > __builtin_ia32_arg_bnd (p_2); > > which isn't desired?
In this case you just make a load and bounds for p_2 are obtained using bndldx call. I would be glad to use better way to refer to the argument but I do not see one. > > Hmm, unfortunately on x86_64 I get > > ./cc1 -quiet t.c -fcheck-pointer-bounds > t.c:1:0: error: -fcheck-pointers is not supported for this target > extern int bar1 (int *p); > ^ > > trying a simple testcase. Grepping shows me no target supports > chkp_bound_mode ..? What's this stuff in our tree that has no way > of testing it ... :/ You should pass -mmpx to enable it on the target. Current version in the mpx tree should build most of tests correctly but it is not updated to the current state. Ilya > > Richard. > >> SSA_NAME_OCCURS_IN_ABNORMAL_PHI usage results in missed optimizations. >> My original patch does not. >> >> Ilya >> >>> >>> Richard. >>> >>>>> >>>>> Also sth weird is going on as your arg_bnd call gets [return slot >>>>> optimization]. >>>>> It seems that your POINTER_BOUNDS_TYPE is seen as aggregate somehow. >>>> >>>> Target is responsible for having return slot optimization here. And >>>> target expands all such calls. So, do not see the problem here. >>>> >>>> Ilya >>>> >>>>> >>>>> Richard. >>>>> >>>>>> Ilya >>>>>>> >>>>>>> Richard. >>>>>>>