[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstCombine / deref-alloc-fns.ll
blob3adfab914175fbfc7183861a1d93afadff24dbc6
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine  -S < %s | FileCheck %s
3 ; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -instcombine -S | FileCheck %s --check-prefixes=CHECK,GNU
6 declare noalias i8* @malloc(i64)
7 declare noalias i8* @calloc(i64, i64)
8 declare noalias i8* @realloc(i8* nocapture, i64)
9 declare noalias nonnull i8* @_Znam(i64) ; throwing version of 'new'
10 declare noalias nonnull i8* @_Znwm(i64) ; throwing version of 'new'
11 declare noalias i8* @strdup(i8*)
12 declare noalias i8* @aligned_alloc(i64, i64)
13 declare noalias align 16 i8* @memalign(i64, i64)
14 ; new[](unsigned int, align_val_t)
15 declare noalias i8* @_ZnajSt11align_val_t(i64 %size, i64 %align)
17 @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1
19 define noalias i8* @malloc_nonconstant_size(i64 %n) {
20 ; CHECK-LABEL: @malloc_nonconstant_size(
21 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @malloc(i64 [[N:%.*]])
22 ; CHECK-NEXT:    ret i8* [[CALL]]
24   %call = tail call noalias i8* @malloc(i64 %n)
25   ret i8* %call
28 define noalias i8* @malloc_constant_size() {
29 ; CHECK-LABEL: @malloc_constant_size(
30 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(40) i8* @malloc(i64 40)
31 ; CHECK-NEXT:    ret i8* [[CALL]]
33   %call = tail call noalias i8* @malloc(i64 40)
34   ret i8* %call
37 define noalias i8* @aligned_alloc_constant_size() {
38 ; CHECK-LABEL: @aligned_alloc_constant_size(
39 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias align 32 dereferenceable_or_null(512) i8* @aligned_alloc(i64 32, i64 512)
40 ; CHECK-NEXT:    ret i8* [[CALL]]
42   %call = tail call noalias i8* @aligned_alloc(i64 32, i64 512)
43   ret i8* %call
46 define noalias i8* @aligned_alloc_unknown_size_nonzero(i1 %c) {
47 ; CHECK-LABEL: @aligned_alloc_unknown_size_nonzero(
48 ; CHECK-NEXT:    [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 128
49 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias align 32 i8* @aligned_alloc(i64 32, i64 [[SIZE]])
50 ; CHECK-NEXT:    ret i8* [[CALL]]
52   %size = select i1 %c, i64 64, i64 128
53   %call = tail call noalias i8* @aligned_alloc(i64 32, i64 %size)
54   ret i8* %call
57 define noalias i8* @aligned_alloc_unknown_size_possibly_zero(i1 %c) {
58 ; CHECK-LABEL: @aligned_alloc_unknown_size_possibly_zero(
59 ; CHECK-NEXT:    [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 0
60 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias align 32 i8* @aligned_alloc(i64 32, i64 [[SIZE]])
61 ; CHECK-NEXT:    ret i8* [[CALL]]
63   %size = select i1 %c, i64 64, i64 0
64   %call = tail call noalias i8* @aligned_alloc(i64 32, i64 %size)
65   ret i8* %call
68 define noalias i8* @aligned_alloc_unknown_align(i64 %align) {
69 ; CHECK-LABEL: @aligned_alloc_unknown_align(
70 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(128) i8* @aligned_alloc(i64 [[ALIGN:%.*]], i64 128)
71 ; CHECK-NEXT:    ret i8* [[CALL]]
73   %call = tail call noalias i8* @aligned_alloc(i64 %align, i64 128)
74   ret i8* %call
77 declare noalias i8* @foo(i8*, i8*, i8*)
79 define noalias i8* @aligned_alloc_dynamic_args(i64 %align, i64 %size) {
80 ; CHECK-LABEL: @aligned_alloc_dynamic_args(
81 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(1024) i8* @aligned_alloc(i64 [[ALIGN:%.*]], i64 1024)
82 ; CHECK-NEXT:    [[CALL_1:%.*]] = tail call noalias dereferenceable_or_null(1024) i8* @aligned_alloc(i64 0, i64 1024)
83 ; CHECK-NEXT:    [[CALL_2:%.*]] = tail call noalias align 32 i8* @aligned_alloc(i64 32, i64 [[SIZE:%.*]])
84 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @foo(i8* [[CALL]], i8* [[CALL_1]], i8* [[CALL_2]])
85 ; CHECK-NEXT:    ret i8* [[CALL]]
87   %call = tail call noalias i8* @aligned_alloc(i64 %align, i64 1024)
88   %call_1 = tail call noalias i8* @aligned_alloc(i64 0, i64 1024)
89   %call_2 = tail call noalias i8* @aligned_alloc(i64 32, i64 %size)
91   call i8* @foo(i8* %call, i8* %call_1, i8* %call_2)
92   ret i8* %call
95 define noalias i8* @memalign_constant_size() {
96 ; GNU-LABEL: @memalign_constant_size(
97 ; GNU-NEXT:    [[CALL:%.*]] = tail call noalias align 32 dereferenceable_or_null(512) i8* @memalign(i64 32, i64 512)
98 ; GNU-NEXT:    ret i8* [[CALL]]
100   %call = tail call noalias i8* @memalign(i64 32, i64 512)
101   ret i8* %call
104 define noalias i8* @memalign_unknown_size_nonzero(i1 %c) {
105 ; GNU-LABEL: @memalign_unknown_size_nonzero(
106 ; GNU-NEXT:    [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 128
107 ; GNU-NEXT:    [[CALL:%.*]] = tail call noalias align 32 i8* @memalign(i64 32, i64 [[SIZE]])
108 ; GNU-NEXT:    ret i8* [[CALL]]
110   %size = select i1 %c, i64 64, i64 128
111   %call = tail call noalias i8* @memalign(i64 32, i64 %size)
112   ret i8* %call
115 define noalias i8* @memalign_unknown_size_possibly_zero(i1 %c) {
116 ; GNU-LABEL: @memalign_unknown_size_possibly_zero(
117 ; GNU-NEXT:    [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 0
118 ; GNU-NEXT:    [[CALL:%.*]] = tail call noalias align 32 i8* @memalign(i64 32, i64 [[SIZE]])
119 ; GNU-NEXT:    ret i8* [[CALL]]
121   %size = select i1 %c, i64 64, i64 0
122   %call = tail call noalias i8* @memalign(i64 32, i64 %size)
123   ret i8* %call
126 define noalias i8* @memalign_unknown_align(i64 %align) {
127 ; GNU-LABEL: @memalign_unknown_align(
128 ; GNU-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(128) i8* @memalign(i64 [[ALIGN:%.*]], i64 128)
129 ; GNU-NEXT:    ret i8* [[CALL]]
131   %call = tail call noalias i8* @memalign(i64 %align, i64 128)
132   ret i8* %call
135 define noalias i8* @malloc_constant_size2() {
136 ; CHECK-LABEL: @malloc_constant_size2(
137 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(80) i8* @malloc(i64 40)
138 ; CHECK-NEXT:    ret i8* [[CALL]]
140   %call = tail call noalias dereferenceable_or_null(80) i8* @malloc(i64 40)
141   ret i8* %call
144 define noalias i8* @malloc_constant_size3() {
145 ; CHECK-LABEL: @malloc_constant_size3(
146 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable(80) dereferenceable_or_null(40) i8* @malloc(i64 40)
147 ; CHECK-NEXT:    ret i8* [[CALL]]
149   %call = tail call noalias dereferenceable(80) i8* @malloc(i64 40)
150   ret i8* %call
153 define noalias i8* @malloc_constant_zero_size() {
154 ; CHECK-LABEL: @malloc_constant_zero_size(
155 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @malloc(i64 0)
156 ; CHECK-NEXT:    ret i8* [[CALL]]
158   %call = tail call noalias i8* @malloc(i64 0)
159   ret i8* %call
162 define noalias i8* @realloc_nonconstant_size(i8* %p, i64 %n) {
163 ; CHECK-LABEL: @realloc_nonconstant_size(
164 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @realloc(i8* [[P:%.*]], i64 [[N:%.*]])
165 ; CHECK-NEXT:    ret i8* [[CALL]]
167   %call = tail call noalias i8* @realloc(i8* %p, i64 %n)
168   ret i8* %call
171 define noalias i8* @realloc_constant_zero_size(i8* %p) {
172 ; CHECK-LABEL: @realloc_constant_zero_size(
173 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @realloc(i8* [[P:%.*]], i64 0)
174 ; CHECK-NEXT:    ret i8* [[CALL]]
176   %call = tail call noalias i8* @realloc(i8* %p, i64 0)
177   ret i8* %call
180 define noalias i8* @realloc_constant_size(i8* %p) {
181 ; CHECK-LABEL: @realloc_constant_size(
182 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(40) i8* @realloc(i8* [[P:%.*]], i64 40)
183 ; CHECK-NEXT:    ret i8* [[CALL]]
185   %call = tail call noalias i8* @realloc(i8* %p, i64 40)
186   ret i8* %call
189 define noalias i8* @calloc_nonconstant_size(i64 %n) {
190 ; CHECK-LABEL: @calloc_nonconstant_size(
191 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 1, i64 [[N:%.*]])
192 ; CHECK-NEXT:    ret i8* [[CALL]]
194   %call = tail call noalias i8* @calloc(i64 1, i64 %n)
195   ret i8* %call
198 define noalias i8* @calloc_nonconstant_size2(i64 %n) {
199 ; CHECK-LABEL: @calloc_nonconstant_size2(
200 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 [[N:%.*]], i64 0)
201 ; CHECK-NEXT:    ret i8* [[CALL]]
203   %call = tail call noalias i8* @calloc(i64 %n, i64 0)
204   ret i8* %call
207 define noalias i8* @calloc_nonconstant_size3(i64 %n) {
208 ; CHECK-LABEL: @calloc_nonconstant_size3(
209 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 [[N:%.*]], i64 [[N]])
210 ; CHECK-NEXT:    ret i8* [[CALL]]
212   %call = tail call noalias i8* @calloc(i64 %n, i64 %n)
213   ret i8* %call
216 define noalias i8* @calloc_constant_zero_size() {
217 ; CHECK-LABEL: @calloc_constant_zero_size(
218 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 0, i64 0)
219 ; CHECK-NEXT:    ret i8* [[CALL]]
221   %call = tail call noalias i8* @calloc(i64 0, i64 0)
222   ret i8* %call
225 define noalias i8* @calloc_constant_zero_size2(i64 %n) {
226 ; CHECK-LABEL: @calloc_constant_zero_size2(
227 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 [[N:%.*]], i64 0)
228 ; CHECK-NEXT:    ret i8* [[CALL]]
230   %call = tail call noalias i8* @calloc(i64 %n, i64 0)
231   ret i8* %call
235 define noalias i8* @calloc_constant_zero_size3(i64 %n) {
236 ; CHECK-LABEL: @calloc_constant_zero_size3(
237 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 0, i64 [[N:%.*]])
238 ; CHECK-NEXT:    ret i8* [[CALL]]
240   %call = tail call noalias i8* @calloc(i64 0, i64 %n)
241   ret i8* %call
244 define noalias i8* @calloc_constant_zero_size4(i64 %n) {
245 ; CHECK-LABEL: @calloc_constant_zero_size4(
246 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 0, i64 1)
247 ; CHECK-NEXT:    ret i8* [[CALL]]
249   %call = tail call noalias i8* @calloc(i64 0, i64 1)
250   ret i8* %call
253 define noalias i8* @calloc_constant_zero_size5(i64 %n) {
254 ; CHECK-LABEL: @calloc_constant_zero_size5(
255 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 1, i64 0)
256 ; CHECK-NEXT:    ret i8* [[CALL]]
258   %call = tail call noalias i8* @calloc(i64 1, i64 0)
259   ret i8* %call
262 define noalias i8* @calloc_constant_size() {
263 ; CHECK-LABEL: @calloc_constant_size(
264 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(128) i8* @calloc(i64 16, i64 8)
265 ; CHECK-NEXT:    ret i8* [[CALL]]
267   %call = tail call noalias i8* @calloc(i64 16, i64 8)
268   ret i8* %call
271 define noalias i8* @calloc_constant_size_overflow() {
272 ; CHECK-LABEL: @calloc_constant_size_overflow(
273 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @calloc(i64 2000000000000, i64 80000000000)
274 ; CHECK-NEXT:    ret i8* [[CALL]]
276   %call = tail call noalias i8* @calloc(i64 2000000000000, i64 80000000000)
277   ret i8* %call
280 define noalias i8* @op_new_nonconstant_size(i64 %n) {
281 ; CHECK-LABEL: @op_new_nonconstant_size(
282 ; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @_Znam(i64 [[N:%.*]])
283 ; CHECK-NEXT:    ret i8* [[CALL]]
285   %call = tail call i8* @_Znam(i64 %n)
286   ret i8* %call
289 define noalias i8* @op_new_constant_size() {
290 ; CHECK-LABEL: @op_new_constant_size(
291 ; CHECK-NEXT:    [[CALL:%.*]] = tail call dereferenceable(40) i8* @_Znam(i64 40)
292 ; CHECK-NEXT:    ret i8* [[CALL]]
294   %call = tail call i8* @_Znam(i64 40)
295   ret i8* %call
298 define noalias i8* @op_new_constant_size2() {
299 ; CHECK-LABEL: @op_new_constant_size2(
300 ; CHECK-NEXT:    [[CALL:%.*]] = tail call dereferenceable(40) i8* @_Znwm(i64 40)
301 ; CHECK-NEXT:    ret i8* [[CALL]]
303   %call = tail call i8* @_Znwm(i64 40)
304   ret i8* %call
307 define noalias i8* @op_new_constant_zero_size() {
308 ; CHECK-LABEL: @op_new_constant_zero_size(
309 ; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @_Znam(i64 0)
310 ; CHECK-NEXT:    ret i8* [[CALL]]
312   %call = tail call i8* @_Znam(i64 0)
313   ret i8* %call
316 define noalias i8* @strdup_constant_str() {
317 ; CHECK-LABEL: @strdup_constant_str(
318 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(6) i8* @strdup(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
319 ; CHECK-NEXT:    ret i8* [[CALL]]
321   %call = tail call noalias i8* @strdup(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
322   ret i8* %call
325 define noalias i8* @strdup_notconstant_str(i8 * %str) {
326 ; CHECK-LABEL: @strdup_notconstant_str(
327 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @strdup(i8* [[STR:%.*]])
328 ; CHECK-NEXT:    ret i8* [[CALL]]
330   %call = tail call noalias i8* @strdup(i8* %str)
331   ret i8* %call
334 ; OSS-Fuzz #23214
335 ; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=23214
336 define noalias i8* @ossfuzz_23214() {
337 ; CHECK-LABEL: @ossfuzz_23214(
338 ; CHECK-NEXT:  bb:
339 ; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias dereferenceable_or_null(512) i8* @aligned_alloc(i64 -9223372036854775808, i64 512)
340 ; CHECK-NEXT:    ret i8* [[CALL]]
343   %and = and i64 -1, -9223372036854775808
344   %call = tail call noalias i8* @aligned_alloc(i64 %and, i64 512)
345   ret i8* %call
348 define noalias i8* @op_new_align() {
349 ; CHECK-LABEL: @op_new_align(
350 ; CHECK-NEXT:    [[CALL:%.*]] = tail call align 32 dereferenceable_or_null(32) i8* @_ZnajSt11align_val_t(i64 32, i64 32)
351 ; CHECK-NEXT:    ret i8* [[CALL]]
353   %call = tail call i8* @_ZnajSt11align_val_t(i64 32, i64 32)
354   ret i8* %call