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(i8* %ptr) {
11; CHECK-LABEL: Function: mustalias_overflow_in_32_bit_constants: 3 pointers, 0 call sites
12; CHECK-NEXT:    MustAlias: i8* %gep.1, i8* %ptr
13; CHECK-NEXT:    MustAlias:    i8* %gep.2, i8* %ptr
14; CHECK-NEXT:    MustAlias:    i8* %gep.1, i8* %gep.2
15;
16  load i8, i8* %ptr
17  %gep.1 = getelementptr i8, i8* %ptr, i64 4294967296
18  store i8 0, i8* %gep.1
19  %gep.2 = getelementptr i8, i8* %ptr, i64 0
20  store i8 1, i8* %gep.2
21  ret void
22}
23
24define void @mustalias_overflow_in_32_with_var_index([1 x i8]* %ptr, i64 %n) {
25; CHECK-LABEL: Function: mustalias_overflow_in_32_with_var_index
26; CHECK:       MustAlias: i8* %gep.1, i8* %gep.2
27;
28  load [1 x i8], [1 x i8]* %ptr
29  %gep.1 = getelementptr [1 x i8], [1 x i8]* %ptr, i64 %n, i64 4294967296
30  store i8 0, i8* %gep.1
31  %gep.2 = getelementptr [1 x i8], [1 x i8]* %ptr, i64 %n, i64 0
32  store i8 1, i8* %gep.2
33  ret void
34}
35
36define void @noalias_overflow_in_32_bit_constants(i8* %ptr) {
37; CHECK-LABEL: Function: noalias_overflow_in_32_bit_constants: 3 pointers, 0 call sites
38; CHECK-NEXT:    MustAlias: i8* %gep.1, i8* %ptr
39; CHECK-NEXT:    NoAlias:  i8* %gep.2, i8* %ptr
40; CHECK-NEXT:    NoAlias:  i8* %gep.1, i8* %gep.2
41;
42  load i8, i8* %ptr
43  %gep.1 = getelementptr i8, i8* %ptr, i64 4294967296
44  store i8 0, i8* %gep.1
45  %gep.2 = getelementptr i8, i8* %ptr, i64 1
46  store i8 1, i8* %gep.2
47  ret void
48}
49
50; The GEP indices get implicitly truncated to 32 bit, so multiples of 2^32
51; (=4294967296) will be 0.
52; See https://alive2.llvm.org/ce/z/HHjQgb.
53define void @mustalias_overflow_in_32_bit_add_mul_gep(i8* %ptr, i64 %i) {
54; CHECK-LABEL: Function: mustalias_overflow_in_32_bit_add_mul_gep: 3 pointers, 1 call sites
55; CHECK-NEXT:    MayAlias: i8* %gep.1, i8* %ptr
56; CHECK-NEXT:    MayAlias: i8* %gep.2, i8* %ptr
57; CHECK-NEXT:    MayAlias: i8* %gep.1, i8* %gep.2
58;
59  load i8, i8* %ptr
60  %s.1 = icmp sgt i64 %i, 0
61  call void @llvm.assume(i1 %s.1)
62
63  %mul = mul nuw nsw i64 %i, 4294967296
64  %add = add nuw nsw i64 %mul, %i
65  %gep.1 = getelementptr i8, i8* %ptr, i64 %add
66  store i8 0, i8* %gep.1
67  %gep.2 = getelementptr i8, i8* %ptr, i64 %i
68  store i8 1, i8* %gep.2
69  ret void
70}
71
72define void @mayalias_overflow_in_32_bit_non_zero(i8* %ptr, i64 %n) {
73; CHECK-LABEL: Function: mayalias_overflow_in_32_bit_non_zero
74; CHECK:    MayAlias: i8* %gep, i8* %ptr
75;
76  load i8, i8* %ptr
77  %c = icmp ne i64 %n, 0
78  call void @llvm.assume(i1 %c)
79  store i8 0, i8* %ptr
80  %gep = getelementptr i8, i8* %ptr, i64 %n
81  store i8 1, i8* %gep
82  ret void
83}
84
85define void @mayalias_overflow_in_32_bit_positive(i8* %ptr, i64 %n) {
86; CHECK-LABEL: Function: mayalias_overflow_in_32_bit_positive
87; CHECK:    NoAlias: i8* %gep.1, i8* %ptr
88; CHECK:    MayAlias: i8* %gep.2, i8* %ptr
89; CHECK:    MayAlias: i8* %gep.1, i8* %gep.2
90;
91  load i8, i8* %ptr
92  %c = icmp sgt i64 %n, 0
93  call void @llvm.assume(i1 %c)
94  %gep.1 = getelementptr i8, i8* %ptr, i64 -1
95  store i8 0, i8* %gep.1
96  %gep.2 = getelementptr i8, i8* %ptr, i64 %n
97  store i8 1, i8* %gep.2
98  ret void
99}
100