673 lines · plain
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s2 3; getelementptr4 5; CHECK-LABEL: gep_alloca_const_offset_16; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep17; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep28; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep29define 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 012 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 113 load <vscale x 4 x i32>, ptr %alloc14 load <vscale x 4 x i32>, ptr %gep115 load <vscale x 4 x i32>, ptr %gep216 ret void17}18 19; CHECK-LABEL: gep_alloca_const_offset_220; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep121; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep222; TODO: AliasResult for gep1,gep2 can be improved as MustAlias23; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep224define 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 127 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 128 load <vscale x 4 x i32>, ptr %alloc29 load <vscale x 4 x i32>, ptr %gep130 load <vscale x 4 x i32>, ptr %gep231 ret void32}33 34; CHECK-LABEL: gep_alloca_const_offset_335; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep136; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep237; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep238define 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 041 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 142 load <vscale x 4 x i32>, ptr %alloc43 load <vscale x 4 x i32>, ptr %gep144 load i32, ptr %gep245 ret void46}47 48; CHECK-LABEL: gep_alloca_const_offset_449; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep150; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep251; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep252define 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 055 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 056 load <vscale x 4 x i32>, ptr %alloc57 load <vscale x 4 x i32>, ptr %gep158 load i32, ptr %gep259 ret void60}61 62; CHECK-LABEL: gep_alloca_symbolic_offset63; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep164; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep265; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep266define 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 %idx169 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx270 load <vscale x 4 x i32>, ptr %alloc71 load <vscale x 4 x i32>, ptr %gep172 load <vscale x 4 x i32>, ptr %gep273 ret void74}75 76; CHECK-LABEL: gep_same_base_const_offset77; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p78; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p79; TODO: AliasResult for gep1,gep2 can be improved as NoAlias80; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep281define void @gep_same_base_const_offset(ptr %p) {82 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 083 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 184 load <vscale x 4 x i32>, ptr %p85 load i32, ptr %gep186 load i32, ptr %gep287 ret void88}89 90; CHECK-LABEL: gep_same_base_symbolic_offset91; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p92; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p93; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep294define void @gep_same_base_symbolic_offset(ptr %p, i64 %idx1, i64 %idx2) {95 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx196 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx297 load <vscale x 4 x i32>, ptr %p98 load <vscale x 4 x i32>, ptr %gep199 load <vscale x 4 x i32>, ptr %gep2100 ret void101}102 103; CHECK-LABEL: gep_different_base_const_offset104; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1105; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2106; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2107; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2108; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1109; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2110define void @gep_different_base_const_offset(ptr noalias %p1, ptr noalias %p2) {111 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 1112 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p2, i64 1113 load <vscale x 4 x i32>, ptr %p1114 load <vscale x 4 x i32>, ptr %p2115 load <vscale x 4 x i32>, ptr %gep1116 load <vscale x 4 x i32>, ptr %gep2117 ret void118}119 120; getelementptr @llvm.vscale tests121; CHECK-LABEL: gep_llvm_vscale_no_alias122; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2123; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep3124; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %gep3125define void @gep_llvm_vscale_no_alias(ptr %p) {126 %t1 = tail call i64 @llvm.vscale.i64()127 %t2 = shl nuw nsw i64 %t1, 3128 %gep1 = getelementptr i32, ptr %p, i64 %t2129 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1130 %gep3 = getelementptr <vscale x 4 x i32>, ptr %p, i64 2131 load <vscale x 4 x i32>, ptr %gep1132 load <vscale x 4 x i32>, ptr %gep2133 load <vscale x 4 x i32>, ptr %gep3134 ret void135}136 137declare i64 @llvm.vscale.i64()138 139; CHECK-LABEL: gep_llvm_vscale_squared_may_alias140; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2141define 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 %t1144 %gep2 = getelementptr i32, ptr %p, i64 1145 load <vscale x 4 x i32>, ptr %gep1146 load <vscale x 4 x i32>, ptr %gep2147 ret void148}149 150; getelementptr + bitcast151 152; CHECK-LABEL: gep_bitcast_1153; CHECK-DAG: MustAlias: i32* %p, <vscale x 4 x i32>* %p154; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p155; CHECK-DAG: MayAlias: i32* %gep1, i32* %p156; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p157; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2158; CHECK-DAG: NoAlias: i32* %gep2, i32* %p159define void @gep_bitcast_1(ptr %p) {160 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0161 %gep2 = getelementptr i32, ptr %p, i64 4162 load <vscale x 4 x i32>, ptr %p163 load i32, ptr %gep1164 load i32, ptr %gep2165 load i32, ptr %p166 ret void167}168 169; CHECK-LABEL: gep_bitcast_2170; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p, <vscale x 4 x i32>* %p171; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p172; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x float>* %p173; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x i32>* %p174; CHECK-DAG: MayAlias: i32* %gep1, float* %gep2175; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x float>* %p176define void @gep_bitcast_2(ptr %p) {177 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0178 %gep2 = getelementptr <vscale x 4 x float>, ptr %p, i64 1, i64 0179 load i32, ptr %gep1180 load float, ptr %gep2181 load <vscale x 4 x i32>, ptr %p182 load <vscale x 4 x float>, ptr %p183 ret void184}185 186; negative offset tests187 188; CHECK-LABEL: gep_neg_notscalable189; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16190; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p191; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16192; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16193; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16194; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16195; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p196; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16197; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16198; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16199define void @gep_neg_notscalable(ptr %p) vscale_range(1,16) {200 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1201 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1202 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1203 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %m16, i64 1204 load <4 x i32>, ptr %p205 load <4 x i32>, ptr %vm16206 load <4 x i32>, ptr %m16207 load <4 x i32>, ptr %vm16m16208 load <4 x i32>, ptr %m16pv16209 ret void210}211 212; CHECK-LABEL: gep_neg_scalable213; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16214; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p215; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16216; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16217; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16218; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16219; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p220; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16221; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16222; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16223define void @gep_neg_scalable(ptr %p) vscale_range(1,16) {224 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1225 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1226 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1227 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 1228 load <vscale x 4 x i32>, ptr %p229 load <vscale x 4 x i32>, ptr %vm16230 load <vscale x 4 x i32>, ptr %m16231 load <vscale x 4 x i32>, ptr %vm16m16232 load <vscale x 4 x i32>, ptr %m16pv16233 ret void234}235 236; CHECK-LABEL: gep_pos_notscalable237; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16238; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p239; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16240; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16241; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16242; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16243; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p244; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16245; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16246; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16247define void @gep_pos_notscalable(ptr %p) vscale_range(1,16) {248 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1249 %m16 = getelementptr <4 x i32>, ptr %p, i64 1250 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1251 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1252 load <4 x i32>, ptr %p253 load <4 x i32>, ptr %vm16254 load <4 x i32>, ptr %m16255 load <4 x i32>, ptr %vm16m16256 load <4 x i32>, ptr %m16pv16257 ret void258}259 260; CHECK-LABEL: gep_pos_scalable261; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16262; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p263; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16264; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16265; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16266; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16267; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p268; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16269; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16270; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16271define void @gep_pos_scalable(ptr %p) vscale_range(1,16) {272 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1273 %m16 = getelementptr <4 x i32>, ptr %p, i64 1274 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1275 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1276 load <vscale x 4 x i32>, ptr %p277 load <vscale x 4 x i32>, ptr %vm16278 load <vscale x 4 x i32>, ptr %m16279 load <vscale x 4 x i32>, ptr %vm16m16280 load <vscale x 4 x i32>, ptr %m16pv16281 ret void282}283 284; CHECK-LABEL: v1v2types285; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p286; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16287; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16288; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16289; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16290; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16291; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p292; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p293; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16294; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16295; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p296; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p297; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16298; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16299; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16300define void @v1v2types(ptr %p) vscale_range(1,16) {301 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1302 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1303 load <vscale x 4 x i32>, ptr %p304 load <4 x i32>, ptr %p305 load <vscale x 4 x i32>, ptr %vm16306 load <4 x i32>, ptr %vm16307 load <vscale x 4 x i32>, ptr %m16308 load <4 x i32>, ptr %m16309 ret void310}311 312; VScale intrinsic offset tests313 314; CHECK-LABEL: vscale_neg_notscalable315; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16316; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p317; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16318; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16319; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16320; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16321; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p322; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16323; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16324; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16325define void @vscale_neg_notscalable(ptr %p) {326 %v = call i64 @llvm.vscale.i64()327 %vp = mul nsw i64 %v, 16328 %vm = mul nsw i64 %v, -16329 %vm16 = getelementptr i8, ptr %p, i64 %vm330 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1331 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1332 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp333 load <4 x i32>, ptr %p334 load <4 x i32>, ptr %vm16335 load <4 x i32>, ptr %m16336 load <4 x i32>, ptr %vm16m16337 load <4 x i32>, ptr %m16pv16338 ret void339}340 341; CHECK-LABEL: vscale_neg_scalable342; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16343; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p344; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16345; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16346; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16347; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16348; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p349; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16350; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16351; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16352define void @vscale_neg_scalable(ptr %p) {353 %v = call i64 @llvm.vscale.i64()354 %vp = mul nsw i64 %v, 16355 %vm = mul nsw i64 %v, -16356 %vm16 = getelementptr i8, ptr %p, i64 %vm357 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1358 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1359 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp360 load <vscale x 4 x i32>, ptr %p361 load <vscale x 4 x i32>, ptr %vm16362 load <vscale x 4 x i32>, ptr %m16363 load <vscale x 4 x i32>, ptr %vm16m16364 load <vscale x 4 x i32>, ptr %m16pv16365 ret void366}367 368; CHECK-LABEL: vscale_pos_notscalable369; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16370; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p371; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16372; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16373; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16374; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16375; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p376; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16377; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16378; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16379define void @vscale_pos_notscalable(ptr %p) {380 %v = call i64 @llvm.vscale.i64()381 %vp = mul nsw i64 %v, 16382 %vm = mul nsw i64 %v, -16383 %vm16 = getelementptr i8, ptr %p, i64 %vp384 %m16 = getelementptr <4 x i32>, ptr %p, i64 1385 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1386 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm387 load <4 x i32>, ptr %p388 load <4 x i32>, ptr %vm16389 load <4 x i32>, ptr %m16390 load <4 x i32>, ptr %vm16m16391 load <4 x i32>, ptr %m16pv16392 ret void393}394 395; CHECK-LABEL: vscale_pos_scalable396; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16397; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p398; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16399; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16400; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16401; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16402; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p403; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16404; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16405; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16406define void @vscale_pos_scalable(ptr %p) {407 %v = call i64 @llvm.vscale.i64()408 %vp = mul nsw i64 %v, 16409 %vm = mul nsw i64 %v, -16410 %vm16 = getelementptr i8, ptr %p, i64 %vp411 %m16 = getelementptr <4 x i32>, ptr %p, i64 1412 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1413 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm414 load <vscale x 4 x i32>, ptr %p415 load <vscale x 4 x i32>, ptr %vm16416 load <vscale x 4 x i32>, ptr %m16417 load <vscale x 4 x i32>, ptr %vm16m16418 load <vscale x 4 x i32>, ptr %m16pv16419 ret void420}421 422; CHECK-LABEL: vscale_v1v2types423; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p424; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16425; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16426; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16427; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16428; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16429; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p430; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p431; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16432; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16433; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p434; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p435; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16436; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16437; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16438; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vp16439; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vp16440; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vp16441; CHECK-DAG: MayAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vp16442; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vp16443; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vp16444define void @vscale_v1v2types(ptr %p) {445 %v = call i64 @llvm.vscale.i64()446 %vp = mul nsw i64 %v, 16447 %vm = mul nsw i64 %v, -16448 %vp16 = getelementptr i8, ptr %p, i64 %vp449 %vm16 = getelementptr i8, ptr %p, i64 %vm450 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1451 load <vscale x 4 x i32>, ptr %p452 load <4 x i32>, ptr %p453 load <vscale x 4 x i32>, ptr %vm16454 load <4 x i32>, ptr %vm16455 load <vscale x 4 x i32>, ptr %m16456 load <4 x i32>, ptr %m16457 load <vscale x 4 x i32>, ptr %vp16458 ret void459}460 461; CHECK-LABEL: vscale_negativescale462; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16463define void @vscale_negativescale(ptr %p) vscale_range(1,16) {464 %v = call i64 @llvm.vscale.i64()465 %vm = mul nsw i64 %v, -15466 %vm16 = getelementptr i8, ptr %p, i64 %vm467 load <vscale x 4 x i32>, ptr %vm16468 load <vscale x 4 x i32>, ptr %p469 ret void470}471 472; CHECK-LABEL: onevscale473; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162474; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b475; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162476define void @onevscale(ptr %p) vscale_range(1,16) {477 %v1 = call i64 @llvm.vscale.i64()478 %vp1 = mul nsw i64 %v1, 16479 %vp2 = mul nsw i64 %v1, 16480 %vp3 = mul nsw i64 %v1, 17481 %vp161 = getelementptr i8, ptr %p, i64 %vp1482 %vp162 = getelementptr i8, ptr %p, i64 %vp2483 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3484 load <vscale x 4 x i32>, ptr %vp161485 load <vscale x 4 x i32>, ptr %vp162486 load <vscale x 4 x i32>, ptr %vp161b487 ret void488}489 490; CHECK-LABEL: twovscales491; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162492; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b493; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162494define 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, 16498 %vp2 = mul nsw i64 %v2, 16499 %vp3 = mul nsw i64 %v1, 17500 %vp161 = getelementptr i8, ptr %p, i64 %vp1501 %vp162 = getelementptr i8, ptr %p, i64 %vp2502 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3503 load <vscale x 4 x i32>, ptr %vp161504 load <vscale x 4 x i32>, ptr %vp162505 load <vscale x 4 x i32>, ptr %vp161b506 ret void507}508 509; getelementptr recursion510 511; CHECK-LABEL: gep_recursion_level_1512; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p513; CHECK-DAG: MayAlias: i32* %a, i32* %gep514; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1515; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p516; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p517; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1518define void @gep_recursion_level_1(ptr %a, ptr %p) {519 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2520 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1521 load <vscale x 4 x i32>, ptr %p522 load i32, ptr %a523 load i32, ptr %gep524 load i32, ptr %gep_rec_1525 ret void526}527 528; CHECK-LABEL: gep_recursion_level_1_bitcast529; CHECK-DAG: MustAlias: i32* %a, <vscale x 4 x i32>* %a530; CHECK-DAG: MayAlias: i32* %a, i32* %gep531; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1532; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep533; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep_rec_1534; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1535define void @gep_recursion_level_1_bitcast(ptr %a) {536 %gep = getelementptr <vscale x 4 x i32>, ptr %a, i64 1, i64 2537 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1538 load <vscale x 4 x i32>, ptr %a539 load i32, ptr %a540 load i32, ptr %gep541 load i32, ptr %gep_rec_1542 ret void543}544 545; CHECK-LABEL: gep_recursion_level_2546; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p547; CHECK-DAG: MayAlias: i32* %a, i32* %gep548; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1549; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2550; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p551; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p552; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p553; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1554; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2555; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2556define void @gep_recursion_level_2(ptr %a, ptr %p) {557 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2558 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1559 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1560 load <vscale x 4 x i32>, ptr %p561 load i32, ptr %a562 load i32, ptr %gep563 load i32, ptr %gep_rec_1564 load i32, ptr %gep_rec_2565 ret void566}567 568; CHECK-LABEL: gep_recursion_max_lookup_depth_reached569; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p570; CHECK-DAG: MayAlias: i32* %a, i32* %gep571; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1572; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2573; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3574; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4575; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5576; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6577; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p578; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p579; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p580; CHECK-DAG: MayAlias: i32* %gep_rec_3, <vscale x 4 x i32>* %p581; CHECK-DAG: MayAlias: i32* %gep_rec_4, <vscale x 4 x i32>* %p582; CHECK-DAG: MayAlias: i32* %gep_rec_5, <vscale x 4 x i32>* %p583; CHECK-DAG: MayAlias: i32* %gep_rec_6, <vscale x 4 x i32>* %p584; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1585; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2586; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_3587; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_4588; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_5589; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_6590; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2591; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_3592; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_4593; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_5594; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_6595; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_3596; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_4597; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_5598; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_6599; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_4600; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_5601; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_6602; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_5603; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_6604; CHECK-DAG: NoAlias: i32* %gep_rec_5, i32* %gep_rec_6605; 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 2608 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1609 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1610 %gep_rec_3 = getelementptr i32, ptr %gep_rec_2, i64 1611 %gep_rec_4 = getelementptr i32, ptr %gep_rec_3, i64 1612 %gep_rec_5 = getelementptr i32, ptr %gep_rec_4, i64 1613 %gep_rec_6 = getelementptr i32, ptr %gep_rec_5, i64 1614 load <vscale x 4 x i32>, ptr %p615 load i32, ptr %a616 load i32, ptr %gep617 load i32, ptr %gep_rec_1618 load i32, ptr %gep_rec_2619 load i32, ptr %gep_rec_3620 load i32, ptr %gep_rec_4621 load i32, ptr %gep_rec_5622 load i32, ptr %gep_rec_6623 ret void624}625 626; CHECK-LABEL: gep_2048627; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p628; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p629; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255630; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p631; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256632; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256633; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p634; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255635; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256636; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256637define void @gep_2048(ptr %p) {638 %off255 = getelementptr i8, ptr %p, i64 255639 %noff255 = getelementptr i8, ptr %p, i64 -255640 %off256 = getelementptr i8, ptr %p, i64 256641 %noff256 = getelementptr i8, ptr %p, i64 -256642 load <vscale x 4 x i32>, ptr %p643 load <vscale x 4 x i32>, ptr %off255644 load <vscale x 4 x i32>, ptr %noff255645 load <vscale x 4 x i32>, ptr %off256646 load <vscale x 4 x i32>, ptr %noff256647 ret void648}649 650; CHECK-LABEL: gep_2048_vscalerange651; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p652; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p653; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255654; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p655; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256656; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256657; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p658; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255659; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256660; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256661define void @gep_2048_vscalerange(ptr %p) vscale_range(1,16) {662 %off255 = getelementptr i8, ptr %p, i64 255663 %noff255 = getelementptr i8, ptr %p, i64 -255664 %off256 = getelementptr i8, ptr %p, i64 256665 %noff256 = getelementptr i8, ptr %p, i64 -256666 load <vscale x 4 x i32>, ptr %p667 load <vscale x 4 x i32>, ptr %off255668 load <vscale x 4 x i32>, ptr %noff255669 load <vscale x 4 x i32>, ptr %off256670 load <vscale x 4 x i32>, ptr %noff256671 ret void672}673