From: Benjamin Kramer Date: Tue, 24 Sep 2013 17:34:29 +0000 (+0000) Subject: MemoryBuiltins: Reinstate optimizing (uninitialized) loads from operator new. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d44f9f2ff88cd03e3f944ecdd6373737d5acdb90;p=oota-llvm.git MemoryBuiltins: Reinstate optimizing (uninitialized) loads from operator new. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191315 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/MemoryBuiltins.cpp b/lib/Analysis/MemoryBuiltins.cpp index b904cb188c4..0db603b8743 100644 --- a/lib/Analysis/MemoryBuiltins.cpp +++ b/lib/Analysis/MemoryBuiltins.cpp @@ -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. diff --git a/test/Transforms/GVN/malloc-load-removal.ll b/test/Transforms/GVN/malloc-load-removal.ll index e93a62a6c78..d2d2fd77afe 100644 --- a/test/Transforms/GVN/malloc-load-removal.ll +++ b/test/Transforms/GVN/malloc-load-removal.ll @@ -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 }