forked from OSchip/llvm-project
MemoryBuiltins: Reinstate optimizing (uninitialized) loads from operator new.
llvm-svn: 191315
This commit is contained in:
parent
edf2d9179e
commit
2939dd3d11
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue