brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.9 KiB · c7edf9b Raw
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