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