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