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. 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. >>>>