xref: /llvm-project/llvm/test/Transforms/LoopVectorize/vectorize-pointer-phis.ll (revision 7d7577256b76e4293f455b8093504d5f7044ab4b)
12e14900dSBjorn Pettersson; RUN: opt < %s -passes=loop-vectorize -force-vector-width=2 -S | FileCheck %s
2a950f66dSFlorian Hahn
3a950f66dSFlorian Hahn%s1 = type { [32000 x double], [32000 x double], [32000 x double] }
4a950f66dSFlorian Hahn
5*7d757725SNikita Popovdefine i32 @load_with_pointer_phi_no_runtime_checks(ptr %data) {
6872f7000SDávid Bolvanský; CHECK-LABEL: @load_with_pointer_phi_no_runtime_checks
7872f7000SDávid Bolvanský; CHECK-NOT: memcheck
8e248d690SFlorian Hahn; CHECK:     vector.body:
9a950f66dSFlorian Hahn;
10a950f66dSFlorian Hahnentry:
11a950f66dSFlorian Hahn  br label %loop.header
12a950f66dSFlorian Hahn
13a950f66dSFlorian Hahnloop.header:                                        ; preds = %loop.latch, %entry
14a950f66dSFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
15a950f66dSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
16a950f66dSFlorian Hahn  %cmp5 = icmp ult i64 %iv, 15999
17*7d757725SNikita Popov  %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv
18a950f66dSFlorian Hahn  br i1 %cmp5, label %if.then, label %if.else
19a950f66dSFlorian Hahn
20a950f66dSFlorian Hahnif.then:                                          ; preds = %loop.header
21*7d757725SNikita Popov  %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv
22a950f66dSFlorian Hahn  br label %loop.latch
23a950f66dSFlorian Hahn
24a950f66dSFlorian Hahnif.else:                                          ; preds = %loop.header
25*7d757725SNikita Popov  %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv
26a950f66dSFlorian Hahn  br label %loop.latch
27a950f66dSFlorian Hahn
28a950f66dSFlorian Hahnloop.latch:                                          ; preds = %if.else, %if.then
29*7d757725SNikita Popov  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
30*7d757725SNikita Popov  %v8 = load double, ptr %gep.2.sink, align 8
31a950f66dSFlorian Hahn  %mul16 = fmul double 3.0, %v8
32*7d757725SNikita Popov  store double %mul16, ptr %arrayidx, align 8
33a950f66dSFlorian Hahn  %exitcond.not = icmp eq i64 %iv.next, 32000
34a950f66dSFlorian Hahn  br i1 %exitcond.not, label %exit, label %loop.header
35a950f66dSFlorian Hahn
36a950f66dSFlorian Hahnexit:                                             ; preds = %loop.latch
37a950f66dSFlorian Hahn  ret i32 10
38a950f66dSFlorian Hahn}
39a950f66dSFlorian Hahn
40*7d757725SNikita Popovdefine i32 @store_with_pointer_phi_no_runtime_checks(ptr %data) {
41872f7000SDávid Bolvanský; CHECK-LABEL: @store_with_pointer_phi_no_runtime_checks
42872f7000SDávid Bolvanský; CHECK-NOT: memcheck
43872f7000SDávid Bolvanský; CHECK:     vector.body
44a950f66dSFlorian Hahn;
45a950f66dSFlorian Hahnentry:
46a950f66dSFlorian Hahn  br label %loop.header
47a950f66dSFlorian Hahn
48a950f66dSFlorian Hahnloop.header:                                        ; preds = %loop.latch, %entry
49a950f66dSFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
50a950f66dSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
51a950f66dSFlorian Hahn  %cmp5 = icmp ult i64 %iv, 15999
52*7d757725SNikita Popov  %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv
53a950f66dSFlorian Hahn  br i1 %cmp5, label %if.then, label %if.else
54a950f66dSFlorian Hahn
55a950f66dSFlorian Hahnif.then:                                          ; preds = %loop.header
56*7d757725SNikita Popov  %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv
57a950f66dSFlorian Hahn  br label %loop.latch
58a950f66dSFlorian Hahn
59a950f66dSFlorian Hahnif.else:                                          ; preds = %loop.header
60*7d757725SNikita Popov  %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv
61a950f66dSFlorian Hahn  br label %loop.latch
62a950f66dSFlorian Hahn
63a950f66dSFlorian Hahnloop.latch:                                          ; preds = %if.else, %if.then
64*7d757725SNikita Popov  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
65*7d757725SNikita Popov  %v8 = load double, ptr %arrayidx, align 8
66a950f66dSFlorian Hahn  %mul16 = fmul double 3.0, %v8
67*7d757725SNikita Popov  store double %mul16, ptr %gep.2.sink, align 8
68a950f66dSFlorian Hahn  %exitcond.not = icmp eq i64 %iv.next, 32000
69a950f66dSFlorian Hahn  br i1 %exitcond.not, label %exit, label %loop.header
70a950f66dSFlorian Hahn
71a950f66dSFlorian Hahnexit:                                             ; preds = %loop.latch
72a950f66dSFlorian Hahn  ret i32 10
73a950f66dSFlorian Hahn}
74a950f66dSFlorian Hahn
75*7d757725SNikita Popovdefine i32 @store_with_pointer_phi_runtime_checks(ptr %A, ptr %B, ptr %C) {
76872f7000SDávid Bolvanský; CHECK-LABEL: @store_with_pointer_phi_runtime_checks
77872f7000SDávid Bolvanský; CHECK:     memcheck
78872f7000SDávid Bolvanský; CHECK:     vector.body
79a950f66dSFlorian Hahn;
80a950f66dSFlorian Hahnentry:
81a950f66dSFlorian Hahn  br label %loop.header
82a950f66dSFlorian Hahn
83a950f66dSFlorian Hahnloop.header:                                        ; preds = %loop.latch, %entry
84a950f66dSFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
85a950f66dSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
86a950f66dSFlorian Hahn  %cmp5 = icmp ult i64 %iv, 15999
87*7d757725SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
88a950f66dSFlorian Hahn  br i1 %cmp5, label %if.then, label %if.else
89a950f66dSFlorian Hahn
90a950f66dSFlorian Hahnif.then:                                          ; preds = %loop.header
91*7d757725SNikita Popov  %gep.1 = getelementptr inbounds double, ptr %B, i64 %iv
92a950f66dSFlorian Hahn  br label %loop.latch
93a950f66dSFlorian Hahn
94a950f66dSFlorian Hahnif.else:                                          ; preds = %loop.header
95*7d757725SNikita Popov  %gep.2 = getelementptr inbounds double, ptr %C, i64 %iv
96a950f66dSFlorian Hahn  br label %loop.latch
97a950f66dSFlorian Hahn
98a950f66dSFlorian Hahnloop.latch:                                          ; preds = %if.else, %if.then
99*7d757725SNikita Popov  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
100*7d757725SNikita Popov  %v8 = load double, ptr %arrayidx, align 8
101a950f66dSFlorian Hahn  %mul16 = fmul double 3.0, %v8
102*7d757725SNikita Popov  store double %mul16, ptr %gep.2.sink, align 8
103a950f66dSFlorian Hahn  %exitcond.not = icmp eq i64 %iv.next, 32000
104a950f66dSFlorian Hahn  br i1 %exitcond.not, label %exit, label %loop.header
105a950f66dSFlorian Hahn
106a950f66dSFlorian Hahnexit:                                             ; preds = %loop.latch
107a950f66dSFlorian Hahn  ret i32 10
108a950f66dSFlorian Hahn}
109a950f66dSFlorian Hahn
110*7d757725SNikita Popovdefine i32 @load_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
111872f7000SDávid Bolvanský; CHECK-LABEL: @load_with_pointer_phi_outside_loop
112872f7000SDávid Bolvanský; CHECK-NOT: vector.body
113a950f66dSFlorian Hahn;
114a950f66dSFlorian Hahnentry:
115a950f66dSFlorian Hahn  br i1 %c.0, label %if.then, label %if.else
116a950f66dSFlorian Hahn
117a950f66dSFlorian Hahnif.then:
118a950f66dSFlorian Hahn  br label %loop.ph
119a950f66dSFlorian Hahn
120a950f66dSFlorian Hahnif.else:
121*7d757725SNikita Popov  %ptr.select = select i1 %c.1, ptr %C, ptr %B
122a950f66dSFlorian Hahn  br label %loop.ph
123a950f66dSFlorian Hahn
124a950f66dSFlorian Hahnloop.ph:
125*7d757725SNikita Popov  %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ]
126a950f66dSFlorian Hahn  br label %loop.header
127a950f66dSFlorian Hahn
128a950f66dSFlorian Hahnloop.header:                                        ; preds = %loop.latch, %entry
129a950f66dSFlorian Hahn  %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ]
130a950f66dSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
131*7d757725SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
132*7d757725SNikita Popov  %v8 = load double, ptr %ptr, align 8
133a950f66dSFlorian Hahn  %mul16 = fmul double 3.0, %v8
134*7d757725SNikita Popov  store double %mul16, ptr %arrayidx, align 8
135a950f66dSFlorian Hahn  %exitcond.not = icmp eq i64 %iv.next, 32000
136a950f66dSFlorian Hahn  br i1 %exitcond.not, label %exit, label %loop.header
137a950f66dSFlorian Hahn
138a950f66dSFlorian Hahnexit:                                             ; preds = %loop.latch
139a950f66dSFlorian Hahn  ret i32 10
140a950f66dSFlorian Hahn}
141a950f66dSFlorian Hahn
142*7d757725SNikita Popovdefine i32 @store_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
143872f7000SDávid Bolvanský; CHECK-LABEL: @store_with_pointer_phi_outside_loop
144872f7000SDávid Bolvanský; CHECK-NOT: vector.body
145a950f66dSFlorian Hahn;
146a950f66dSFlorian Hahnentry:
147a950f66dSFlorian Hahn  br i1 %c.0, label %if.then, label %if.else
148a950f66dSFlorian Hahn
149a950f66dSFlorian Hahnif.then:
150a950f66dSFlorian Hahn  br label %loop.ph
151a950f66dSFlorian Hahn
152a950f66dSFlorian Hahnif.else:
153*7d757725SNikita Popov  %ptr.select = select i1 %c.1, ptr %C, ptr %B
154a950f66dSFlorian Hahn  br label %loop.ph
155a950f66dSFlorian Hahn
156a950f66dSFlorian Hahnloop.ph:
157*7d757725SNikita Popov  %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ]
158a950f66dSFlorian Hahn  br label %loop.header
159a950f66dSFlorian Hahn
160a950f66dSFlorian Hahnloop.header:                                        ; preds = %loop.latch, %entry
161a950f66dSFlorian Hahn  %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ]
162a950f66dSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
163*7d757725SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
164*7d757725SNikita Popov  %v8 = load double, ptr %arrayidx, align 8
165a950f66dSFlorian Hahn  %mul16 = fmul double 3.0, %v8
166*7d757725SNikita Popov  store double %mul16, ptr %ptr, align 8
167a950f66dSFlorian Hahn  %exitcond.not = icmp eq i64 %iv.next, 32000
168a950f66dSFlorian Hahn  br i1 %exitcond.not, label %exit, label %loop.header
169a950f66dSFlorian Hahn
170a950f66dSFlorian Hahnexit:                                             ; preds = %loop.latch
171a950f66dSFlorian Hahn  ret i32 10
172a950f66dSFlorian Hahn}
173