MemoryBuiltins: Reinstate optimizing (uninitialized) loads from operator new.

llvm-svn: 191315
This commit is contained in:
Benjamin Kramer 2013-09-24 17:34:29 +00:00
parent edf2d9179e
commit 2939dd3d11
2 changed files with 35 additions and 10 deletions

View File

@ -31,12 +31,12 @@
using namespace llvm;
enum AllocType {
MallocLike = 1<<0, // allocates
CallocLike = 1<<1, // allocates + bzero
ReallocLike = 1<<2, // reallocates
StrDupLike = 1<<3,
OpNewLike = 1<<4, // allocates; never returns null
AllocLike = MallocLike | CallocLike | StrDupLike | OpNewLike,
OpNewLike = 1<<0, // allocates; never returns null
MallocLike = 1<<1 | OpNewLike, // allocates; may return null
CallocLike = 1<<2, // allocates + bzero
ReallocLike = 1<<3, // reallocates
StrDupLike = 1<<4,
AllocLike = MallocLike | CallocLike | StrDupLike,
AnyAlloc = AllocLike | ReallocLike
};
@ -118,7 +118,7 @@ static const AllocFnsTy *getAllocationData(const Value *V, AllocType AllocTy,
return 0;
const AllocFnsTy *FnData = &AllocationFnData[i];
if ((FnData->AllocTy & AllocTy) == 0)
if ((FnData->AllocTy & AllocTy) != FnData->AllocTy)
return 0;
// Check function prototype.

View File

@ -7,7 +7,7 @@ target triple = "x86_64-apple-macosx10.8.0"
declare i8* @malloc(i64) nounwind
define noalias i8* @test() nounwind uwtable ssp {
define noalias i8* @test1() nounwind uwtable ssp {
entry:
%call = tail call i8* @malloc(i64 100) nounwind
%0 = load i8* %call, align 1
@ -21,11 +21,36 @@ if.then: ; preds = %entry
if.end: ; preds = %if.then, %entry
ret i8* %call
; CHECK-LABEL: @test(
; CHECK-LABEL: @test1(
; CHECK-NOT: load
; CHECK-NOT: icmp
; CHECK_NO_LIBCALLS-LABEL: @test(
; CHECK_NO_LIBCALLS-LABEL: @test1(
; CHECK_NO_LIBCALLS: load
; CHECK_NO_LIBCALLS: icmp
}
declare i8* @_Znwm(i64) nounwind
define noalias i8* @test2() nounwind uwtable ssp {
entry:
%call = tail call i8* @_Znwm(i64 100) nounwind
%0 = load i8* %call, align 1
%tobool = icmp eq i8 %0, 0
br i1 %tobool, label %if.end, label %if.then
if.then: ; preds = %entry
store i8 0, i8* %call, align 1
br label %if.end
if.end: ; preds = %if.then, %entry
ret i8* %call
; CHECK-LABEL: @test2(
; CHECK-NOT: load
; CHECK-NOT: icmp
; CHECK_NO_LIBCALLS-LABEL: @test2(
; CHECK_NO_LIBCALLS: load
; CHECK_NO_LIBCALLS: icmp
}