|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -S -passes=newgvn < %s | FileCheck %s |
| 3 | + |
| 4 | + |
| 5 | +; FIXME: MemorySSA says that load1 depends on the lifetime start. |
| 6 | +; That's OK since MemorySSA is may-alias; however, NewGVN should |
| 7 | +; check whether the lifetime start *actually* defines the loaded pointer |
| 8 | +; before simplifying to uninitialized memory. |
| 9 | +define void @foo(ptr %arg) { |
| 10 | +; CHECK-LABEL: define void @foo( |
| 11 | +; CHECK-SAME: ptr [[ARG:%.*]]) { |
| 12 | +; CHECK-NEXT: [[BB:.*:]] |
| 13 | +; CHECK-NEXT: [[ALLOCA:%.*]] = alloca i8, align 16 |
| 14 | +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr [[ALLOCA]]) |
| 15 | +; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8 |
| 16 | +; CHECK-NEXT: [[CALL:%.*]] = call ptr undef(ptr [[ALLOCA]]) |
| 17 | +; CHECK-NEXT: ret void |
| 18 | +; |
| 19 | +bb: |
| 20 | + %alloca = alloca i8, align 16 |
| 21 | + call void @llvm.lifetime.start.p0(i64 1, ptr %alloca) |
| 22 | + %load = load ptr, ptr %arg, align 8 |
| 23 | + %load1 = load ptr, ptr %load, align 8 |
| 24 | + %call = call ptr %load1(ptr %alloca) |
| 25 | + ret void |
| 26 | +} |
| 27 | + |
| 28 | +declare void @llvm.lifetime.start.p0(i64 immarg, ptr captures(none)) #0 |
| 29 | + |
| 30 | +declare ptr @malloc(i64) |
| 31 | + |
| 32 | +; This case is handled correctly. |
| 33 | +; Since malloc returns a pointer, NewGVN checks whether |
| 34 | +; it is the same pointer, an equivalent one, or a must-alias. |
| 35 | +define void @wombat(ptr %arg) { |
| 36 | +; CHECK-LABEL: define void @wombat( |
| 37 | +; CHECK-SAME: ptr [[ARG:%.*]]) { |
| 38 | +; CHECK-NEXT: [[BB:.*:]] |
| 39 | +; CHECK-NEXT: [[CALL:%.*]] = call ptr @malloc(i64 1) |
| 40 | +; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8 |
| 41 | +; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[LOAD]], align 8 |
| 42 | +; CHECK-NEXT: [[CALL2:%.*]] = call ptr [[LOAD1]](ptr [[CALL]]) |
| 43 | +; CHECK-NEXT: ret void |
| 44 | +; |
| 45 | +bb: |
| 46 | + %call = call ptr @malloc(i64 1) |
| 47 | + %load = load ptr, ptr %arg, align 8 |
| 48 | + %load1 = load ptr, ptr %load, align 8 |
| 49 | + %call2 = call ptr %load1(ptr %call) |
| 50 | + ret void |
| 51 | +} |
| 52 | + |
| 53 | +attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } |
0 commit comments