xref: /llvm-project/llvm/test/Transforms/PhaseOrdering/X86/pr61061.ll (revision a5f34155339b4c01357462da95aac62291ed7ec8)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s
3; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s
4; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s
5; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s
6
7define <2 x i64> @PR61061(<2 x i64> noundef %vect) {
8; CHECK-LABEL: define <2 x i64> @PR61061
9; CHECK-SAME: (<2 x i64> noundef [[VECT:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
10; CHECK-NEXT:    [[BC0:%.*]] = bitcast <2 x i64> [[VECT]] to <16 x i8>
11; CHECK-NEXT:    [[PTR_SROA_0_15_VEC_INSERT:%.*]] = shufflevector <16 x i8> [[BC0]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>
12; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <16 x i8> [[PTR_SROA_0_15_VEC_INSERT]] to <2 x i64>
13; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
14;
15  %ptr = alloca <2 x i64>, align 16
16  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %ptr)
17  %bc0 = bitcast <2 x i64> %vect to <16 x i8>
18  %bc1 = bitcast <2 x i64> %vect to <16 x i8>
19  %bc2 = bitcast <2 x i64> %vect to <16 x i8>
20  %bc3 = bitcast <2 x i64> %vect to <16 x i8>
21  %bc4 = bitcast <2 x i64> %vect to <16 x i8>
22  %bc5 = bitcast <2 x i64> %vect to <16 x i8>
23  %bc6 = bitcast <2 x i64> %vect to <16 x i8>
24  %bc7 = bitcast <2 x i64> %vect to <16 x i8>
25  %elt0 = extractelement <16 x i8> %bc0, i64 0
26  %elt1 = extractelement <16 x i8> %bc1, i64 1
27  %elt2 = extractelement <16 x i8> %bc2, i64 2
28  %elt3 = extractelement <16 x i8> %bc3, i64 3
29  %elt4 = extractelement <16 x i8> %bc4, i64 4
30  %elt5 = extractelement <16 x i8> %bc5, i64 5
31  %elt6 = extractelement <16 x i8> %bc6, i64 6
32  %elt7 = extractelement <16 x i8> %bc7, i64 7
33  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 1
34  %ptr2 = getelementptr inbounds i8, ptr %ptr, i64 2
35  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 3
36  %ptr4 = getelementptr inbounds i8, ptr %ptr, i64 4
37  %ptr5 = getelementptr inbounds i8, ptr %ptr, i64 5
38  %ptr6 = getelementptr inbounds i8, ptr %ptr, i64 6
39  %ptr7 = getelementptr inbounds i8, ptr %ptr, i64 7
40  %ptr8 = getelementptr inbounds i8, ptr %ptr, i64 8
41  %ptr9 = getelementptr inbounds i8, ptr %ptr, i64 9
42  %ptr10 = getelementptr inbounds i8, ptr %ptr, i64 10
43  %ptr11 = getelementptr inbounds i8, ptr %ptr, i64 11
44  %ptr12 = getelementptr inbounds i8, ptr %ptr, i64 12
45  %ptr13 = getelementptr inbounds i8, ptr %ptr, i64 13
46  %ptr14 = getelementptr inbounds i8, ptr %ptr, i64 14
47  %ptr15 = getelementptr inbounds i8, ptr %ptr, i64 15
48  store i8 %elt0, ptr %ptr, align 16
49  store i8 %elt1, ptr %ptr1, align 1
50  store i8 %elt2, ptr %ptr2, align 2
51  store i8 %elt3, ptr %ptr3, align 1
52  store i8 %elt0, ptr %ptr4, align 4
53  store i8 %elt1, ptr %ptr5, align 1
54  store i8 %elt2, ptr %ptr6, align 2
55  store i8 %elt3, ptr %ptr7, align 1
56  store i8 %elt4, ptr %ptr8, align 8
57  store i8 %elt5, ptr %ptr9, align 1
58  store i8 %elt6, ptr %ptr10, align 2
59  store i8 %elt7, ptr %ptr11, align 1
60  store i8 %elt0, ptr %ptr12, align 4
61  store i8 %elt1, ptr %ptr13, align 1
62  store i8 %elt2, ptr %ptr14, align 2
63  store i8 %elt3, ptr %ptr15, align 1
64  %base = load <2 x i64>, ptr %ptr, align 16
65  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %ptr)
66  ret <2 x i64> %base
67}
68declare void @llvm.lifetime.start.p0(i64, ptr)
69declare void @llvm.lifetime.end.p0(i64, ptr)
70