From 64fcf3b1a6a75e6cc1438589dbd8594c5c799b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Sun, 23 Aug 2015 14:38:42 +0200 Subject: [PATCH] Omit lifetime intrinsics for zero-sized types These aren't super common, but happen for e.g. closures that have an empty environment, and for for-loops that return (). --- src/librustc_trans/trans/base.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index 6be2bb0846463..3c49b63800737 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -917,10 +917,14 @@ pub fn call_lifetime_start(cx: Block, ptr: ValueRef) { let _icx = push_ctxt("lifetime_start"); let ccx = cx.ccx(); - let llsize = C_u64(ccx, machine::llsize_of_alloc(ccx, val_ty(ptr).element_type())); + let size = machine::llsize_of_alloc(ccx, val_ty(ptr).element_type()); + if size == 0 { + return; + } + let ptr = PointerCast(cx, ptr, Type::i8p(ccx)); let lifetime_start = ccx.get_intrinsic(&"llvm.lifetime.start"); - Call(cx, lifetime_start, &[llsize, ptr], None, DebugLoc::None); + Call(cx, lifetime_start, &[C_u64(ccx, size), ptr], None, DebugLoc::None); } pub fn call_lifetime_end(cx: Block, ptr: ValueRef) { @@ -931,10 +935,14 @@ pub fn call_lifetime_end(cx: Block, ptr: ValueRef) { let _icx = push_ctxt("lifetime_end"); let ccx = cx.ccx(); - let llsize = C_u64(ccx, machine::llsize_of_alloc(ccx, val_ty(ptr).element_type())); + let size = machine::llsize_of_alloc(ccx, val_ty(ptr).element_type()); + if size == 0 { + return; + } + let ptr = PointerCast(cx, ptr, Type::i8p(ccx)); let lifetime_end = ccx.get_intrinsic(&"llvm.lifetime.end"); - Call(cx, lifetime_end, &[llsize, ptr], None, DebugLoc::None); + Call(cx, lifetime_end, &[C_u64(ccx, size), ptr], None, DebugLoc::None); } pub fn call_memcpy(cx: Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef, align: u32) {