; 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
}
