@@ -456,4 +456,49 @@ define i32 @provenance_only_capture() {
456456 ret i32 %l1
457457}
458458
459+ define i32 @simple_with_lifetimes () {
460+ ; CHECK-LABEL: @simple_with_lifetimes(
461+ ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
462+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[A]])
463+ ; CHECK-NEXT: store i32 0, ptr [[A]], align 4
464+ ; CHECK-NEXT: call void @callee(ptr [[A]])
465+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[A]])
466+ ; CHECK-NEXT: ret i32 0
467+ ;
468+ %a = alloca i32
469+ call void @llvm.lifetime.start (i64 4 , ptr %a )
470+ store i32 0 , ptr %a
471+ call void @callee (ptr %a )
472+ %l1 = load i32 , ptr %a
473+ call void @llvm.lifetime.end (i64 4 , ptr %a )
474+ ret i32 %l1
475+ }
476+
477+ define i32 @twoalloc_with_lifetimes () {
478+ ; CHECK-LABEL: @twoalloc_with_lifetimes(
479+ ; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
480+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[A]])
481+ ; CHECK-NEXT: store i32 0, ptr [[A]], align 4
482+ ; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
483+ ; CHECK-NEXT: store i32 1, ptr [[B]], align 4
484+ ; CHECK-NEXT: call void @callee(ptr [[A]])
485+ ; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
486+ ; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
487+ ; CHECK-NEXT: [[R:%.*]] = add i32 [[L1]], [[L2]]
488+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[A]])
489+ ; CHECK-NEXT: ret i32 [[R]]
490+ ;
491+ %a = alloca {i32 , i32 }
492+ call void @llvm.lifetime.start (i64 8 , ptr %a )
493+ store i32 0 , ptr %a
494+ %b = getelementptr i32 , ptr %a , i32 1
495+ store i32 1 , ptr %b
496+ call void @callee (ptr %a )
497+ %l1 = load i32 , ptr %a
498+ %l2 = load i32 , ptr %b
499+ %r = add i32 %l1 , %l2
500+ call void @llvm.lifetime.end (i64 8 , ptr %a )
501+ ret i32 %r
502+ }
503+
459504declare void @llvm.memcpy.p0.p0.i64 (ptr , ptr , i64 , i1 )
0 commit comments