1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 2 3; getelementptr 4 5; CHECK-LABEL: gep_alloca_const_offset_1 6; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 7; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 8; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 9define void @gep_alloca_const_offset_1() { 10 %alloc = alloca <vscale x 4 x i32> 11 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0 12 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1 13 load <vscale x 4 x i32>, ptr %alloc 14 load <vscale x 4 x i32>, ptr %gep1 15 load <vscale x 4 x i32>, ptr %gep2 16 ret void 17} 18 19; CHECK-LABEL: gep_alloca_const_offset_2 20; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 21; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 22; TODO: AliasResult for gep1,gep2 can be improved as MustAlias 23; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 24define void @gep_alloca_const_offset_2() { 25 %alloc = alloca <vscale x 4 x i32> 26 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1 27 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1 28 load <vscale x 4 x i32>, ptr %alloc 29 load <vscale x 4 x i32>, ptr %gep1 30 load <vscale x 4 x i32>, ptr %gep2 31 ret void 32} 33 34; CHECK-LABEL: gep_alloca_const_offset_3 35; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 36; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep2 37; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep2 38define void @gep_alloca_const_offset_3() { 39 %alloc = alloca <vscale x 4 x i32> 40 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0 41 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 1 42 load <vscale x 4 x i32>, ptr %alloc 43 load <vscale x 4 x i32>, ptr %gep1 44 load i32, ptr %gep2 45 ret void 46} 47 48; CHECK-LABEL: gep_alloca_const_offset_4 49; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 50; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep2 51; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep2 52define void @gep_alloca_const_offset_4() { 53 %alloc = alloca <vscale x 4 x i32> 54 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0 55 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 0 56 load <vscale x 4 x i32>, ptr %alloc 57 load <vscale x 4 x i32>, ptr %gep1 58 load i32, ptr %gep2 59 ret void 60} 61 62; CHECK-LABEL: gep_alloca_symbolic_offset 63; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 64; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 65; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 66define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) { 67 %alloc = alloca <vscale x 4 x i32> 68 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx1 69 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx2 70 load <vscale x 4 x i32>, ptr %alloc 71 load <vscale x 4 x i32>, ptr %gep1 72 load <vscale x 4 x i32>, ptr %gep2 73 ret void 74} 75 76; CHECK-LABEL: gep_same_base_const_offset 77; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p 78; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p 79; TODO: AliasResult for gep1,gep2 can be improved as NoAlias 80; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2 81define void @gep_same_base_const_offset(ptr %p) { 82 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0 83 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 1 84 load <vscale x 4 x i32>, ptr %p 85 load i32, ptr %gep1 86 load i32, ptr %gep2 87 ret void 88} 89 90; CHECK-LABEL: gep_same_base_symbolic_offset 91; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p 92; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p 93; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 94define void @gep_same_base_symbolic_offset(ptr %p, i64 %idx1, i64 %idx2) { 95 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx1 96 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx2 97 load <vscale x 4 x i32>, ptr %p 98 load <vscale x 4 x i32>, ptr %gep1 99 load <vscale x 4 x i32>, ptr %gep2 100 ret void 101} 102 103; CHECK-LABEL: gep_different_base_const_offset 104; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1 105; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2 106; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2 107; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2 108; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1 109; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 110define void @gep_different_base_const_offset(ptr noalias %p1, ptr noalias %p2) { 111 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 1 112 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p2, i64 1 113 load <vscale x 4 x i32>, ptr %p1 114 load <vscale x 4 x i32>, ptr %p2 115 load <vscale x 4 x i32>, ptr %gep1 116 load <vscale x 4 x i32>, ptr %gep2 117 ret void 118} 119 120; getelementptr @llvm.vscale tests 121; CHECK-LABEL: gep_llvm_vscale_no_alias 122; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 123; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep3 124; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %gep3 125define void @gep_llvm_vscale_no_alias(ptr %p) { 126 %t1 = tail call i64 @llvm.vscale.i64() 127 %t2 = shl nuw nsw i64 %t1, 3 128 %gep1 = getelementptr i32, ptr %p, i64 %t2 129 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1 130 %gep3 = getelementptr <vscale x 4 x i32>, ptr %p, i64 2 131 load <vscale x 4 x i32>, ptr %gep1 132 load <vscale x 4 x i32>, ptr %gep2 133 load <vscale x 4 x i32>, ptr %gep3 134 ret void 135} 136 137declare i64 @llvm.vscale.i64() 138 139; CHECK-LABEL: gep_llvm_vscale_squared_may_alias 140; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 141define void @gep_llvm_vscale_squared_may_alias(ptr %p) { 142 %t1 = tail call i64 @llvm.vscale.i64() 143 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %t1 144 %gep2 = getelementptr i32, ptr %p, i64 1 145 load <vscale x 4 x i32>, ptr %gep1 146 load <vscale x 4 x i32>, ptr %gep2 147 ret void 148} 149 150; getelementptr + bitcast 151 152; CHECK-LABEL: gep_bitcast_1 153; CHECK-DAG: MustAlias: i32* %p, <vscale x 4 x i32>* %p 154; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p 155; CHECK-DAG: MayAlias: i32* %gep1, i32* %p 156; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p 157; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2 158; CHECK-DAG: NoAlias: i32* %gep2, i32* %p 159define void @gep_bitcast_1(ptr %p) { 160 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0 161 %gep2 = getelementptr i32, ptr %p, i64 4 162 load <vscale x 4 x i32>, ptr %p 163 load i32, ptr %gep1 164 load i32, ptr %gep2 165 load i32, ptr %p 166 ret void 167} 168 169; CHECK-LABEL: gep_bitcast_2 170; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p, <vscale x 4 x i32>* %p 171; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p 172; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x float>* %p 173; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x i32>* %p 174; CHECK-DAG: MayAlias: i32* %gep1, float* %gep2 175; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x float>* %p 176define void @gep_bitcast_2(ptr %p) { 177 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0 178 %gep2 = getelementptr <vscale x 4 x float>, ptr %p, i64 1, i64 0 179 load i32, ptr %gep1 180 load float, ptr %gep2 181 load <vscale x 4 x i32>, ptr %p 182 load <vscale x 4 x float>, ptr %p 183 ret void 184} 185 186; negative offset tests 187 188; CHECK-LABEL: gep_neg_notscalable 189; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16 190; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 191; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 192; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16 193; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16 194; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16 195; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p 196; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16 197; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16 198; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16 199define void @gep_neg_notscalable(ptr %p) vscale_range(1,16) { 200 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1 201 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 202 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1 203 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %m16, i64 1 204 load <4 x i32>, ptr %p 205 load <4 x i32>, ptr %vm16 206 load <4 x i32>, ptr %m16 207 load <4 x i32>, ptr %vm16m16 208 load <4 x i32>, ptr %m16pv16 209 ret void 210} 211 212; CHECK-LABEL: gep_neg_scalable 213; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 214; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 215; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 216; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16 217; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16 218; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16 219; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p 220; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16 221; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16 222; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16 223define void @gep_neg_scalable(ptr %p) vscale_range(1,16) { 224 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1 225 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 226 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1 227 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 1 228 load <vscale x 4 x i32>, ptr %p 229 load <vscale x 4 x i32>, ptr %vm16 230 load <vscale x 4 x i32>, ptr %m16 231 load <vscale x 4 x i32>, ptr %vm16m16 232 load <vscale x 4 x i32>, ptr %m16pv16 233 ret void 234} 235 236; CHECK-LABEL: gep_pos_notscalable 237; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16 238; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 239; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 240; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16 241; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16 242; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16 243; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p 244; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16 245; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16 246; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16 247define void @gep_pos_notscalable(ptr %p) vscale_range(1,16) { 248 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1 249 %m16 = getelementptr <4 x i32>, ptr %p, i64 1 250 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1 251 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1 252 load <4 x i32>, ptr %p 253 load <4 x i32>, ptr %vm16 254 load <4 x i32>, ptr %m16 255 load <4 x i32>, ptr %vm16m16 256 load <4 x i32>, ptr %m16pv16 257 ret void 258} 259 260; CHECK-LABEL: gep_pos_scalable 261; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 262; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 263; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 264; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16 265; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16 266; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16 267; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p 268; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16 269; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16 270; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16 271define void @gep_pos_scalable(ptr %p) vscale_range(1,16) { 272 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1 273 %m16 = getelementptr <4 x i32>, ptr %p, i64 1 274 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1 275 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1 276 load <vscale x 4 x i32>, ptr %p 277 load <vscale x 4 x i32>, ptr %vm16 278 load <vscale x 4 x i32>, ptr %m16 279 load <vscale x 4 x i32>, ptr %vm16m16 280 load <vscale x 4 x i32>, ptr %m16pv16 281 ret void 282} 283 284; CHECK-LABEL: v1v2types 285; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p 286; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 287; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16 288; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16 289; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16 290; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16 291; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 292; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p 293; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 294; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16 295; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p 296; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 297; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16 298; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 299; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16 300define void @v1v2types(ptr %p) vscale_range(1,16) { 301 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1 302 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 303 load <vscale x 4 x i32>, ptr %p 304 load <4 x i32>, ptr %p 305 load <vscale x 4 x i32>, ptr %vm16 306 load <4 x i32>, ptr %vm16 307 load <vscale x 4 x i32>, ptr %m16 308 load <4 x i32>, ptr %m16 309 ret void 310} 311 312; VScale intrinsic offset tests 313 314; CHECK-LABEL: vscale_neg_notscalable 315; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16 316; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 317; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 318; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16 319; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16 320; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16 321; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p 322; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16 323; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16 324; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16 325define void @vscale_neg_notscalable(ptr %p) { 326 %v = call i64 @llvm.vscale.i64() 327 %vp = mul nsw i64 %v, 16 328 %vm = mul nsw i64 %v, -16 329 %vm16 = getelementptr i8, ptr %p, i64 %vm 330 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 331 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1 332 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp 333 load <4 x i32>, ptr %p 334 load <4 x i32>, ptr %vm16 335 load <4 x i32>, ptr %m16 336 load <4 x i32>, ptr %vm16m16 337 load <4 x i32>, ptr %m16pv16 338 ret void 339} 340 341; CHECK-LABEL: vscale_neg_scalable 342; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 343; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 344; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 345; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16 346; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16 347; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16 348; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p 349; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16 350; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16 351; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16 352define void @vscale_neg_scalable(ptr %p) { 353 %v = call i64 @llvm.vscale.i64() 354 %vp = mul nsw i64 %v, 16 355 %vm = mul nsw i64 %v, -16 356 %vm16 = getelementptr i8, ptr %p, i64 %vm 357 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 358 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1 359 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp 360 load <vscale x 4 x i32>, ptr %p 361 load <vscale x 4 x i32>, ptr %vm16 362 load <vscale x 4 x i32>, ptr %m16 363 load <vscale x 4 x i32>, ptr %vm16m16 364 load <vscale x 4 x i32>, ptr %m16pv16 365 ret void 366} 367 368; CHECK-LABEL: vscale_pos_notscalable 369; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16 370; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 371; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 372; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16 373; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16 374; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16 375; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p 376; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16 377; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16 378; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16 379define void @vscale_pos_notscalable(ptr %p) { 380 %v = call i64 @llvm.vscale.i64() 381 %vp = mul nsw i64 %v, 16 382 %vm = mul nsw i64 %v, -16 383 %vm16 = getelementptr i8, ptr %p, i64 %vp 384 %m16 = getelementptr <4 x i32>, ptr %p, i64 1 385 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1 386 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm 387 load <4 x i32>, ptr %p 388 load <4 x i32>, ptr %vm16 389 load <4 x i32>, ptr %m16 390 load <4 x i32>, ptr %vm16m16 391 load <4 x i32>, ptr %m16pv16 392 ret void 393} 394 395; CHECK-LABEL: vscale_pos_scalable 396; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 397; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 398; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 399; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16 400; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16 401; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16 402; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p 403; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16 404; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16 405; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16 406define void @vscale_pos_scalable(ptr %p) { 407 %v = call i64 @llvm.vscale.i64() 408 %vp = mul nsw i64 %v, 16 409 %vm = mul nsw i64 %v, -16 410 %vm16 = getelementptr i8, ptr %p, i64 %vp 411 %m16 = getelementptr <4 x i32>, ptr %p, i64 1 412 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1 413 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm 414 load <vscale x 4 x i32>, ptr %p 415 load <vscale x 4 x i32>, ptr %vm16 416 load <vscale x 4 x i32>, ptr %m16 417 load <vscale x 4 x i32>, ptr %vm16m16 418 load <vscale x 4 x i32>, ptr %m16pv16 419 ret void 420} 421 422; CHECK-LABEL: vscale_v1v2types 423; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p 424; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 425; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16 426; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16 427; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16 428; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16 429; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p 430; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p 431; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16 432; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16 433; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p 434; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p 435; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16 436; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 437; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16 438; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vp16 439; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vp16 440; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vp16 441; CHECK-DAG: MayAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vp16 442; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vp16 443; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vp16 444define void @vscale_v1v2types(ptr %p) { 445 %v = call i64 @llvm.vscale.i64() 446 %vp = mul nsw i64 %v, 16 447 %vm = mul nsw i64 %v, -16 448 %vp16 = getelementptr i8, ptr %p, i64 %vp 449 %vm16 = getelementptr i8, ptr %p, i64 %vm 450 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1 451 load <vscale x 4 x i32>, ptr %p 452 load <4 x i32>, ptr %p 453 load <vscale x 4 x i32>, ptr %vm16 454 load <4 x i32>, ptr %vm16 455 load <vscale x 4 x i32>, ptr %m16 456 load <4 x i32>, ptr %m16 457 load <vscale x 4 x i32>, ptr %vp16 458 ret void 459} 460 461; CHECK-LABEL: vscale_negativescale 462; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16 463define void @vscale_negativescale(ptr %p) vscale_range(1,16) { 464 %v = call i64 @llvm.vscale.i64() 465 %vm = mul nsw i64 %v, -15 466 %vm16 = getelementptr i8, ptr %p, i64 %vm 467 load <vscale x 4 x i32>, ptr %vm16 468 load <vscale x 4 x i32>, ptr %p 469 ret void 470} 471 472; CHECK-LABEL: onevscale 473; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162 474; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b 475; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162 476define void @onevscale(ptr %p) vscale_range(1,16) { 477 %v1 = call i64 @llvm.vscale.i64() 478 %vp1 = mul nsw i64 %v1, 16 479 %vp2 = mul nsw i64 %v1, 16 480 %vp3 = mul nsw i64 %v1, 17 481 %vp161 = getelementptr i8, ptr %p, i64 %vp1 482 %vp162 = getelementptr i8, ptr %p, i64 %vp2 483 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3 484 load <vscale x 4 x i32>, ptr %vp161 485 load <vscale x 4 x i32>, ptr %vp162 486 load <vscale x 4 x i32>, ptr %vp161b 487 ret void 488} 489 490; CHECK-LABEL: twovscales 491; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162 492; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b 493; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162 494define void @twovscales(ptr %p) vscale_range(1,16) { 495 %v1 = call i64 @llvm.vscale.i64() 496 %v2 = call i64 @llvm.vscale.i64() 497 %vp1 = mul nsw i64 %v1, 16 498 %vp2 = mul nsw i64 %v2, 16 499 %vp3 = mul nsw i64 %v1, 17 500 %vp161 = getelementptr i8, ptr %p, i64 %vp1 501 %vp162 = getelementptr i8, ptr %p, i64 %vp2 502 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3 503 load <vscale x 4 x i32>, ptr %vp161 504 load <vscale x 4 x i32>, ptr %vp162 505 load <vscale x 4 x i32>, ptr %vp161b 506 ret void 507} 508 509; getelementptr recursion 510 511; CHECK-LABEL: gep_recursion_level_1 512; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p 513; CHECK-DAG: MayAlias: i32* %a, i32* %gep 514; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 515; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p 516; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p 517; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1 518define void @gep_recursion_level_1(ptr %a, ptr %p) { 519 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2 520 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1 521 load <vscale x 4 x i32>, ptr %p 522 load i32, ptr %a 523 load i32, ptr %gep 524 load i32, ptr %gep_rec_1 525 ret void 526} 527 528; CHECK-LABEL: gep_recursion_level_1_bitcast 529; CHECK-DAG: MustAlias: i32* %a, <vscale x 4 x i32>* %a 530; CHECK-DAG: MayAlias: i32* %a, i32* %gep 531; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 532; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep 533; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep_rec_1 534; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1 535define void @gep_recursion_level_1_bitcast(ptr %a) { 536 %gep = getelementptr <vscale x 4 x i32>, ptr %a, i64 1, i64 2 537 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1 538 load <vscale x 4 x i32>, ptr %a 539 load i32, ptr %a 540 load i32, ptr %gep 541 load i32, ptr %gep_rec_1 542 ret void 543} 544 545; CHECK-LABEL: gep_recursion_level_2 546; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p 547; CHECK-DAG: MayAlias: i32* %a, i32* %gep 548; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 549; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2 550; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p 551; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p 552; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p 553; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1 554; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2 555; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2 556define void @gep_recursion_level_2(ptr %a, ptr %p) { 557 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2 558 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1 559 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1 560 load <vscale x 4 x i32>, ptr %p 561 load i32, ptr %a 562 load i32, ptr %gep 563 load i32, ptr %gep_rec_1 564 load i32, ptr %gep_rec_2 565 ret void 566} 567 568; CHECK-LABEL: gep_recursion_max_lookup_depth_reached 569; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p 570; CHECK-DAG: MayAlias: i32* %a, i32* %gep 571; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 572; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2 573; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3 574; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4 575; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5 576; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6 577; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p 578; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p 579; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p 580; CHECK-DAG: MayAlias: i32* %gep_rec_3, <vscale x 4 x i32>* %p 581; CHECK-DAG: MayAlias: i32* %gep_rec_4, <vscale x 4 x i32>* %p 582; CHECK-DAG: MayAlias: i32* %gep_rec_5, <vscale x 4 x i32>* %p 583; CHECK-DAG: MayAlias: i32* %gep_rec_6, <vscale x 4 x i32>* %p 584; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1 585; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2 586; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_3 587; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_4 588; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_5 589; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_6 590; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2 591; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_3 592; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_4 593; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_5 594; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_6 595; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_3 596; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_4 597; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_5 598; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_6 599; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_4 600; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_5 601; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_6 602; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_5 603; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_6 604; CHECK-DAG: NoAlias: i32* %gep_rec_5, i32* %gep_rec_6 605; GEP max lookup depth was set to 6. 606define void @gep_recursion_max_lookup_depth_reached(ptr %a, ptr %p) { 607 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2 608 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1 609 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1 610 %gep_rec_3 = getelementptr i32, ptr %gep_rec_2, i64 1 611 %gep_rec_4 = getelementptr i32, ptr %gep_rec_3, i64 1 612 %gep_rec_5 = getelementptr i32, ptr %gep_rec_4, i64 1 613 %gep_rec_6 = getelementptr i32, ptr %gep_rec_5, i64 1 614 load <vscale x 4 x i32>, ptr %p 615 load i32, ptr %a 616 load i32, ptr %gep 617 load i32, ptr %gep_rec_1 618 load i32, ptr %gep_rec_2 619 load i32, ptr %gep_rec_3 620 load i32, ptr %gep_rec_4 621 load i32, ptr %gep_rec_5 622 load i32, ptr %gep_rec_6 623 ret void 624} 625 626; CHECK-LABEL: gep_2048 627; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p 628; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p 629; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255 630; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p 631; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256 632; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256 633; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p 634; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255 635; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256 636; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256 637define void @gep_2048(ptr %p) { 638 %off255 = getelementptr i8, ptr %p, i64 255 639 %noff255 = getelementptr i8, ptr %p, i64 -255 640 %off256 = getelementptr i8, ptr %p, i64 256 641 %noff256 = getelementptr i8, ptr %p, i64 -256 642 load <vscale x 4 x i32>, ptr %p 643 load <vscale x 4 x i32>, ptr %off255 644 load <vscale x 4 x i32>, ptr %noff255 645 load <vscale x 4 x i32>, ptr %off256 646 load <vscale x 4 x i32>, ptr %noff256 647 ret void 648} 649 650; CHECK-LABEL: gep_2048_vscalerange 651; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p 652; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p 653; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255 654; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p 655; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256 656; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256 657; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p 658; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255 659; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256 660; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256 661define void @gep_2048_vscalerange(ptr %p) vscale_range(1,16) { 662 %off255 = getelementptr i8, ptr %p, i64 255 663 %noff255 = getelementptr i8, ptr %p, i64 -255 664 %off256 = getelementptr i8, ptr %p, i64 256 665 %noff256 = getelementptr i8, ptr %p, i64 -256 666 load <vscale x 4 x i32>, ptr %p 667 load <vscale x 4 x i32>, ptr %off255 668 load <vscale x 4 x i32>, ptr %noff255 669 load <vscale x 4 x i32>, ptr %off256 670 load <vscale x 4 x i32>, ptr %noff256 671 ret void 672} 673