[LLVMdev] optimization assumes malloc return is non-null

Chris Lattner sabre at nondot.org
Fri May 2 17:43:21 PDT 2008


On Fri, 2 May 2008, Sandro Magi wrote:
> I was just saying this translation seems safe for word-sized or
> smaller objects, since those could end up being allocated to registers
> and such. My confusion is over larger object sizes. At what point
> would the translation not be done, or would it always be done, even
> when an object exceeds the addressable size on the target machine?
>
> On a real machine, calling malloc with a large value will cause a real
> program to fail. This translation would seem to make potentially
> failing programs succeed. Seems counter-intuitive to me, but as I
> said, perhaps I just need to read up on this "as-if" rule.

In practice, calling malloc of any size could fail.  We do this up to 2K 
allocations, on the idea that we don't want to bloat global data in the 
case when the code is not actually reachable.  This transformation is safe 
because the compiler can assume the malloc is successful.

-Chris


> Sandro
>
> On Fri, May 2, 2008 at 1:55 PM, Sandro Magi <naasking at gmail.com> wrote:
>>
>> On Thu, May 1, 2008 at 6:54 PM, Chris Lattner <sabre at nondot.org> wrote:
>> >
>> > > I don't see how this could be true in general, without either
>> > > knowledge of the malloc implementation, which would be fine, or
>> > > presuming knowledge of the target, which would not be fine. If
>> > > "malloc(sizeof(int))" were changed to "malloc(3245677423)", would it
>> > > still be eliminated?
>> >
>> >  Would it cause your head to explode if you knew that llvm optimizes this:
>> >
>> >  static char* G;
>> >  void foo() {
>> >    G = malloc(sizeof(char));
>> >  }
>> >  char get() { return *G; }
>> >  void set(char x) { *G = x; }
>> >
>> >  into this (note the lack of malloc):
>> >
>> >  @G.body = internal global i8 undef              ; <i8*> [#uses=2]
>> >  define i8 @get() signext nounwind  {
>> >  entry:
>> >         %tmp2 = load i8* @G.body, align 1               ; <i8> [#uses=1]
>> >         ret i8 %tmp2
>> >  }
>> >  define void @set(i8 signext  %x) nounwind  {
>> >  entry:
>> >         store i8 %x, i8* @G.body, align 1
>> >         ret void
>> >  }
>> >  define void @foo() nounwind  {
>> >  entry:
>> >         ret void
>> >  }
>> >
>> >  ?
>> >
>> >  This is safe even without "whole program" information.  I love the as-if
>> >  rule ;-)
>>
>>  No, that seems perfectly reasonable (assuming I understand the
>>  translation), but only because char is so small. This optimization
>>  seems reasonable when the object is of word size or smaller, as this
>>  may simply
>>
>>  Sandro
>>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list