; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -S -passes=gvn-sink < %s | FileCheck %s ; Make sure we do not sink lifetime markers if this would introduce a ; lifetime with non-alloca operand. define void @test_cant_sink(i1 %c) { ; CHECK-LABEL: define void @test_cant_sink( ; CHECK-SAME: i1 [[C:%.*]]) { ; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1 ; CHECK-NEXT: [[B:%.*]] = alloca i8, align 1 ; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A]]) ; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[B]]) ; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[ELSE:.*]] ; CHECK: [[IF]]: ; CHECK-NEXT: store i64 1, ptr [[A]], align 4 ; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A]]) ; CHECK-NEXT: br label %[[JOIN:.*]] ; CHECK: [[ELSE]]: ; CHECK-NEXT: store i64 1, ptr [[B]], align 4 ; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[B]]) ; CHECK-NEXT: br label %[[JOIN]] ; CHECK: [[JOIN]]: ; CHECK-NEXT: ret void ; %a = alloca i8 %b = alloca i8 call void @llvm.lifetime.start(ptr %a) call void @llvm.lifetime.start(ptr %b) br i1 %c, label %if, label %else if: store i64 1, ptr %a call void @llvm.lifetime.end(ptr %a) br label %join else: store i64 1, ptr %b call void @llvm.lifetime.end(ptr %b) br label %join join: ret void } define void @test_can_sink(i1 %c) { ; CHECK-LABEL: define void @test_can_sink( ; CHECK-SAME: i1 [[C:%.*]]) { ; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1 ; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A]]) ; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[ELSE:.*]] ; CHECK: [[IF]]: ; CHECK-NEXT: br label %[[JOIN:.*]] ; CHECK: [[ELSE]]: ; CHECK-NEXT: br label %[[JOIN]] ; CHECK: [[JOIN]]: ; CHECK-NEXT: store i64 1, ptr [[A]], align 4 ; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A]]) ; CHECK-NEXT: ret void ; %a = alloca i8 call void @llvm.lifetime.start(ptr %a) br i1 %c, label %if, label %else if: store i64 1, ptr %a call void @llvm.lifetime.end(ptr %a) br label %join else: store i64 1, ptr %a call void @llvm.lifetime.end(ptr %a) br label %join join: ret void }