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