On Saturday 12 November 2005 14:35, Per Bothner wrote:

> The internal SSA form might be something like:
>
> foo()
> {
>     if (test)
>       {
>         int __attribute__((never_null)) *p_1 =
> this_never_returns_NULL(); < ... use p without modifying it ... >     <--
> p_1 never NULL here. }
>     else
>      {
>        int *p_2 = other_fn ();
>        < ... use p without modifying it ... > <-- p_2 may be NULL here.
>      }
>    int *p_3 = PHI(p_1, p_2);
>     ... more uses of p ...;
> }
>
Well, I am not an FE person, so I don't much care how you convey the 
information into the optimizers.

From a user's perspective I see the obvious drawback that you've just 
forced me to edit a potentially large number of source files just to add 
the __attribute__((never_null)).  The other approach just needs a single 
__attribute__ in the function declaration.

Another problem I would have as a user is if you suddenly make 'int *' and 
'int * __attribute__((non_null))' different/incompatible types.  If I have 
a function that takes 'int *' as argument, I don't want to start adding 
tons of type casts to get around compiler warnings/errors.

From an optimizer perspective, I fail to see how would your approach give 
me better information inside VRP.  But since your approach seems to give 
me the same information, I don't much care how the FE implements this.  If 
you decide to have type attributes, I'll use it.  If you mark the 
function, I'll use it with the same effect.

Reply via email to