On Thu, May 1, 2008 at 5:10 PM, Daniel Berlin <[EMAIL PROTECTED]> wrote:
> >  Sure, a malloc call has side-effects, so a DCE pass cannot just remove it.
>  >  Only struct-reorg knows that it has replaced all side-effects with others.
>
>  Malloc only has side effects if the result is used.
>
>
>  For example, LLVM will transform
>
>
>  int main(int argc, char** argv){
>   if(malloc(sizeof(int)) == NULL){ return 0; }
>   else{ return 1; }
>  }
>
>  into return 1
>
>  There is a thread going on in the llvm mailing lists about this right
>  now, and so far all the text people can find in standards says this is
>  okay (though I think susv2/POSIX says differently).
>
>  Chris says:
>  "
>  LLVM should not (and does not, afaik) assume the malloc succeeds in
>  general.
>
>  If LLVM is able to eliminate all users of the malloc assuming the
>  malloc succeeded (as in this case), then it is safe to assume the malloc
>  returned success."


BTW, the argument goes something like this:

Transforming malloc into:

our_malloc(int size)
{

if (callsite == the one being compared against null)
{
static char buf[size] __attribute__(maximally_aligned)
return (void *)buf;
}
else
return malloc(size)
}

is legal, and would produce a result that is always non-null.
Thus, if you can eliminate all users of your malloc under the
assumption that malloc returns non-null, you can do so and delete the
malloc.

This also means that things like if (malloc(x) == 0x12345678) <do
something> would *not* be transformed into "if (1)", only those cases
where the behavior of malloc is checked for nullness.

Reply via email to