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