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