| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -passes='logical-sroa' -S | FileCheck %s --check-prefixes=CHECK | |
| ; This case is not optimized for now, but we should (see #193749). | |
| define i32 @test_partial_use_phi_node(i1 %cond) { | |
| ; CHECK-LABEL: define i32 @test_partial_use_phi_node( | |
| ; CHECK-SAME: i1 [[COND:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[TMP1:%.*]] = call elementtype({ i32, i32 }) ptr @llvm.structured.alloca.p0() | |
| ; CHECK-NEXT: [[TMP0:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) [[TMP1]], i32 0) | |
| ; CHECK-NEXT: [[PTR1:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) [[TMP1]], i32 1) | |
| ; CHECK-NEXT: br i1 [[COND]], label %[[L1:.*]], label %[[L2:.*]] | |
| ; CHECK: [[L1]]: | |
| ; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]]) | |
| ; CHECK-NEXT: store i32 0, ptr [[TMP0]], align 4 | |
| ; CHECK-NEXT: br label %[[L3:.*]] | |
| ; CHECK: [[L2]]: | |
| ; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]]) | |
| ; CHECK-NEXT: store i32 1, ptr [[PTR1]], align 4 | |
| ; CHECK-NEXT: br label %[[L3]] | |
| ; CHECK: [[L3]]: | |
| ; CHECK-NEXT: [[PTR:%.*]] = phi ptr [ [[TMP0]], %[[L1]] ], [ [[PTR1]], %[[L2]] ] | |
| ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP1]]) | |
| ; CHECK-NEXT: br label %[[EXIT:.*]] | |
| ; CHECK: [[EXIT]]: | |
| ; CHECK-NEXT: ret i32 [[A]] | |
| ; | |
| entry: | |
| %tmp = call elementtype({ i32, i32 }) ptr @llvm.structured.alloca.p0() | |
| %ptr0 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) %tmp, i32 0) | |
| %ptr1 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) %tmp, i32 1) | |
| br i1 %cond, label %l1, label %l2 | |
| l1: | |
| call void @llvm.lifetime.start.p0(ptr %tmp) | |
| store i32 0, ptr %ptr0 | |
| br label %l3 | |
| l2: | |
| call void @llvm.lifetime.start.p0(ptr %tmp) | |
| store i32 1, ptr %ptr1 | |
| br label %l3 | |
| l3: | |
| %ptr = phi ptr [ %ptr0, %l1 ], [ %ptr1, %l2 ] | |
| %a = load i32, ptr %ptr | |
| call void @llvm.lifetime.end.p0(ptr %tmp) | |
| br label %exit | |
| exit: | |
| ret i32 %a | |
| } | |