509 lines · plain
1; RUN: opt -passes=loop-vectorize -mtriple=arm64-apple-iphones -force-vector-width=4 -force-vector-interleave=1 %s -S | FileCheck %s2 3; Vectors with i4 elements may not legal with nontemporal stores.4define void @test_i4_store(ptr %ddst) {5; CHECK-LABEL: define void @test_i4_store(6; CHECK-NOT: vector.body:7; CHECK: ret void8;9entry:10 br label %for.body11 12for.body: ; preds = %entry, %for.body13 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]14 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]15 %incdec.ptr = getelementptr inbounds i4, ptr %ddst.addr, i64 116 store i4 10, ptr %ddst.addr, align 4, !nontemporal !817 %add = add nuw nsw i32 %i, 418 %cmp = icmp ult i32 %i, 409219 br i1 %cmp, label %for.body, label %for.cond.cleanup20 21for.cond.cleanup: ; preds = %for.body22 ret void23}24 25define void @test_i8_store(ptr %ddst) {26; CHECK-LABEL: define void @test_i8_store(27; CHECK-LABEL: vector.body:28; CHECK: store <4 x i8> {{.*}} !nontemporal !029; CHECK: br30;31entry:32 br label %for.body33 34for.body: ; preds = %entry, %for.body35 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]36 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]37 %incdec.ptr = getelementptr inbounds i8, ptr %ddst.addr, i64 138 store i8 10, ptr %ddst.addr, align 4, !nontemporal !839 %add = add nuw nsw i32 %i, 440 %cmp = icmp ult i32 %i, 409241 br i1 %cmp, label %for.body, label %for.cond.cleanup42 43for.cond.cleanup: ; preds = %for.body44 ret void45}46 47define void @test_half_store(ptr %ddst) {48; CHECK-LABEL: define void @test_half_store(49; CHECK-LABEL: vector.body:50; CHECK: store <4 x half> {{.*}} !nontemporal !051; CHECK: br52;53entry:54 br label %for.body55 56for.body: ; preds = %entry, %for.body57 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]58 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]59 %incdec.ptr = getelementptr inbounds half, ptr %ddst.addr, i64 160 store half 10.0, ptr %ddst.addr, align 4, !nontemporal !861 %add = add nuw nsw i32 %i, 462 %cmp = icmp ult i32 %i, 409263 br i1 %cmp, label %for.body, label %for.cond.cleanup64 65for.cond.cleanup: ; preds = %for.body66 ret void67}68 69define void @test_i16_store(ptr %ddst) {70; CHECK-LABEL: define void @test_i16_store(71; CHECK-LABEL: vector.body:72; CHECK: store <4 x i16> {{.*}} !nontemporal !073; CHECK: br74;75entry:76 br label %for.body77 78for.body: ; preds = %entry, %for.body79 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]80 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]81 %incdec.ptr = getelementptr inbounds i16, ptr %ddst.addr, i64 182 store i16 10, ptr %ddst.addr, align 4, !nontemporal !883 %add = add nuw nsw i32 %i, 484 %cmp = icmp ult i32 %i, 409285 br i1 %cmp, label %for.body, label %for.cond.cleanup86 87for.cond.cleanup: ; preds = %for.body88 ret void89}90 91define void @test_i32_store(ptr nocapture %ddst) {92; CHECK-LABEL: define void @test_i32_store(93; CHECK-LABEL: vector.body:94; CHECK: store <16 x i32> {{.*}} !nontemporal !095; CHECK: br96;97entry:98 br label %for.body99 100for.body: ; preds = %entry, %for.body101 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]102 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr3, %for.body ]103 %incdec.ptr = getelementptr inbounds i32, ptr %ddst.addr, i64 1104 store i32 10, ptr %ddst.addr, align 4, !nontemporal !8105 %incdec.ptr1 = getelementptr inbounds i32, ptr %ddst.addr, i64 2106 store i32 20, ptr %incdec.ptr, align 4, !nontemporal !8107 %incdec.ptr2 = getelementptr inbounds i32, ptr %ddst.addr, i64 3108 store i32 30, ptr %incdec.ptr1, align 4, !nontemporal !8109 %incdec.ptr3 = getelementptr inbounds i32, ptr %ddst.addr, i64 4110 store i32 40, ptr %incdec.ptr2, align 4, !nontemporal !8111 %add = add nuw nsw i32 %i, 4112 %cmp = icmp ult i32 %i, 4092113 br i1 %cmp, label %for.body, label %for.cond.cleanup114 115for.cond.cleanup: ; preds = %for.body116 ret void117}118 119define void @test_i33_store(ptr nocapture %ddst) {120; CHECK-LABEL: define void @test_i33_store(121; CHECK-NOT: vector.body:122; CHECK: ret123;124entry:125 br label %for.body126 127for.body: ; preds = %entry, %for.body128 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]129 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr3, %for.body ]130 %incdec.ptr = getelementptr inbounds i33, ptr %ddst.addr, i64 1131 store i33 10, ptr %ddst.addr, align 4, !nontemporal !8132 %incdec.ptr1 = getelementptr inbounds i33, ptr %ddst.addr, i64 2133 store i33 20, ptr %incdec.ptr, align 4, !nontemporal !8134 %incdec.ptr2 = getelementptr inbounds i33, ptr %ddst.addr, i64 3135 store i33 30, ptr %incdec.ptr1, align 4, !nontemporal !8136 %incdec.ptr3 = getelementptr inbounds i33, ptr %ddst.addr, i64 4137 store i33 40, ptr %incdec.ptr2, align 4, !nontemporal !8138 %add = add nuw nsw i32 %i, 3139 %cmp = icmp ult i32 %i, 4092140 br i1 %cmp, label %for.body, label %for.cond.cleanup141 142for.cond.cleanup: ; preds = %for.body143 ret void144}145 146define void @test_i40_store(ptr nocapture %ddst) {147; CHECK-LABEL: define void @test_i40_store(148; CHECK-NOT: vector.body:149; CHECK: ret150;151entry:152 br label %for.body153 154for.body: ; preds = %entry, %for.body155 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]156 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr3, %for.body ]157 %incdec.ptr = getelementptr inbounds i40, ptr %ddst.addr, i64 1158 store i40 10, ptr %ddst.addr, align 4, !nontemporal !8159 %incdec.ptr1 = getelementptr inbounds i40, ptr %ddst.addr, i64 2160 store i40 20, ptr %incdec.ptr, align 4, !nontemporal !8161 %incdec.ptr2 = getelementptr inbounds i40, ptr %ddst.addr, i64 3162 store i40 30, ptr %incdec.ptr1, align 4, !nontemporal !8163 %incdec.ptr3 = getelementptr inbounds i40, ptr %ddst.addr, i64 4164 store i40 40, ptr %incdec.ptr2, align 4, !nontemporal !8165 %add = add nuw nsw i32 %i, 3166 %cmp = icmp ult i32 %i, 4092167 br i1 %cmp, label %for.body, label %for.cond.cleanup168 169for.cond.cleanup: ; preds = %for.body170 ret void171}172define void @test_i64_store(ptr nocapture %ddst) local_unnamed_addr #0 {173; CHECK-LABEL: define void @test_i64_store(174; CHECK-LABEL: vector.body:175; CHECK: store <4 x i64> {{.*}} !nontemporal !0176; CHECK: br177;178entry:179 br label %for.body180 181for.body: ; preds = %entry, %for.body182 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]183 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]184 %incdec.ptr = getelementptr inbounds i64, ptr %ddst.addr, i64 1185 store i64 10, ptr %ddst.addr, align 4, !nontemporal !8186 %add = add nuw nsw i32 %i, 4187 %cmp = icmp ult i32 %i, 4092188 br i1 %cmp, label %for.body, label %for.cond.cleanup189 190for.cond.cleanup: ; preds = %for.body191 ret void192}193 194define void @test_double_store(ptr %ddst) {195; CHECK-LABEL: define void @test_double_store(196; CHECK-LABEL: vector.body:197; CHECK: store <4 x double> {{.*}} !nontemporal !0198; CHECK: br199;200entry:201 br label %for.body202 203for.body: ; preds = %entry, %for.body204 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]205 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]206 %incdec.ptr = getelementptr inbounds double, ptr %ddst.addr, i64 1207 store double 10.0, ptr %ddst.addr, align 4, !nontemporal !8208 %add = add nuw nsw i32 %i, 4209 %cmp = icmp ult i32 %i, 4092210 br i1 %cmp, label %for.body, label %for.cond.cleanup211 212for.cond.cleanup: ; preds = %for.body213 ret void214}215 216define void @test_i128_store(ptr %ddst) {217; CHECK-LABEL: define void @test_i128_store(218; CHECK-LABEL: vector.body:219; CHECK: store <4 x i128> {{.*}} !nontemporal !0220; CHECK: br221;222entry:223 br label %for.body224 225for.body: ; preds = %entry, %for.body226 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]227 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]228 %incdec.ptr = getelementptr inbounds i128, ptr %ddst.addr, i64 1229 store i128 10, ptr %ddst.addr, align 4, !nontemporal !8230 %add = add nuw nsw i32 %i, 4231 %cmp = icmp ult i32 %i, 4092232 br i1 %cmp, label %for.body, label %for.cond.cleanup233 234for.cond.cleanup: ; preds = %for.body235 ret void236}237 238define void @test_i256_store(ptr %ddst) {239; CHECK-LABEL: define void @test_i256_store(240; CHECK-NOT: vector.body:241; CHECK: ret void242;243entry:244 br label %for.body245 246for.body: ; preds = %entry, %for.body247 %i = phi i32 [ 0, %entry ], [ %add, %for.body ]248 %ddst.addr = phi ptr [ %ddst, %entry ], [ %incdec.ptr, %for.body ]249 %incdec.ptr = getelementptr inbounds i256, ptr %ddst.addr, i64 1250 store i256 10, ptr %ddst.addr, align 4, !nontemporal !8251 %add = add nuw nsw i32 %i, 4252 %cmp = icmp ult i32 %i, 4092253 br i1 %cmp, label %for.body, label %for.cond.cleanup254 255for.cond.cleanup: ; preds = %for.body256 ret void257}258 259define i4 @test_i4_load(ptr %ddst) {260; CHECK-LABEL: define i4 @test_i4_load261; CHECK-NOT: vector.body:262; CHECK: ret i4 %{{.*}}263;264entry:265 br label %for.body266 267for.body: ; preds = %entry, %for.body268 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]269 %acc.08 = phi i4 [ 0, %entry ], [ %add, %for.body ]270 %arrayidx = getelementptr inbounds i4, ptr %ddst, i64 %indvars.iv271 %l = load i4, ptr %arrayidx, align 1, !nontemporal !8272 %add = add i4 %l, %acc.08273 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1274 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092275 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body276 277for.cond.cleanup: ; preds = %for.body278 ret i4 %add279}280 281define i8 @test_load_i8(ptr %ddst) {282; CHECK-LABEL: @test_load_i8(283; CHECK: vector.body:284; CHECK: load <4 x i8>, ptr {{.*}}, align 1, !nontemporal !0285; CHECK: ret i8 %{{.*}}286;287entry:288 br label %for.body289 290for.body: ; preds = %entry, %for.body291 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]292 %acc.08 = phi i8 [ 0, %entry ], [ %add, %for.body ]293 %arrayidx = getelementptr inbounds i8, ptr %ddst, i64 %indvars.iv294 %l = load i8, ptr %arrayidx, align 1, !nontemporal !8295 %add = add i8 %l, %acc.08296 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1297 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092298 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body299 300for.cond.cleanup: ; preds = %for.body301 ret i8 %add302}303 304define half @test_half_load(ptr %ddst) {305; CHECK-LABEL: @test_half_load306; CHECK-LABEL: vector.body:307; CHECK: load <4 x half>, ptr {{.*}}, align 2, !nontemporal !0308; CHECK: ret half %{{.*}}309;310entry:311 br label %for.body312 313for.body: ; preds = %entry, %for.body314 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]315 %acc.08 = phi half [ 0.0, %entry ], [ %add, %for.body ]316 %arrayidx = getelementptr inbounds half, ptr %ddst, i64 %indvars.iv317 %l = load half, ptr %arrayidx, align 2, !nontemporal !8318 %add = fadd half %l, %acc.08319 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1320 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092321 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body322 323for.cond.cleanup: ; preds = %for.body324 ret half %add325}326 327define i16 @test_i16_load(ptr %ddst) {328; CHECK-LABEL: @test_i16_load329; CHECK-LABEL: vector.body:330; CHECK: load <4 x i16>, ptr {{.*}}, align 2, !nontemporal !0331; CHECK: ret i16 %{{.*}}332;333entry:334 br label %for.body335 336for.body: ; preds = %entry, %for.body337 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]338 %acc.08 = phi i16 [ 0, %entry ], [ %add, %for.body ]339 %arrayidx = getelementptr inbounds i16, ptr %ddst, i64 %indvars.iv340 %l = load i16, ptr %arrayidx, align 2, !nontemporal !8341 %add = add i16 %l, %acc.08342 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1343 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092344 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body345 346for.cond.cleanup: ; preds = %for.body347 ret i16 %add348}349 350define i32 @test_i32_load(ptr %ddst) {351; CHECK-LABEL: @test_i32_load352; CHECK-LABEL: vector.body:353; CHECK: load <4 x i32>, ptr {{.*}}, align 4, !nontemporal !0354; CHECK: ret i32 %{{.*}}355;356entry:357 br label %for.body358 359for.body: ; preds = %entry, %for.body360 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]361 %acc.08 = phi i32 [ 0, %entry ], [ %add, %for.body ]362 %arrayidx = getelementptr inbounds i32, ptr %ddst, i64 %indvars.iv363 %l = load i32, ptr %arrayidx, align 4, !nontemporal !8364 %add = add i32 %l, %acc.08365 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1366 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092367 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body368 369for.cond.cleanup: ; preds = %for.body370 ret i32 %add371}372 373define i33 @test_i33_load(ptr %ddst) {374; CHECK-LABEL: @test_i33_load375; CHECK-NOT: vector.body:376; CHECK: ret i33 %{{.*}}377;378entry:379 br label %for.body380 381for.body: ; preds = %entry, %for.body382 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]383 %acc.08 = phi i33 [ 0, %entry ], [ %add, %for.body ]384 %arrayidx = getelementptr inbounds i33, ptr %ddst, i64 %indvars.iv385 %l = load i33, ptr %arrayidx, align 4, !nontemporal !8386 %add = add i33 %l, %acc.08387 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1388 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092389 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body390 391for.cond.cleanup: ; preds = %for.body392 ret i33 %add393}394 395define i40 @test_i40_load(ptr %ddst) {396; CHECK-LABEL: @test_i40_load397; CHECK-NOT: vector.body:398; CHECK: ret i40 %{{.*}}399;400entry:401 br label %for.body402 403for.body: ; preds = %entry, %for.body404 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]405 %acc.08 = phi i40 [ 0, %entry ], [ %add, %for.body ]406 %arrayidx = getelementptr inbounds i40, ptr %ddst, i64 %indvars.iv407 %l = load i40, ptr %arrayidx, align 4, !nontemporal !8408 %add = add i40 %l, %acc.08409 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1410 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092411 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body412 413for.cond.cleanup: ; preds = %for.body414 ret i40 %add415}416 417define i64 @test_i64_load(ptr %ddst) {418; CHECK-LABEL: @test_i64_load419; CHECK-LABEL: vector.body:420; CHECK: load <4 x i64>, ptr {{.*}}, align 4, !nontemporal !0421; CHECK: ret i64 %{{.*}}422;423entry:424 br label %for.body425 426for.body: ; preds = %entry, %for.body427 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]428 %acc.08 = phi i64 [ 0, %entry ], [ %add, %for.body ]429 %arrayidx = getelementptr inbounds i64, ptr %ddst, i64 %indvars.iv430 %l = load i64, ptr %arrayidx, align 4, !nontemporal !8431 %add = add i64 %l, %acc.08432 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1433 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092434 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body435 436for.cond.cleanup: ; preds = %for.body437 ret i64 %add438}439 440define double @test_double_load(ptr %ddst) {441; CHECK-LABEL: @test_double_load442; CHECK-LABEL: vector.body:443; CHECK: load <4 x double>, ptr {{.*}}, align 4, !nontemporal !0444; CHECK: ret double %{{.*}}445;446entry:447 br label %for.body448 449for.body: ; preds = %entry, %for.body450 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]451 %acc.08 = phi double [ 0.0, %entry ], [ %add, %for.body ]452 %arrayidx = getelementptr inbounds double, ptr %ddst, i64 %indvars.iv453 %l = load double, ptr %arrayidx, align 4, !nontemporal !8454 %add = fadd double %l, %acc.08455 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1456 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092457 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body458 459for.cond.cleanup: ; preds = %for.body460 ret double %add461}462 463define i128 @test_i128_load(ptr %ddst) {464; CHECK-LABEL: @test_i128_load465; CHECK-LABEL: vector.body:466; CHECK: load <4 x i128>, ptr {{.*}}, align 4, !nontemporal !0467; CHECK: ret i128 %{{.*}}468;469entry:470 br label %for.body471 472for.body: ; preds = %entry, %for.body473 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]474 %acc.08 = phi i128 [ 0, %entry ], [ %add, %for.body ]475 %arrayidx = getelementptr inbounds i128, ptr %ddst, i64 %indvars.iv476 %l = load i128, ptr %arrayidx, align 4, !nontemporal !8477 %add = add i128 %l, %acc.08478 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1479 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092480 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body481 482for.cond.cleanup: ; preds = %for.body483 ret i128 %add484}485 486define i256 @test_256_load(ptr %ddst) {487; CHECK-LABEL: @test_256_load488; CHECK-NOT: vector.body:489; CHECK: ret i256 %{{.*}}490;491entry:492 br label %for.body493 494for.body: ; preds = %entry, %for.body495 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]496 %acc.08 = phi i256 [ 0, %entry ], [ %add, %for.body ]497 %arrayidx = getelementptr inbounds i256, ptr %ddst, i64 %indvars.iv498 %l = load i256, ptr %arrayidx, align 4, !nontemporal !8499 %add = add i256 %l, %acc.08500 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1501 %exitcond.not = icmp eq i64 %indvars.iv.next, 4092502 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body503 504for.cond.cleanup: ; preds = %for.body505 ret i256 %add506}507 508!8 = !{i32 1}509