xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/pointer-select.ll (revision fd20eb55f1b62d90e4cc45438a5be993256c1f3a)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
3
4define ptr @pointer_select_two_objects(i1 %cond, ptr %first_obj, ptr %second_obj) {
5; CHECK-LABEL: 'pointer_select_two_objects'
6; CHECK-NEXT:  Classifying expressions for: @pointer_select_two_objects
7; CHECK-NEXT:    %r = select i1 %cond, ptr %first_obj, ptr %second_obj
8; CHECK-NEXT:    --> %r U: full-set S: full-set
9; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_two_objects
10;
11  %r = select i1 %cond, ptr %first_obj, ptr %second_obj
12  ret ptr %r
13}
14
15;--
16
17define ptr @pointer_select_same_object_constant_offsets(i1 %cond, ptr %obj) {
18; CHECK-LABEL: 'pointer_select_same_object_constant_offsets'
19; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_constant_offsets
20; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
21; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
22; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
23; CHECK-NEXT:    --> (24 + %obj) U: full-set S: full-set
24; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
25; CHECK-NEXT:    --> %r U: full-set S: full-set
26; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_constant_offsets
27;
28  %true_ptr = getelementptr i8, ptr %obj, i64 42
29  %false_ptr = getelementptr i8, ptr %obj, i64 24
30  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
31  ret ptr %r
32}
33
34define ptr @pointer_select_same_object_variable_offsets(i1 %cond, ptr %obj, i64 %true_off, i64 %false_off) {
35; CHECK-LABEL: 'pointer_select_same_object_variable_offsets'
36; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_variable_offsets
37; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
38; CHECK-NEXT:    --> (%true_off + %obj) U: full-set S: full-set
39; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
40; CHECK-NEXT:    --> (%false_off + %obj) U: full-set S: full-set
41; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
42; CHECK-NEXT:    --> %r U: full-set S: full-set
43; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_variable_offsets
44;
45  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
46  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
47  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
48  ret ptr %r
49}
50
51define ptr @pointer_select_same_object_constant_offset_vs_variable_offset(i1 %cond, ptr %obj, i64 %false_off) {
52; CHECK-LABEL: 'pointer_select_same_object_constant_offset_vs_variable_offset'
53; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_constant_offset_vs_variable_offset
54; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
55; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
56; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
57; CHECK-NEXT:    --> (%false_off + %obj) U: full-set S: full-set
58; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
59; CHECK-NEXT:    --> %r U: full-set S: full-set
60; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_constant_offset_vs_variable_offset
61;
62  %true_ptr = getelementptr i8, ptr %obj, i64 42
63  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
64  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
65  ret ptr %r
66}
67
68define ptr @pointer_select_same_object_variable_offset_vs_constant_offset(i1 %cond, ptr %obj, i64 %true_off) {
69; CHECK-LABEL: 'pointer_select_same_object_variable_offset_vs_constant_offset'
70; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_variable_offset_vs_constant_offset
71; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
72; CHECK-NEXT:    --> (%true_off + %obj) U: full-set S: full-set
73; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
74; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
75; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
76; CHECK-NEXT:    --> %r U: full-set S: full-set
77; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_variable_offset_vs_constant_offset
78;
79  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
80  %false_ptr = getelementptr i8, ptr %obj, i64 42
81  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
82  ret ptr %r
83}
84
85;--
86
87define ptr @pointer_select_same_object_with_constant_base_offset__constant_offsets(i1 %cond, ptr %obj.base) {
88; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__constant_offsets'
89; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__constant_offsets
90; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
91; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
92; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
93; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
94; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
95; CHECK-NEXT:    --> (36 + %obj.base) U: full-set S: full-set
96; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
97; CHECK-NEXT:    --> %r U: full-set S: full-set
98; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__constant_offsets
99;
100  %obj = getelementptr i8, ptr %obj.base, i64 12
101  %true_ptr = getelementptr i8, ptr %obj, i64 42
102  %false_ptr = getelementptr i8, ptr %obj, i64 24
103  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
104  ret ptr %r
105}
106
107define ptr @pointer_select_same_object_with_constant_base_offset__variable_offsets(i1 %cond, ptr %obj.base, i64 %true_off, i64 %false_off) {
108; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__variable_offsets'
109; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__variable_offsets
110; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
111; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
112; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
113; CHECK-NEXT:    --> (12 + %true_off + %obj.base) U: full-set S: full-set
114; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
115; CHECK-NEXT:    --> (12 + %false_off + %obj.base) U: full-set S: full-set
116; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
117; CHECK-NEXT:    --> %r U: full-set S: full-set
118; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__variable_offsets
119;
120  %obj = getelementptr i8, ptr %obj.base, i64 12
121  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
122  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
123  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
124  ret ptr %r
125}
126
127define ptr @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset(i1 %cond, ptr %obj.base, i64 %false_off) {
128; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset'
129; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset
130; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
131; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
132; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
133; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
134; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
135; CHECK-NEXT:    --> (12 + %false_off + %obj.base) U: full-set S: full-set
136; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
137; CHECK-NEXT:    --> %r U: full-set S: full-set
138; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset
139;
140  %obj = getelementptr i8, ptr %obj.base, i64 12
141  %true_ptr = getelementptr i8, ptr %obj, i64 42
142  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
143  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
144  ret ptr %r
145}
146
147define ptr @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset(i1 %cond, ptr %obj.base, i64 %true_off) {
148; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset'
149; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset
150; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
151; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
152; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
153; CHECK-NEXT:    --> (12 + %true_off + %obj.base) U: full-set S: full-set
154; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
155; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
156; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
157; CHECK-NEXT:    --> %r U: full-set S: full-set
158; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset
159;
160  %obj = getelementptr i8, ptr %obj.base, i64 12
161  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
162  %false_ptr = getelementptr i8, ptr %obj, i64 42
163  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
164  ret ptr %r
165}
166
167;--
168
169define ptr @pointer_select_same_object_with_variable_base_offset__constant_offsets(i1 %cond, ptr %obj.base, i64 %base_offset) {
170; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__constant_offsets'
171; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__constant_offsets
172; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
173; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
174; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
175; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
176; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
177; CHECK-NEXT:    --> (24 + %base_offset + %obj.base) U: full-set S: full-set
178; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
179; CHECK-NEXT:    --> %r U: full-set S: full-set
180; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__constant_offsets
181;
182  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
183  %true_ptr = getelementptr i8, ptr %obj, i64 42
184  %false_ptr = getelementptr i8, ptr %obj, i64 24
185  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
186  ret ptr %r
187}
188
189define ptr @pointer_select_same_object_with_variable_base_offset__variable_offsets(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %true_off, i64 %false_off) {
190; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__variable_offsets'
191; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__variable_offsets
192; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
193; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
194; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
195; CHECK-NEXT:    --> (%base_offset + %true_off + %obj.base) U: full-set S: full-set
196; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
197; CHECK-NEXT:    --> (%base_offset + %false_off + %obj.base) U: full-set S: full-set
198; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
199; CHECK-NEXT:    --> %r U: full-set S: full-set
200; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__variable_offsets
201;
202  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
203  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
204  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
205  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
206  ret ptr %r
207}
208
209define ptr @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %false_off) {
210; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset'
211; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset
212; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
213; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
214; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
215; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
216; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
217; CHECK-NEXT:    --> (%base_offset + %false_off + %obj.base) U: full-set S: full-set
218; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
219; CHECK-NEXT:    --> %r U: full-set S: full-set
220; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset
221;
222  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
223  %true_ptr = getelementptr i8, ptr %obj, i64 42
224  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
225  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
226  ret ptr %r
227}
228
229define ptr @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %true_off) {
230; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset'
231; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset
232; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
233; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
234; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
235; CHECK-NEXT:    --> (%base_offset + %true_off + %obj.base) U: full-set S: full-set
236; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
237; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
238; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
239; CHECK-NEXT:    --> %r U: full-set S: full-set
240; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset
241;
242  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
243  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
244  %false_ptr = getelementptr i8, ptr %obj, i64 42
245  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
246  ret ptr %r
247}
248