1; RUN: opt -mtriple=amdgcn-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s 2; RUN: opt -mtriple=r600-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s 3 4; CHECK-LABEL: Function: test 5; CHECK: NoAlias: i8 addrspace(5)* %p, i8 addrspace(1)* %p1 6 7define void @test(ptr addrspace(5) %p, ptr addrspace(1) %p1) { 8 load i8, ptr addrspace(5) %p 9 load i8, ptr addrspace(1) %p1 10 ret void 11} 12 13; CHECK-LABEL: Function: test_constant_vs_global 14; CHECK: MayAlias: i8 addrspace(4)* %p, i8 addrspace(1)* %p1 15 16define void @test_constant_vs_global(ptr addrspace(4) %p, ptr addrspace(1) %p1) { 17 load i8, ptr addrspace(4) %p 18 load i8, ptr addrspace(1) %p1 19 ret void 20} 21 22; CHECK: MayAlias: i8 addrspace(1)* %p, i8 addrspace(4)* %p1 23 24define void @test_global_vs_constant(ptr addrspace(1) %p, ptr addrspace(4) %p1) { 25 load i8, ptr addrspace(1) %p 26 load i8, ptr addrspace(4) %p1 27 ret void 28} 29 30; CHECK: MayAlias: i8 addrspace(6)* %p, i8 addrspace(1)* %p1 31 32define void @test_constant_32bit_vs_global(ptr addrspace(6) %p, ptr addrspace(1) %p1) { 33 load i8, ptr addrspace(6) %p 34 load i8, ptr addrspace(1) %p1 35 ret void 36} 37 38; CHECK: MayAlias: i8 addrspace(6)* %p, i8 addrspace(4)* %p1 39 40define void @test_constant_32bit_vs_constant(ptr addrspace(6) %p, ptr addrspace(4) %p1) { 41 load i8, ptr addrspace(6) %p 42 load i8, ptr addrspace(4) %p1 43 ret void 44} 45 46; CHECK: MayAlias: i8* %p, i8 addrspace(999)* %p0 47define void @test_0_999(ptr addrspace(0) %p, ptr addrspace(999) %p0) { 48 load i8, ptr addrspace(0) %p 49 load i8, ptr addrspace(999) %p0 50 ret void 51} 52 53; CHECK: MayAlias: i8 addrspace(999)* %p, i8* %p1 54define void @test_999_0(ptr addrspace(999) %p, ptr addrspace(0) %p1) { 55 load i8, ptr addrspace(999) %p 56 load i8, ptr addrspace(0) %p1 57 ret void 58} 59 60; CHECK: MayAlias: i8 addrspace(1)* %p, i8 addrspace(999)* %p1 61define void @test_1_999(ptr addrspace(1) %p, ptr addrspace(999) %p1) { 62 load i8, ptr addrspace(1) %p 63 load i8, ptr addrspace(999) %p1 64 ret void 65} 66 67; CHECK: MayAlias: i8 addrspace(999)* %p, i8 addrspace(1)* %p1 68define void @test_999_1(ptr addrspace(999) %p, ptr addrspace(1) %p1) { 69 load i8, ptr addrspace(999) %p 70 load i8, ptr addrspace(1) %p1 71 ret void 72} 73 74; CHECK: NoAlias: i8 addrspace(2)* %p, i8* %p1 75define void @test_region_vs_flat(ptr addrspace(2) %p, ptr addrspace(0) %p1) { 76 load i8, ptr addrspace(2) %p 77 load i8, ptr addrspace(0) %p1 78 ret void 79} 80 81; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(1)* %p1 82define void @test_region_vs_global(ptr addrspace(2) %p, ptr addrspace(1) %p1) { 83 load i8, ptr addrspace(2) %p 84 load i8, ptr addrspace(1) %p1 85 ret void 86} 87 88; CHECK: MayAlias: i8 addrspace(2)* %p, i8 addrspace(2)* %p1 89define void @test_region(ptr addrspace(2) %p, ptr addrspace(2) %p1) { 90 load i8, ptr addrspace(2) %p 91 load i8, ptr addrspace(2) %p1 92 ret void 93} 94 95; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(3)* %p1 96define void @test_region_vs_group(ptr addrspace(2) %p, ptr addrspace(3) %p1) { 97 load i8, ptr addrspace(2) %p 98 load i8, ptr addrspace(3) %p1 99 ret void 100} 101 102; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(4)* %p1 103define void @test_region_vs_constant(ptr addrspace(2) %p, ptr addrspace(4) %p1) { 104 load i8, ptr addrspace(2) %p 105 load i8, ptr addrspace(4) %p1 106 ret void 107} 108 109; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(5)* %p1 110define void @test_region_vs_private(ptr addrspace(2) %p, ptr addrspace(5) %p1) { 111 load i8, ptr addrspace(2) %p 112 load i8, ptr addrspace(5) %p1 113 ret void 114} 115 116; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(6)* %p1 117define void @test_region_vs_const32(ptr addrspace(2) %p, ptr addrspace(6) %p1) { 118 load i8, ptr addrspace(2) %p 119 load i8, ptr addrspace(6) %p1 120 ret void 121} 122 123; CHECK: MayAlias: i8 addrspace(7)* %p, i8* %p1 124define void @test_7_0(ptr addrspace(7) %p, ptr addrspace(0) %p1) { 125 load i8, ptr addrspace(7) %p 126 load i8, ptr addrspace(0) %p1 127 ret void 128} 129 130; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(1)* %p1 131define void @test_7_1(ptr addrspace(7) %p, ptr addrspace(1) %p1) { 132 load i8, ptr addrspace(7) %p 133 load i8, ptr addrspace(1) %p1 134 ret void 135} 136 137; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(2)* %p1 138define void @test_7_2(ptr addrspace(7) %p, ptr addrspace(2) %p1) { 139 load i8, ptr addrspace(7) %p 140 load i8, ptr addrspace(2) %p1 141 ret void 142} 143 144; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(3)* %p1 145define void @test_7_3(ptr addrspace(7) %p, ptr addrspace(3) %p1) { 146 load i8, ptr addrspace(7) %p 147 load i8, ptr addrspace(3) %p1 148 ret void 149} 150 151; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(4)* %p1 152define void @test_7_4(ptr addrspace(7) %p, ptr addrspace(4) %p1) { 153 load i8, ptr addrspace(7) %p 154 load i8, ptr addrspace(4) %p1 155 ret void 156} 157 158; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(5)* %p1 159define void @test_7_5(ptr addrspace(7) %p, ptr addrspace(5) %p1) { 160 load i8, ptr addrspace(7) %p 161 load i8, ptr addrspace(5) %p1 162 ret void 163} 164 165; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(6)* %p1 166define void @test_7_6(ptr addrspace(7) %p, ptr addrspace(6) %p1) { 167 load i8, ptr addrspace(7) %p 168 load i8, ptr addrspace(6) %p1 169 ret void 170} 171 172; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(7)* %p1 173define void @test_7_7(ptr addrspace(7) %p, ptr addrspace(7) %p1) { 174 load i8, ptr addrspace(7) %p 175 load i8, ptr addrspace(7) %p1 176 ret void 177} 178 179@cst = internal addrspace(4) global ptr undef, align 4 180 181; CHECK-LABEL: Function: test_8_0 182; CHECK-DAG: NoAlias: i8 addrspace(3)* %p, i8* %p1 183; CHECK-DAG: NoAlias: i8 addrspace(3)* %p, ptr addrspace(4)* @cst 184; CHECK-DAG: MayAlias: i8* %p1, ptr addrspace(4)* @cst 185define void @test_8_0(ptr addrspace(3) %p) { 186 %p1 = load ptr, ptr addrspace(4) @cst 187 load i8, ptr addrspace(3) %p 188 load i8, ptr %p1 189 ret void 190} 191 192; CHECK-LABEL: Function: test_8_1 193; CHECK-DAG: NoAlias: i8 addrspace(5)* %p, i8* %p1 194; CHECK-DAG: NoAlias: i8 addrspace(5)* %p, ptr addrspace(4)* @cst 195; CHECK-DAG: MayAlias: i8* %p1, ptr addrspace(4)* @cst 196define void @test_8_1(ptr addrspace(5) %p) { 197 %p1 = load ptr, ptr addrspace(4) @cst 198 load i8, ptr addrspace(5) %p 199 load i8, ptr %p1 200 ret void 201} 202 203; CHECK-LABEL: Function: test_8_2 204; CHECK: NoAlias: i8* %p, i8 addrspace(5)* %p1 205define amdgpu_kernel void @test_8_2(ptr %p) { 206 %p1 = alloca i8, align 1, addrspace(5) 207 load i8, ptr %p 208 load i8, ptr addrspace(5) %p1 209 ret void 210} 211 212; CHECK-LABEL: Function: test_8_3 213; CHECK: MayAlias: i8* %p, i8 addrspace(5)* %p1 214; TODO: So far, %p1 may still alias to %p. As it's not captured at all, it 215; should be NoAlias. 216define void @test_8_3(ptr %p) { 217 %p1 = alloca i8, align 1, addrspace(5) 218 load i8, ptr %p 219 load i8, ptr addrspace(5) %p1 220 ret void 221} 222 223@shm = internal addrspace(3) global [2 x i8] undef, align 4 224 225; CHECK-LABEL: Function: test_8_4 226; CHECK: NoAlias: i8* %p, i8 addrspace(3)* %p1 227; CHECK: NoAlias: i8* %p, i8 addrspace(3)* @shm 228; CHECK: MayAlias: i8 addrspace(3)* %p1, i8 addrspace(3)* @shm 229define amdgpu_kernel void @test_8_4(ptr %p) { 230 %p1 = getelementptr [2 x i8], ptr addrspace(3) @shm, i32 0, i32 1 231 load i8, ptr %p 232 load i8, ptr addrspace(3) %p1 233 load i8, ptr addrspace(3) @shm 234 ret void 235} 236 237; CHECK-LABEL: Function: test_8_5 238; CHECK: MayAlias: i8* %p, i8 addrspace(3)* %p1 239; CHECK: MayAlias: i8* %p, i8 addrspace(3)* @shm 240; CHECK: MayAlias: i8 addrspace(3)* %p1, i8 addrspace(3)* @shm 241 242; TODO: So far, @shm may still alias to %p. As it's not captured at all, it 243; should be NoAlias. 244define void @test_8_5(ptr %p) { 245 %p1 = getelementptr [2 x i8], ptr addrspace(3) @shm, i32 0, i32 1 246 load i8, ptr %p 247 load i8, ptr addrspace(3) %p1 248 load i8, ptr addrspace(3) @shm 249 ret void 250} 251 252; CHECK: MayAlias: i8 addrspace(9)* %p, i8* %p1 253define void @test_9_0(ptr addrspace(9) %p, ptr addrspace(0) %p1) { 254 load i8, ptr addrspace(9) %p 255 load i8, ptr addrspace(0) %p1 256 ret void 257} 258 259; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(1)* %p1 260define void @test_9_1(ptr addrspace(9) %p, ptr addrspace(1) %p1) { 261 load i8, ptr addrspace(9) %p 262 load i8, ptr addrspace(1) %p1 263 ret void 264} 265 266; CHECK: NoAlias: i8 addrspace(9)* %p, i8 addrspace(2)* %p1 267define void @test_9_2(ptr addrspace(9) %p, ptr addrspace(2) %p1) { 268 load i8, ptr addrspace(9) %p 269 load i8, ptr addrspace(2) %p1 270 ret void 271} 272 273; CHECK: NoAlias: i8 addrspace(9)* %p, i8 addrspace(3)* %p1 274define void @test_9_3(ptr addrspace(9) %p, ptr addrspace(3) %p1) { 275 load i8, ptr addrspace(9) %p 276 load i8, ptr addrspace(3) %p1 277 ret void 278} 279 280; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(4)* %p1 281define void @test_9_4(ptr addrspace(9) %p, ptr addrspace(4) %p1) { 282 load i8, ptr addrspace(9) %p 283 load i8, ptr addrspace(4) %p1 284 ret void 285} 286 287; CHECK: NoAlias: i8 addrspace(9)* %p, i8 addrspace(5)* %p1 288define void @test_9_5(ptr addrspace(9) %p, ptr addrspace(5) %p1) { 289 load i8, ptr addrspace(9) %p 290 load i8, ptr addrspace(5) %p1 291 ret void 292} 293 294; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(6)* %p1 295define void @test_9_6(ptr addrspace(9) %p, ptr addrspace(6) %p1) { 296 load i8, ptr addrspace(9) %p 297 load i8, ptr addrspace(6) %p1 298 ret void 299} 300 301; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(7)* %p1 302define void @test_9_7(ptr addrspace(9) %p, ptr addrspace(7) %p1) { 303 load i8, ptr addrspace(9) %p 304 load i8, ptr addrspace(7) %p1 305 ret void 306} 307 308; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(8)* %p1 309define void @test_9_8(ptr addrspace(9) %p, ptr addrspace(8) %p1) { 310 load i8, ptr addrspace(9) %p 311 load i8, ptr addrspace(8) %p1 312 ret void 313} 314 315; CHECK: MayAlias: i8 addrspace(9)* %p, i8 addrspace(9)* %p1 316define void @test_9_9(ptr addrspace(9) %p, ptr addrspace(9) %p1) { 317 load i8, ptr addrspace(9) %p 318 load i8, ptr addrspace(9) %p1 319 ret void 320} 321 322; CHECK-LABEL: Function: test_kernel_arg_local_ptr 323; CHECK: MayAlias: i32 addrspace(3)* %arg, i32 addrspace(3)* %arg1 324; CHECK: MayAlias: i32 addrspace(3)* %arg, i32* %arg2 325; CHECK: MayAlias: i32 addrspace(3)* %arg1, i32* %arg2 326define amdgpu_kernel void @test_kernel_arg_local_ptr(ptr addrspace(3) %arg) { 327entry: 328 %load1 = load i32, ptr addrspace(3) %arg, align 4 329 %arg.plus.1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 1 330 %arg1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg.plus.1, i64 -1 331 %load2 = load i32, ptr addrspace(3) %arg1, align 4 332 %arg.plus.4 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 4 333 %acast = addrspacecast ptr addrspace(3) %arg.plus.4 to ptr 334 %arg2 = getelementptr inbounds i8, ptr %acast, i64 -4 335 %load3 = load i32, ptr %arg2, align 4 336 ret void 337} 338