Skip to content

Commit

Permalink
Revert "Remove threshold for lifetime marker insertion of named tempo…
Browse files Browse the repository at this point in the history
…raries"

Revert r222993 while I investigate some MemorySanitizer failures.

llvm-svn: 222995
  • Loading branch information
Arnaud-de-Grandmaison-ARM committed Dec 1, 2014
1 parent 237cfa9 commit f3470cc
Show file tree
Hide file tree
Showing 15 changed files with 34 additions and 294 deletions.
52 changes: 26 additions & 26 deletions clang/lib/CodeGen/CGDecl.cpp
Expand Up @@ -512,7 +512,10 @@ namespace {
: Addr(addr), Size(size) {}

void Emit(CodeGenFunction &CGF, Flags flags) override {
CGF.EmitLifetimeEnd(Size, Addr);
llvm::Value *castAddr = CGF.Builder.CreateBitCast(Addr, CGF.Int8PtrTy);
CGF.Builder.CreateCall2(CGF.CGM.getLLVMLifetimeEndFn(),
Size, castAddr)
->setDoesNotThrow();
}
};
}
Expand Down Expand Up @@ -832,6 +835,21 @@ static bool shouldUseMemSetPlusStoresToInitialize(llvm::Constant *Init,
canEmitInitWithFewStoresAfterMemset(Init, StoreBudget);
}

/// Should we use the LLVM lifetime intrinsics for the given local variable?
static bool shouldUseLifetimeMarkers(CodeGenFunction &CGF, const VarDecl &D,
unsigned Size) {
// For now, only in optimized builds.
if (CGF.CGM.getCodeGenOpts().OptimizationLevel == 0)
return false;

// Limit the size of marked objects to 32 bytes. We don't want to increase
// compile time by marking tiny objects.
unsigned SizeThreshold = 32;

return Size > SizeThreshold;
}


/// EmitAutoVarDecl - Emit code and set up an entry in LocalDeclMap for a
/// variable declaration with auto, register, or no storage class specifier.
/// These turn into simple stack objects, or GlobalValues depending on target.
Expand All @@ -841,29 +859,6 @@ void CodeGenFunction::EmitAutoVarDecl(const VarDecl &D) {
EmitAutoVarCleanups(emission);
}

/// Emit a lifetime.begin marker if some criteria are satisfied.
/// \return a pointer to the temporary size Value if a marker was emitted, null
/// otherwise
llvm::Value *CodeGenFunction::EmitLifetimeStart(uint64_t Size,
llvm::Value *Addr) {
// For now, only in optimized builds.
if (CGM.getCodeGenOpts().OptimizationLevel == 0)
return nullptr;

llvm::Value *SizeV = llvm::ConstantInt::get(Int64Ty, Size);
llvm::Value *CastAddr = Builder.CreateBitCast(Addr, Int8PtrTy);
Builder.CreateCall2(CGM.getLLVMLifetimeStartFn(), SizeV, CastAddr)
->setDoesNotThrow();

return SizeV;
}

void CodeGenFunction::EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr) {
llvm::Value *CastAddr = Builder.CreateBitCast(Addr, Int8PtrTy);
Builder.CreateCall2(CGM.getLLVMLifetimeEndFn(), Size, CastAddr)
->setDoesNotThrow();
}

/// EmitAutoVarAlloca - Emit the alloca and debug information for a
/// local variable. Does not emit initialization or destruction.
CodeGenFunction::AutoVarEmission
Expand Down Expand Up @@ -959,8 +954,13 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
// Emit a lifetime intrinsic if meaningful. There's no point
// in doing this if we don't have a valid insertion point (?).
uint64_t size = CGM.getDataLayout().getTypeAllocSize(LTy);
if (HaveInsertPoint()) {
emission.SizeForLifetimeMarkers = EmitLifetimeStart(size, Alloc);
if (HaveInsertPoint() && shouldUseLifetimeMarkers(*this, D, size)) {
llvm::Value *sizeV = llvm::ConstantInt::get(Int64Ty, size);

emission.SizeForLifetimeMarkers = sizeV;
llvm::Value *castAddr = Builder.CreateBitCast(Alloc, Int8PtrTy);
Builder.CreateCall2(CGM.getLLVMLifetimeStartFn(), sizeV, castAddr)
->setDoesNotThrow();
} else {
assert(!emission.useLifetimeMarkers());
}
Expand Down
3 changes: 0 additions & 3 deletions clang/lib/CodeGen/CodeGenFunction.h
Expand Up @@ -1743,9 +1743,6 @@ class CodeGenFunction : public CodeGenTypeCache {
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType,
llvm::Value *Ptr);

llvm::Value *EmitLifetimeStart(uint64_t Size, llvm::Value *Addr);
void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr);

llvm::Value *EmitCXXNewExpr(const CXXNewExpr *E);
void EmitCXXDeleteExpr(const CXXDeleteExpr *E);

Expand Down
5 changes: 1 addition & 4 deletions clang/test/CodeGenCXX/destructors.cpp
Expand Up @@ -280,8 +280,6 @@ namespace test5 {
// CHECK5: [[ELEMS:%.*]] = alloca [5 x [[A:%.*]]], align
// CHECK5-NEXT: [[EXN:%.*]] = alloca i8*
// CHECK5-NEXT: [[SEL:%.*]] = alloca i32
// CHECK5-NEXT: [[PELEMS:%.*]] = bitcast [5 x [[A]]]* [[ELEMS]] to i8*
// CHECK5-NEXT: call void @llvm.lifetime.start(i64 5, i8* [[PELEMS]])
// CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]]* [[ELEMS]], i32 0, i32 0
// CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
// CHECK5-NEXT: br label
Expand All @@ -290,8 +288,7 @@ namespace test5 {
// CHECK5-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* [[ELT]])
// CHECK5: [[T0:%.*]] = icmp eq [[A]]* [[ELT]], [[BEGIN]]
// CHECK5-NEXT: br i1 [[T0]],
// CHECK5: call void @llvm.lifetime.end
// CHECK5-NEXT: ret void
// CHECK5: ret void
// lpad
// CHECK5: [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[ELT]]
// CHECK5-NEXT: br i1 [[EMPTY]]
Expand Down
15 changes: 2 additions & 13 deletions clang/test/CodeGenCXX/nrvo.cpp
Expand Up @@ -54,22 +54,16 @@ X test2(bool B) {
return x;

// CHECK: call {{.*}} @_ZN1XC1Ev
// CHECK-NEXT: {{.*}} getelementptr inbounds %class.X* %y, i32 0, i32 0
// CHECK-NEXT: call void @llvm.lifetime.start
// CHECK-NEXT: call {{.*}} @_ZN1XC1Ev
// CHECK: call {{.*}} @_ZN1XC1ERKS_
// CHECK: call {{.*}} @_ZN1XC1ERKS_
// CHECK: call {{.*}} @_ZN1XD1Ev
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK: call {{.*}} @_ZN1XD1Ev
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK: ret void

// The block ordering in the -fexceptions IR is unfortunate.

// CHECK-EH: call void @llvm.lifetime.start
// CHECK-EH-NEXT: call {{.*}} @_ZN1XC1Ev
// CHECK-EH: call void @llvm.lifetime.start
// CHECK-EH: call {{.*}} @_ZN1XC1Ev
// CHECK-EH-NEXT: invoke {{.*}} @_ZN1XC1Ev
// -> %invoke.cont, %lpad

Expand Down Expand Up @@ -102,9 +96,7 @@ X test2(bool B) {
// -> %invoke.cont11, %lpad

// %invoke.cont11: normal cleanup for 'x'
// CHECK-EH: call void @llvm.lifetime.end
// CHECK-EH-NEXT: call {{.*}} @_ZN1XD1Ev
// CHECK-EH-NEXT: call void @llvm.lifetime.end
// CHECK-EH: call {{.*}} @_ZN1XD1Ev
// CHECK-EH-NEXT: ret void

// %eh.cleanup: EH cleanup for 'x'
Expand Down Expand Up @@ -176,12 +168,9 @@ X test6() {
X a __attribute__((aligned(8)));
return a;
// CHECK: [[A:%.*]] = alloca [[X:%.*]], align 8
// CHECK-NEXT: [[PTR:%.*]] = getelementptr inbounds %class.X* [[A]], i32 0, i32 0
// CHECK-NEXT: call void @llvm.lifetime.start(i64 1, i8* [[PTR]])
// CHECK-NEXT: call {{.*}} @_ZN1XC1Ev([[X]]* [[A]])
// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_([[X]]* {{%.*}}, [[X]]* dereferenceable({{[0-9]+}}) [[A]])
// CHECK-NEXT: call {{.*}} @_ZN1XD1Ev([[X]]* [[A]])
// CHECK-NEXT: call void @llvm.lifetime.end(i64 1, i8* [[PTR]])
// CHECK-NEXT: ret void
}

Expand Down
20 changes: 1 addition & 19 deletions clang/test/CodeGenObjC/arc-blocks.m
Expand Up @@ -74,8 +74,6 @@ void test3(void (^sink)(id*)) {
// CHECK-NEXT: call i8* @objc_retain(
// CHECK-NEXT: bitcast i8*
// CHECK-NEXT: store void (i8**)* {{%.*}}, void (i8**)** [[SINK]]
// CHECK-NEXT: [[STRONGPTR1:%.*]] = bitcast i8** [[STRONG]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[STRONGPTR1]])
// CHECK-NEXT: store i8* null, i8** [[STRONG]]

// CHECK-NEXT: load void (i8**)** [[SINK]]
Expand All @@ -96,8 +94,6 @@ void test3(void (^sink)(id*)) {

// CHECK-NEXT: [[T0:%.*]] = load i8** [[STRONG]]
// CHECK-NEXT: call void @objc_release(i8* [[T0]])
// CHECK-NEXT: [[STRONGPTR2:%.*]] = bitcast i8** [[STRONG]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[STRONGPTR2]])

// CHECK-NEXT: load void (i8**)** [[SINK]]
// CHECK-NEXT: bitcast
Expand Down Expand Up @@ -171,8 +167,6 @@ void test5(void) {
// CHECK-LABEL: define void @test5()
// CHECK: [[VAR:%.*]] = alloca i8*
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
// CHECK-NEXT: [[VARPTR1:%.*]] = bitcast i8** [[VAR]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[VARPTR1]])
// CHECK: [[T0:%.*]] = call i8* @test5_source()
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
// CHECK-NEXT: store i8* [[T1]], i8** [[VAR]],
Expand All @@ -184,8 +178,6 @@ void test5(void) {
// CHECK-NEXT: store i8* [[T0]], i8** [[CAPTURE]]
// CHECK-NEXT: [[T0:%.*]] = bitcast [[BLOCK_T]]* [[BLOCK]] to
// CHECK: call void @test5_helper
// CHECK-NEXT: [[VARPTR2:%.*]] = bitcast i8** [[VAR]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[VARPTR2]])
// CHECK-NEXT: ret void
}

Expand All @@ -198,8 +190,6 @@ void test6(void) {
// CHECK-LABEL: define void @test6()
// CHECK: [[VAR:%.*]] = alloca [[BYREF_T:%.*]],
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
// CHECK-NEXT: [[VARPTR1:%.*]] = bitcast [[BYREF_T]]* [[VAR]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.start(i64 48, i8* [[VARPTR1]])
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 2
// 0x02000000 - has copy/dispose helpers weak
// CHECK-NEXT: store i32 1107296256, i32* [[T0]]
Expand All @@ -217,9 +207,7 @@ void test6(void) {
// CHECK: [[T0:%.*]] = bitcast [[BYREF_T]]* [[VAR]] to i8*
// CHECK-NEXT: call void @_Block_object_dispose(i8* [[T0]], i32 8)
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[SLOT]])
// CHECK-NEXT: [[VARPTR2:%.*]] = bitcast [[BYREF_T]]* [[VAR]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.end(i64 48, i8* [[VARPTR2]])
// CHECK-NEXT: ret void
// CHECK: ret void

// CHECK-LABEL: define internal void @__Block_byref_object_copy_
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
Expand Down Expand Up @@ -506,8 +494,6 @@ void test13(id x) {
// CHECK-NEXT: [[CLEANUP_ACTIVE:%.*]] = alloca i1
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_retain(i8* {{%.*}})
// CHECK-NEXT: store i8* [[T0]], i8** [[X]], align 8
// CHECK-NEXT: [[BPTR1:%.*]] = bitcast void ()** [[B]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[BPTR1]])
// CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]], align 8
// CHECK-NEXT: [[T1:%.*]] = icmp ne i8* [[T0]], null
Expand All @@ -533,8 +519,6 @@ void test13(id x) {
// CHECK-NEXT: [[T0:%.*]] = load void ()** [[B]]
// CHECK-NEXT: [[T1:%.*]] = bitcast void ()* [[T0]] to i8*
// CHECK-NEXT: call void @objc_release(i8* [[T1]])
// CHECK-NEXT: [[BPTR2:%.*]] = bitcast void ()** [[B]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[BPTR2]])

// CHECK-NEXT: [[T0:%.*]] = load i1* [[CLEANUP_ACTIVE]]
// CHECK-NEXT: br i1 [[T0]]
Expand Down Expand Up @@ -566,8 +550,6 @@ void test16() {
// CHECK-LABEL: define void @test16(
// CHECK: [[BLKVAR:%.*]] = alloca void ()*, align 8
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
// CHECK-NEXT: [[BLKVARPTR1:%.*]] = bitcast void ()** [[BLKVAR]] to i8*
// CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[BLKVARPTR1]])
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
// CHECK-NEXT: store void ()* null, void ()** [[BLKVAR]], align 8
}
Expand Down
11 changes: 1 addition & 10 deletions clang/test/CodeGenObjC/arc-bridged-cast.m
Expand Up @@ -31,8 +31,6 @@ void bridge_transfer_from_cf(int *i) {
// CHECK: store i32 17
*i = 17;
// CHECK: call void @objc_release
// CHECK-NEXT: bitcast
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK-NEXT: ret void
}

Expand All @@ -52,8 +50,6 @@ void bridge_from_cf(int *i) {
// CHECK: store i32 17
*i = 17;
// CHECK: call void @objc_release
// CHECK-NEXT: bitcast
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK-NEXT: ret void
}

Expand All @@ -71,17 +67,14 @@ void bridge_retained_of_cf(int *i) {
// CHECK: store i32 13
// CHECK: store i32 17
*i = 17;
// CHECK-NEXT: bitcast
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK-NEXT: ret void
}

// CHECK-LABEL: define void @bridge_of_cf
void bridge_of_cf(int *i) {
// CHECK: store i32 7
*i = 7;
// CHECK: call void @llvm.lifetime.start
// CHECK-NEXT: call i8* @CreateSomething()
// CHECK: call i8* @CreateSomething()
CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething();
// CHECK-NOT: retain
// CHECK: store i32 11
Expand All @@ -92,8 +85,6 @@ void bridge_of_cf(int *i) {
// CHECK-NOT: release
// CHECK: store i32 17
*i = 17;
// CHECK-NEXT: bitcast
// CHECK-NEXT: call void @llvm.lifetime.end
// CHECK-NEXT: ret void
}

4 changes: 0 additions & 4 deletions clang/test/CodeGenObjC/arc-literals.m
Expand Up @@ -27,13 +27,9 @@ void test_numeric() {
// CHECK: call i8* @objc_retainAutoreleasedReturnValue
id charlit = @'a';
// CHECK: call void @objc_release
// CHECK: call void @llvm.lifetime.end
// CHECK: call void @objc_release
// CHECK: call void @llvm.lifetime.end
// CHECK: call void @objc_release
// CHECK: call void @llvm.lifetime.end
// CHECK: call void @objc_release
// CHECK: call void @llvm.lifetime.end
// CHECK-NEXT: ret void
}

Expand Down

0 comments on commit f3470cc

Please sign in to comment.