[llvm] r179071 - c++ new operators are not malloc-like functions because they do not return uninitialized memory.
Nadav Rotem
nrotem at apple.com
Mon Apr 8 16:40:47 PDT 2013
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.
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
More information about the llvm-commits
mailing list