1; RUN: opt -basic-aa -print-alias-sets -S -o - < %s 2>&1 | FileCheck %s 2 3@s = global i8 1, align 1 4@d = global i8 2, align 1 5 6 7; CHECK: Alias sets for function 'test_known_size': 8; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 9; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %d, LocationSize::precise(1)) 10; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Pointers: (i8* %s, LocationSize::precise(1)) 11define void @test_known_size(i8* noalias %s, i8* noalias %d) { 12entry: 13 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false) 14 ret void 15} 16 17; CHECK: Alias sets for function 'test_unknown_size': 18; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 19; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %d, unknown after) 20; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Pointers: (i8* %s, unknown after) 21define void @test_unknown_size(i8* noalias %s, i8* noalias %d, i64 %len) { 22entry: 23 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 %len, i1 false) 24 ret void 25} 26 27 28; CHECK: Alias sets for function 'test1': 29; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 30; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 31; CHECK-NOT: 1 Unknown instructions 32; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 33; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 34define void @test1(i8* %s, i8* %d) { 35entry: 36 %a = alloca i8, align 1 37 %b = alloca i8, align 1 38 store i8 1, i8* %a, align 1 39 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false) 40 store i8 1, i8* %b, align 1 41 ret void 42} 43 44; CHECK: Alias sets for function 'test1_atomic': 45; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 46; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 47; CHECK-NOT: 1 Unknown instructions 48; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 49; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 50define void @test1_atomic(i8* %s, i8* %d) { 51entry: 52 %a = alloca i8, align 1 53 %b = alloca i8, align 1 54 store atomic i8 1, i8* %a unordered, align 1 55 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %d, i8* align 1 %s, i64 1, i32 1) 56 store atomic i8 1, i8* %b unordered, align 1 57 ret void 58} 59 60; CHECK: Alias sets for function 'test2': 61; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 62; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 63; CHECK-NOT: 1 Unknown instructions 64; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 65; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 66define void @test2(i8* %s, i8* %d) { 67entry: 68 %a = alloca i8, align 1 69 %b = alloca i8, align 1 70 store i8 1, i8* %a, align 1 71 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 true) 72 store i8 1, i8* %b, align 1 73 ret void 74} 75 76; CHECK: Alias sets for function 'test3': 77; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 78; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 79; CHECK-NOT: 1 Unknown instructions 80; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 81; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 82define void @test3(i8* %s, i8* %d) { 83entry: 84 %a = alloca i8, align 1 85 %b = alloca i8, align 1 86 store i8 1, i8* %a, align 1 87 call void @llvm.memmove.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false) 88 store i8 1, i8* %b, align 1 89 ret void 90} 91 92; CHECK: Alias sets for function 'test3_atomic': 93; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 94; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 95; CHECK-NOT: 1 Unknown instructions 96; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 97; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 98define void @test3_atomic(i8* %s, i8* %d) { 99entry: 100 %a = alloca i8, align 1 101 %b = alloca i8, align 1 102 store atomic i8 1, i8* %a unordered, align 1 103 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %d, i8* align 1 %s, i64 1, i32 1) 104 store atomic i8 1, i8* %b unordered, align 1 105 ret void 106} 107 108; CHECK: Alias sets for function 'test4': 109; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values. 110; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1)) 111; CHECK-NOT: 1 Unknown instructions 112; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1)) 113; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 114define void @test4(i8* %s, i8* %d) { 115entry: 116 %a = alloca i8, align 1 117 %b = alloca i8, align 1 118 store i8 1, i8* %a, align 1 119 call void @llvm.memmove.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 true) 120 store i8 1, i8* %b, align 1 121 ret void 122} 123 124; CHECK: Alias sets for function 'test5': 125; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 126; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 127; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 128define void @test5() { 129entry: 130 %a = alloca i8, align 1 131 %b = alloca i8, align 1 132 store i8 1, i8* %a, align 1 133 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false) 134 store i8 1, i8* %b, align 1 135 ret void 136} 137 138; CHECK: Alias sets for function 'test5_atomic': 139; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 140; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 141; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 142define void @test5_atomic() { 143entry: 144 %a = alloca i8, align 1 145 %b = alloca i8, align 1 146 store atomic i8 1, i8* %a unordered, align 1 147 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1) 148 store atomic i8 1, i8* %b unordered, align 1 149 ret void 150} 151 152; CHECK: Alias sets for function 'test6': 153; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 154; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 155; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 156define void @test6() { 157entry: 158 %a = alloca i8, align 1 159 %b = alloca i8, align 1 160 store i8 1, i8* %a, align 1 161 call void @llvm.memmove.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false) 162 store i8 1, i8* %b, align 1 163 ret void 164} 165 166; CHECK: Alias sets for function 'test6_atomic': 167; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 168; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 169; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1)) 170define void @test6_atomic() { 171entry: 172 %a = alloca i8, align 1 173 %b = alloca i8, align 1 174 store atomic i8 1, i8* %a unordered, align 1 175 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1) 176 store atomic i8 1, i8* %b unordered, align 1 177 ret void 178} 179 180; CHECK: Alias sets for function 'test7': 181; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 182; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 183; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %b, LocationSize::precise(1)) 184define void @test7() { 185entry: 186 %a = alloca i8, align 1 187 %b = alloca i8, align 1 188 store i8 1, i8* %a, align 1 189 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false) 190 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 1, i1 false) 191 store i8 1, i8* %b, align 1 192 ret void 193} 194 195; CHECK: Alias sets for function 'test7_atomic': 196; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values. 197; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1)) 198; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %b, LocationSize::precise(1)) 199define void @test7_atomic() { 200entry: 201 %a = alloca i8, align 1 202 %b = alloca i8, align 1 203 store atomic i8 1, i8* %a unordered, align 1 204 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1) 205 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %a, i8* align 1 %b, i64 1, i32 1) 206 store atomic i8 1, i8* %b unordered, align 1 207 ret void 208} 209 210declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) 211declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32) 212declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1) 213declare void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32) 214