blob: 81e05c70588f647189e565ccbbd7837e66f4b101 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=jump-threading -S %s | FileCheck %s
; Test that JumpThreading does not create a PHI node for an alloca that is
; used by a lifetime intrinsic, which would violate the requirement that
; lifetime markers only operate on allocas.
define void @widget_dropped(i1 %arg) {
; CHECK-LABEL: @widget_dropped(
; CHECK-NEXT: bb:
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB3:%.*]], label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [4 x [4 x i32]], align 8
; CHECK-NEXT: br label [[BB4:%.*]]
; CHECK: bb3:
; CHECK-NEXT: call void @dummy()
; CHECK-NEXT: [[ALLOCA1:%.*]] = alloca [4 x [4 x i32]], align 8
; CHECK-NEXT: br label [[BB4]]
; CHECK: bb4:
; CHECK-NEXT: [[ALLOCA2:%.*]] = phi ptr [ [[ALLOCA1]], [[BB3]] ], [ [[ALLOCA]], [[BB2]] ]
; CHECK-NEXT: ret void
;
bb:
br i1 %arg, label %bb1, label %bb2
bb1:
call void @dummy()
br label %bb2
bb2:
%alloca = alloca [4 x [4 x i32]], align 8
br i1 %arg, label %bb3, label %bb4
bb3:
br label %bb4
bb4:
call void @llvm.lifetime.start.p0(ptr %alloca)
call void @llvm.lifetime.end.p0(ptr %alloca)
ret void
}
; Because the alloca is in the entry block, it dominates all threaded blocks.
; No PHI node is required, and the lifetime markers can be safely preserved.
define void @widget_preserved(i1 %arg) {
; CHECK-LABEL: @widget_preserved(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [4 x [4 x i32]], align 8
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]
; CHECK: bb3:
; CHECK-NEXT: call void @dummy()
; CHECK-NEXT: br label [[BB4]]
; CHECK: bb4:
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[ALLOCA]])
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[ALLOCA]])
; CHECK-NEXT: ret void
;
bb:
%alloca = alloca [4 x [4 x i32]], align 8
br i1 %arg, label %bb1, label %bb2
bb1:
call void @dummy()
br label %bb2
bb2:
br i1 %arg, label %bb3, label %bb4
bb3:
br label %bb4
bb4:
call void @llvm.lifetime.start.p0(ptr %alloca)
call void @llvm.lifetime.end.p0(ptr %alloca)
ret void
}
declare void @dummy()
attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }