xref: /llvm-project/llvm/test/Transforms/LoadStoreVectorizer/int_sideeffect.ll (revision 2be0abb7fe72ed4537b3eabcd3102d48ea845717)
1dc37f537SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2d6e7e477SRoman Lebedev; RUN: opt -S < %s -passes=load-store-vectorizer | FileCheck %s
3cee313d2SEric Christopher; RUN: opt -S < %s -passes='function(load-store-vectorizer)' | FileCheck %s
4cee313d2SEric Christopher
5cee313d2SEric Christopherdeclare void @llvm.sideeffect()
6cee313d2SEric Christopher
7cee313d2SEric Christopher; load-store vectorization across a @llvm.sideeffect.
8cee313d2SEric Christopher
9ba1759c4SNikita Popovdefine void @test_sideeffect(ptr %p) {
10dc37f537SNikita Popov; CHECK-LABEL: @test_sideeffect(
11ba1759c4SNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, ptr [[P:%.*]], align 16
12dc37f537SNikita Popov; CHECK-NEXT:    [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0
13dc37f537SNikita Popov; CHECK-NEXT:    [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1
14dc37f537SNikita Popov; CHECK-NEXT:    [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2
15dc37f537SNikita Popov; CHECK-NEXT:    [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3
16dc37f537SNikita Popov; CHECK-NEXT:    call void @llvm.sideeffect()
17dc37f537SNikita Popov; CHECK-NEXT:    call void @llvm.sideeffect()
18cf284f6cShyeongyu kim; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0
19dc37f537SNikita Popov; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1
20dc37f537SNikita Popov; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2
21dc37f537SNikita Popov; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3
22ba1759c4SNikita Popov; CHECK-NEXT:    store <4 x float> [[TMP6]], ptr [[P]], align 16
23dc37f537SNikita Popov; CHECK-NEXT:    ret void
24dc37f537SNikita Popov;
25ba1759c4SNikita Popov  %p1 = getelementptr float, ptr %p, i64 1
26ba1759c4SNikita Popov  %p2 = getelementptr float, ptr %p, i64 2
27ba1759c4SNikita Popov  %p3 = getelementptr float, ptr %p, i64 3
28ba1759c4SNikita Popov  %l0 = load float, ptr %p, align 16
29ba1759c4SNikita Popov  %l1 = load float, ptr %p1
30ba1759c4SNikita Popov  %l2 = load float, ptr %p2
31cee313d2SEric Christopher  call void @llvm.sideeffect()
32ba1759c4SNikita Popov  %l3 = load float, ptr %p3
33ba1759c4SNikita Popov  store float %l0, ptr %p, align 16
34cee313d2SEric Christopher  call void @llvm.sideeffect()
35ba1759c4SNikita Popov  store float %l1, ptr %p1
36ba1759c4SNikita Popov  store float %l2, ptr %p2
37ba1759c4SNikita Popov  store float %l3, ptr %p3
38cee313d2SEric Christopher  ret void
39cee313d2SEric Christopher}
40dc37f537SNikita Popov
41dc37f537SNikita Popovdeclare void @foo()
42dc37f537SNikita Popov
43ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_nounwind_willreturn(ptr %p) {
44330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_nounwind_willreturn(
45ba1759c4SNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, ptr [[P:%.*]], align 16
469d720dcbSNikita Popov; CHECK-NEXT:    [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0
479d720dcbSNikita Popov; CHECK-NEXT:    [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1
489d720dcbSNikita Popov; CHECK-NEXT:    [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2
499d720dcbSNikita Popov; CHECK-NEXT:    [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3
50dc37f537SNikita Popov; CHECK-NEXT:    call void @foo() #[[ATTR1:[0-9]+]]
51dc37f537SNikita Popov; CHECK-NEXT:    call void @foo() #[[ATTR1]]
52cf284f6cShyeongyu kim; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0
539d720dcbSNikita Popov; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1
549d720dcbSNikita Popov; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2
559d720dcbSNikita Popov; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3
56ba1759c4SNikita Popov; CHECK-NEXT:    store <4 x float> [[TMP6]], ptr [[P]], align 16
57dc37f537SNikita Popov; CHECK-NEXT:    ret void
58dc37f537SNikita Popov;
59ba1759c4SNikita Popov  %p1 = getelementptr float, ptr %p, i64 1
60ba1759c4SNikita Popov  %p2 = getelementptr float, ptr %p, i64 2
61ba1759c4SNikita Popov  %p3 = getelementptr float, ptr %p, i64 3
62ba1759c4SNikita Popov  %l0 = load float, ptr %p, align 16
63ba1759c4SNikita Popov  %l1 = load float, ptr %p1
64ba1759c4SNikita Popov  %l2 = load float, ptr %p2
65330cb032SNikita Popov  call void @foo() inaccessiblememonly nounwind willreturn
66ba1759c4SNikita Popov  %l3 = load float, ptr %p3
67ba1759c4SNikita Popov  store float %l0, ptr %p, align 16
68330cb032SNikita Popov  call void @foo() inaccessiblememonly nounwind willreturn
69ba1759c4SNikita Popov  store float %l1, ptr %p1
70ba1759c4SNikita Popov  store float %l2, ptr %p2
71ba1759c4SNikita Popov  store float %l3, ptr %p3
72330cb032SNikita Popov  ret void
73330cb032SNikita Popov}
74330cb032SNikita Popov
75ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_not_willreturn(ptr %p) {
76330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_willreturn(
77ba1759c4SNikita Popov; CHECK-NEXT:    [[P1:%.*]] = getelementptr float, ptr [[P:%.*]], i64 1
78ba1759c4SNikita Popov; CHECK-NEXT:    [[P2:%.*]] = getelementptr float, ptr [[P]], i64 2
79ba1759c4SNikita Popov; CHECK-NEXT:    [[P3:%.*]] = getelementptr float, ptr [[P]], i64 3
80ba1759c4SNikita Popov; CHECK-NEXT:    [[L0:%.*]] = load float, ptr [[P]], align 16
81*2be0abb7SJustin Lebar; CHECK-NEXT:    call void @foo() #[[ATTR2:[0-9]+]]
82ba1759c4SNikita Popov; CHECK-NEXT:    [[L1:%.*]] = load float, ptr [[P1]], align 4
83ba1759c4SNikita Popov; CHECK-NEXT:    [[L2:%.*]] = load float, ptr [[P2]], align 4
84ba1759c4SNikita Popov; CHECK-NEXT:    [[L3:%.*]] = load float, ptr [[P3]], align 4
85ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L0]], ptr [[P]], align 16
86330cb032SNikita Popov; CHECK-NEXT:    call void @foo() #[[ATTR2]]
87ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L1]], ptr [[P1]], align 4
88ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L2]], ptr [[P2]], align 4
89ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L3]], ptr [[P3]], align 4
90330cb032SNikita Popov; CHECK-NEXT:    ret void
91330cb032SNikita Popov;
92ba1759c4SNikita Popov  %p1 = getelementptr float, ptr %p, i64 1
93ba1759c4SNikita Popov  %p2 = getelementptr float, ptr %p, i64 2
94ba1759c4SNikita Popov  %p3 = getelementptr float, ptr %p, i64 3
95ba1759c4SNikita Popov  %l0 = load float, ptr %p, align 16
96*2be0abb7SJustin Lebar  call void @foo() inaccessiblememonly nounwind
97ba1759c4SNikita Popov  %l1 = load float, ptr %p1
98ba1759c4SNikita Popov  %l2 = load float, ptr %p2
99ba1759c4SNikita Popov  %l3 = load float, ptr %p3
100ba1759c4SNikita Popov  store float %l0, ptr %p, align 16
101dc37f537SNikita Popov  call void @foo() inaccessiblememonly nounwind
102ba1759c4SNikita Popov  store float %l1, ptr %p1
103ba1759c4SNikita Popov  store float %l2, ptr %p2
104ba1759c4SNikita Popov  store float %l3, ptr %p3
105dc37f537SNikita Popov  ret void
106dc37f537SNikita Popov}
107330cb032SNikita Popov
108ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_not_nounwind(ptr %p) {
109330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_nounwind(
110ba1759c4SNikita Popov; CHECK-NEXT:    [[P1:%.*]] = getelementptr float, ptr [[P:%.*]], i64 1
111ba1759c4SNikita Popov; CHECK-NEXT:    [[P2:%.*]] = getelementptr float, ptr [[P]], i64 2
112ba1759c4SNikita Popov; CHECK-NEXT:    [[P3:%.*]] = getelementptr float, ptr [[P]], i64 3
113ba1759c4SNikita Popov; CHECK-NEXT:    [[L0:%.*]] = load float, ptr [[P]], align 16
114*2be0abb7SJustin Lebar; CHECK-NEXT:    call void @foo() #[[ATTR3:[0-9]+]]
115ba1759c4SNikita Popov; CHECK-NEXT:    [[L1:%.*]] = load float, ptr [[P1]], align 4
116ba1759c4SNikita Popov; CHECK-NEXT:    [[L2:%.*]] = load float, ptr [[P2]], align 4
117ba1759c4SNikita Popov; CHECK-NEXT:    [[L3:%.*]] = load float, ptr [[P3]], align 4
118ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L0]], ptr [[P]], align 16
119330cb032SNikita Popov; CHECK-NEXT:    call void @foo() #[[ATTR3]]
120ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L1]], ptr [[P1]], align 4
121ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L2]], ptr [[P2]], align 4
122ba1759c4SNikita Popov; CHECK-NEXT:    store float [[L3]], ptr [[P3]], align 4
123330cb032SNikita Popov; CHECK-NEXT:    ret void
124330cb032SNikita Popov;
125ba1759c4SNikita Popov  %p1 = getelementptr float, ptr %p, i64 1
126ba1759c4SNikita Popov  %p2 = getelementptr float, ptr %p, i64 2
127ba1759c4SNikita Popov  %p3 = getelementptr float, ptr %p, i64 3
128ba1759c4SNikita Popov  %l0 = load float, ptr %p, align 16
129*2be0abb7SJustin Lebar  call void @foo() inaccessiblememonly willreturn
130ba1759c4SNikita Popov  %l1 = load float, ptr %p1
131ba1759c4SNikita Popov  %l2 = load float, ptr %p2
132ba1759c4SNikita Popov  %l3 = load float, ptr %p3
133ba1759c4SNikita Popov  store float %l0, ptr %p, align 16
134330cb032SNikita Popov  call void @foo() inaccessiblememonly willreturn
135ba1759c4SNikita Popov  store float %l1, ptr %p1
136ba1759c4SNikita Popov  store float %l2, ptr %p2
137ba1759c4SNikita Popov  store float %l3, ptr %p3
138330cb032SNikita Popov  ret void
139330cb032SNikita Popov}
140