c++ new operators are not malloc-like functions because they do not return uninitiali...
authorNadav Rotem <nrotem@apple.com>
Mon, 8 Apr 2013 23:40:47 +0000 (23:40 +0000)
committerNadav Rotem <nrotem@apple.com>
Mon, 8 Apr 2013 23:40:47 +0000 (23:40 +0000)
Users may overide new-operators and implement any function that they like.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179071 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryBuiltins.cpp
test/Transforms/GVN/newoperator.ll [new file with mode: 0644]
test/Transforms/InstCombine/invoke.ll
test/Transforms/InstCombine/objsize-64.ll

index d490d5419f75e802eb62689cbacbd7e4ccbce298..0bf0b47879525150ff808bb80b96629385bc3ba0 100644 (file)
@@ -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},
diff --git a/test/Transforms/GVN/newoperator.ll b/test/Transforms/GVN/newoperator.ll
new file mode 100644 (file)
index 0000000..21cfc1d
--- /dev/null
@@ -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"}
index 04eaf86a287b09eb085b8c3d21c847edb35d9aaf..4ef86ddb4d0a5a7433c2dc9055a99d126c9ea4f8 100644 (file)
@@ -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
-}
index 530e1234b4a6019714d9ebb8ea138535acef9439..6ecc830440853e5c1c32aa597c6c1921b084b005 100644 (file)
@@ -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