[llvm] r179071 - c++ new operators are not malloc-like functions because they do not return uninitialized memory.

Evan Cheng evan.cheng at apple.com
Tue Apr 9 08:48:39 PDT 2013


How do other compilers handle this? Requiring -fno-builtins doesn't seem user friendly.

Evan

Sent from my iPad

On Apr 8, 2013, at 8:45 PM, Nick Lewycky <nicholas at mxc.ca> wrote:

> On 04/08/2013 04:40 PM, Nadav Rotem wrote:
>> Author: nadav
>> Date: Mon Apr  8 18:40:47 2013
>> New Revision: 179071
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=179071&view=rev
>> Log:
>> c++ new operators are not malloc-like functions because they do not return uninitialized memory.
>> Users may overide new-operators and implement any function that they like.
> 
> Please revert. Technically true, but this was discussed in advance: if people want non-standard new/new[] then they need to specify -fno-builtin just as they need for non-standard malloc (even though replacing new/new[] is part of the language spec and replacing malloc isn't (well, except that it also is but you have to replace the rest of the standard library with it.))
> 
> Nick
> 
>> Added:
>>     llvm/trunk/test/Transforms/GVN/newoperator.ll
>> Modified:
>>     llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
>>     llvm/trunk/test/Transforms/InstCombine/invoke.ll
>>     llvm/trunk/test/Transforms/InstCombine/objsize-64.ll
>> 
>> Modified: llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryBuiltins.cpp?rev=179071&r1=179070&r2=179071&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/MemoryBuiltins.cpp (original)
>> +++ llvm/trunk/lib/Analysis/MemoryBuiltins.cpp Mon Apr  8 18:40:47 2013
>> @@ -52,14 +52,6 @@ struct AllocFnsTy {
>>  static const AllocFnsTy AllocationFnData[] = {
>>    {LibFunc::malloc,              MallocLike,  1, 0,  -1},
>>    {LibFunc::valloc,              MallocLike,  1, 0,  -1},
>> -  {LibFunc::Znwj,                MallocLike,  1, 0,  -1}, // new(unsigned int)
>> -  {LibFunc::ZnwjRKSt9nothrow_t,  MallocLike,  2, 0,  -1}, // new(unsigned int, nothrow)
>> -  {LibFunc::Znwm,                MallocLike,  1, 0,  -1}, // new(unsigned long)
>> -  {LibFunc::ZnwmRKSt9nothrow_t,  MallocLike,  2, 0,  -1}, // new(unsigned long, nothrow)
>> -  {LibFunc::Znaj,                MallocLike,  1, 0,  -1}, // new[](unsigned int)
>> -  {LibFunc::ZnajRKSt9nothrow_t,  MallocLike,  2, 0,  -1}, // new[](unsigned int, nothrow)
>> -  {LibFunc::Znam,                MallocLike,  1, 0,  -1}, // new[](unsigned long)
>> -  {LibFunc::ZnamRKSt9nothrow_t,  MallocLike,  2, 0,  -1}, // new[](unsigned long, nothrow)
>>    {LibFunc::posix_memalign,      MallocLike,  3, 2,  -1},
>>    {LibFunc::calloc,              CallocLike,  2, 0,   1},
>>    {LibFunc::realloc,             ReallocLike, 2, 1,  -1},
>> 
>> Added: llvm/trunk/test/Transforms/GVN/newoperator.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/newoperator.ll?rev=179071&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/GVN/newoperator.ll (added)
>> +++ llvm/trunk/test/Transforms/GVN/newoperator.ll Mon Apr  8 18:40:47 2013
>> @@ -0,0 +1,20 @@
>> +; RUN: opt<  %s -basicaa -gvn -S | FileCheck %s
>> +
>> +; We can't remove the load because new operators are overideable and can return non-undefined memory.
>> +;CHECK: main
>> +;CHECK: load
>> +;CHECK: ret
>> +define i32 @main(i32 %argc, i8** nocapture %argv) ssp uwtable {
>> +  %1 = tail call noalias i8* @_Znam(i64 800)
>> +  %2 = bitcast i8* %1 to i32**
>> +  %3 = load i32** %2, align 8, !tbaa !0
>> +  %4 = icmp eq i32* %3, null
>> +  %5 = zext i1 %4 to i32
>> +  ret i32 %5
>> +}
>> +
>> +declare noalias i8* @_Znam(i64)
>> +
>> +!0 = metadata !{metadata !"any pointer", metadata !1}
>> +!1 = metadata !{metadata !"omnipotent char", metadata !2}
>> +!2 = metadata !{metadata !"Simple C/C++ TBAA"}
>> 
>> Modified: llvm/trunk/test/Transforms/InstCombine/invoke.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/invoke.ll?rev=179071&r1=179070&r2=179071&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/InstCombine/invoke.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/invoke.ll Mon Apr  8 18:40:47 2013
>> @@ -47,19 +47,3 @@ lpad:
>>    unreachable
>>  }
>> 
>> -; CHECK: @f3
>> -define void @f3() nounwind uwtable ssp {
>> -; CHECK: invoke void @llvm.donothing()
>> -  %call = invoke noalias i8* @_Znwm(i64 13)
>> -          to label %invoke.cont unwind label %lpad
>> -
>> -invoke.cont:
>> -  ret void
>> -
>> -lpad:
>> -  %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
>> -          filter [0 x i8*] zeroinitializer
>> -  %2 = extractvalue { i8*, i32 } %1, 0
>> -  tail call void @__cxa_call_unexpected(i8* %2) noreturn nounwind
>> -  unreachable
>> -}
>> 
>> Modified: llvm/trunk/test/Transforms/InstCombine/objsize-64.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/objsize-64.ll?rev=179071&r1=179070&r2=179071&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/InstCombine/objsize-64.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/objsize-64.ll Mon Apr  8 18:40:47 2013
>> @@ -25,7 +25,7 @@ entry:
>>            to label %invoke.cont unwind label %lpad
>> 
>>  invoke.cont:
>> -; CHECK: ret i64 13
>> +; CHECK: ret i64 %0
>>    store i8* %call, i8** %esc
>>    %0 = tail call i64 @llvm.objectsize.i64(i8* %call, i1 false)
>>    ret i64 %0
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list