blob: a6a89fbf54f97de42460de895a79f0c60050dfe2 [file] [edit]
; 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
}