xref: /llvm-project/llvm/test/Transforms/SROA/lifetime-intrinsic.ll (revision 4f7e5d22060e8a89237ffb93c3e7be6e92fee8fe)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes='sroa<preserve-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-PRESERVE-CFG
3; RUN: opt < %s -passes='sroa<modify-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-MODIFY-CFG
4
5%i32x2 = type { [2 x i32] }
6
7; Note %arr is the union
8; union {
9;   int i[2];
10;   short s[4];
11; };
12
13define i16 @with_lifetime(i32 %a, i32 %b) #0 {
14; CHECK-LABEL: @with_lifetime(
15; CHECK-NEXT:    [[ARR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[A:%.*]] to i16
16; CHECK-NEXT:    [[ARR_SROA_4_4_EXTRACT_TRUNC:%.*]] = trunc i32 [[B:%.*]] to i16
17; CHECK-NEXT:    [[RET:%.*]] = add i16 [[ARR_SROA_0_0_EXTRACT_TRUNC]], [[ARR_SROA_4_4_EXTRACT_TRUNC]]
18; CHECK-NEXT:    ret i16 [[RET]]
19;
20  %arr = alloca %i32x2, align 4
21  call void @llvm.lifetime.start.p0(i64 8, ptr %arr)
22  %p1 = getelementptr inbounds %i32x2, ptr %arr, i64 0, i32 0, i32 1
23  store i32 %a, ptr %arr, align 4
24  store i32 %b, ptr %p1, align 4
25  %s0 = load i16, ptr %arr, align 4
26  %s2 = load i16, ptr %p1, align 4
27  %ret = add i16 %s0, %s2
28  call void @llvm.lifetime.end.p0(i64 8, ptr %arr)
29  ret i16 %ret
30}
31
32define i16 @no_lifetime(i32 %a, i32 %b) #0 {
33; CHECK-LABEL: @no_lifetime(
34; CHECK-NEXT:    [[ARR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[A:%.*]] to i16
35; CHECK-NEXT:    [[ARR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[A]], 16
36; CHECK-NEXT:    [[ARR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[ARR_SROA_2_0_EXTRACT_SHIFT]] to i16
37; CHECK-NEXT:    [[ARR_SROA_21_4_EXTRACT_TRUNC:%.*]] = trunc i32 [[B:%.*]] to i16
38; CHECK-NEXT:    [[ARR_SROA_4_4_EXTRACT_SHIFT:%.*]] = lshr i32 [[B]], 16
39; CHECK-NEXT:    [[ARR_SROA_4_4_EXTRACT_TRUNC:%.*]] = trunc i32 [[ARR_SROA_4_4_EXTRACT_SHIFT]] to i16
40; CHECK-NEXT:    [[RET:%.*]] = add i16 [[ARR_SROA_0_0_EXTRACT_TRUNC]], [[ARR_SROA_21_4_EXTRACT_TRUNC]]
41; CHECK-NEXT:    ret i16 [[RET]]
42;
43  %arr = alloca %i32x2, align 4
44  %p1 = getelementptr inbounds %i32x2, ptr %arr, i64 0, i32 0, i32 1
45  store i32 %a, ptr %arr, align 4
46  store i32 %b, ptr %p1, align 4
47  %s0 = load i16, ptr %arr, align 4
48  %s2 = load i16, ptr %p1, align 4
49  %ret = add i16 %s0, %s2
50  ret i16 %ret
51}
52
53declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1
54
55declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1
56
57attributes #0 = { alwaysinline nounwind }
58attributes #1 = { argmemonly nounwind }
59;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
60; CHECK-MODIFY-CFG: {{.*}}
61; CHECK-PRESERVE-CFG: {{.*}}
62