xref: /llvm-project/llvm/test/Analysis/BasicAA/gep-implicit-trunc-32-bit-pointers.ll (revision 303c308e452c703c3d47940383ded3b2d3eefd56)
1; RUN: opt -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output %s 2>&1 | FileCheck %s
2
3target datalayout = "p:32:32:32"
4
5; Test cases with i64 bit GEP indices that will get truncated implicitly to 32
6; bit due to the datalayout.
7
8declare void @llvm.assume(i1)
9
10define void @mustalias_overflow_in_32_bit_constants(ptr %ptr) {
11; CHECK-LABEL: Function: mustalias_overflow_in_32_bit_constants: 2 pointers, 0 call sites
12; CHECK-NEXT:    MustAlias: i8* %gep.1, i8* %ptr
13;
14  load i8, ptr %ptr
15  %gep.1 = getelementptr i8, ptr %ptr, i64 4294967296
16  store i8 0, ptr %gep.1
17  ret void
18}
19
20define void @mustalias_overflow_in_32_with_var_index(ptr %ptr, i64 %n) {
21; CHECK-LABEL: Function: mustalias_overflow_in_32_with_var_index
22; CHECK:       MustAlias: i8* %gep.1, i8* %gep.2
23;
24  load [1 x i8], ptr %ptr
25  %gep.1 = getelementptr [1 x i8], ptr %ptr, i64 %n, i64 4294967296
26  store i8 0, ptr %gep.1
27  %gep.2 = getelementptr [1 x i8], ptr %ptr, i64 %n, i64 0
28  store i8 1, ptr %gep.2
29  ret void
30}
31
32define void @noalias_overflow_in_32_bit_constants(ptr %ptr) {
33; CHECK-LABEL: Function: noalias_overflow_in_32_bit_constants: 3 pointers, 0 call sites
34; CHECK-NEXT:    MustAlias: i8* %gep.1, i8* %ptr
35; CHECK-NEXT:    NoAlias:  i8* %gep.2, i8* %ptr
36; CHECK-NEXT:    NoAlias:  i8* %gep.1, i8* %gep.2
37;
38  load i8, ptr %ptr
39  %gep.1 = getelementptr i8, ptr %ptr, i64 4294967296
40  store i8 0, ptr %gep.1
41  %gep.2 = getelementptr i8, ptr %ptr, i64 1
42  store i8 1, ptr %gep.2
43  ret void
44}
45
46; The GEP indices get implicitly truncated to 32 bit, so multiples of 2^32
47; (=4294967296) will be 0.
48; See https://alive2.llvm.org/ce/z/HHjQgb.
49define void @mustalias_overflow_in_32_bit_add_mul_gep(ptr %ptr, i64 %i) {
50; CHECK-LABEL: Function: mustalias_overflow_in_32_bit_add_mul_gep: 3 pointers, 1 call sites
51; CHECK-NEXT:    MayAlias: i8* %gep.1, i8* %ptr
52; CHECK-NEXT:    MayAlias: i8* %gep.2, i8* %ptr
53; CHECK-NEXT:    MayAlias: i8* %gep.1, i8* %gep.2
54;
55  load i8, ptr %ptr
56  %s.1 = icmp sgt i64 %i, 0
57  call void @llvm.assume(i1 %s.1)
58
59  %mul = mul nuw nsw i64 %i, 4294967296
60  %add = add nuw nsw i64 %mul, %i
61  %gep.1 = getelementptr i8, ptr %ptr, i64 %add
62  store i8 0, ptr %gep.1
63  %gep.2 = getelementptr i8, ptr %ptr, i64 %i
64  store i8 1, ptr %gep.2
65  ret void
66}
67
68define void @mayalias_overflow_in_32_bit_non_zero(ptr %ptr, i64 %n) {
69; CHECK-LABEL: Function: mayalias_overflow_in_32_bit_non_zero
70; CHECK:    MayAlias: i8* %gep, i8* %ptr
71;
72  load i8, ptr %ptr
73  %c = icmp ne i64 %n, 0
74  call void @llvm.assume(i1 %c)
75  store i8 0, ptr %ptr
76  %gep = getelementptr i8, ptr %ptr, i64 %n
77  store i8 1, ptr %gep
78  ret void
79}
80
81define void @mayalias_overflow_in_32_bit_positive(ptr %ptr, i64 %n) {
82; CHECK-LABEL: Function: mayalias_overflow_in_32_bit_positive
83; CHECK:    NoAlias: i8* %gep.1, i8* %ptr
84; CHECK:    MayAlias: i8* %gep.2, i8* %ptr
85; CHECK:    MayAlias: i8* %gep.1, i8* %gep.2
86;
87  load i8, ptr %ptr
88  %c = icmp sgt i64 %n, 0
89  call void @llvm.assume(i1 %c)
90  %gep.1 = getelementptr i8, ptr %ptr, i64 -1
91  store i8 0, ptr %gep.1
92  %gep.2 = getelementptr i8, ptr %ptr, i64 %n
93  store i8 1, ptr %gep.2
94  ret void
95}
96