133 lines · plain
1; RUN: opt -mtriple=x86_64-unknown-linux-gnu -passes=load-store-vectorizer -S -o - %s | FileCheck %s2; RUN: opt -mtriple=x86_64-unknown-linux-gnu -aa-pipeline=basic-aa -passes='function(load-store-vectorizer)' -S -o - %s | FileCheck %s3 4target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"5 6; Vectorized subsets of the load/store chains in the presence of7; interleaved loads/stores8 9; CHECK-LABEL: @interleave_2L_2S(10; CHECK: load <2 x i32>11; CHECK: store <2 x i32>12; CHECK: load <2 x i32>13define void @interleave_2L_2S(ptr noalias %ptr) {14 %next.gep1 = getelementptr i32, ptr %ptr, i64 115 %next.gep2 = getelementptr i32, ptr %ptr, i64 216 17 %l1 = load i32, ptr %next.gep1, align 418 %l2 = load i32, ptr %ptr, align 419 store i32 0, ptr %next.gep1, align 420 store i32 0, ptr %ptr, align 421 %l3 = load i32, ptr %next.gep1, align 422 %l4 = load i32, ptr %next.gep2, align 423 24 ret void25}26 27; CHECK-LABEL: @interleave_3L_2S_1L(28; CHECK: load <2 x i32>29; CHECK: store <2 x i32>30; CHECK: load <2 x i32>31 32define void @interleave_3L_2S_1L(ptr noalias %ptr) {33 %next.gep1 = getelementptr i32, ptr %ptr, i64 134 %next.gep2 = getelementptr i32, ptr %ptr, i64 235 36 %l2 = load i32, ptr %ptr, align 437 %l1 = load i32, ptr %next.gep1, align 438 store i32 0, ptr %next.gep1, align 439 store i32 0, ptr %ptr, align 440 %l3 = load i32, ptr %next.gep1, align 441 %l4 = load i32, ptr %next.gep2, align 442 43 ret void44}45 46; CHECK-LABEL: @chain_suffix(47; CHECK: load i3248; CHECK: store <2 x i32>49; CHECK: load <2 x i32>50define void @chain_suffix(ptr noalias %ptr) {51 %next.gep1 = getelementptr i32, ptr %ptr, i64 152 %next.gep2 = getelementptr i32, ptr %ptr, i64 253 54 %l2 = load i32, ptr %ptr, align 455 store i32 0, ptr %next.gep1, align 456 store i32 0, ptr %ptr, align 457 %l3 = load i32, ptr %next.gep1, align 458 %l4 = load i32, ptr %next.gep2, align 459 60 ret void61}62 63 64; CHECK-LABEL: @chain_prefix_suffix(65; CHECK: load <2 x i32>66; CHECK: store <2 x i32>67; CHECK: load <3 x i32>68define void @chain_prefix_suffix(ptr noalias %ptr) {69 %next.gep1 = getelementptr i32, ptr %ptr, i64 170 %next.gep2 = getelementptr i32, ptr %ptr, i64 271 %next.gep3 = getelementptr i32, ptr %ptr, i64 372 73 %l1 = load i32, ptr %ptr, align 474 %l2 = load i32, ptr %next.gep1, align 475 store i32 0, ptr %next.gep1, align 476 store i32 0, ptr %next.gep2, align 477 %l3 = load i32, ptr %next.gep1, align 478 %l4 = load i32, ptr %next.gep2, align 479 %l5 = load i32, ptr %next.gep3, align 480 81 ret void82}83 84; CHECK-LABEL: @interleave_get_longest85; CHECK: load <2 x i32>86; CHECK: store <2 x i32> zeroinitializer87; CHECK: load <3 x i32>88; CHECK: load i3289 90define void @interleave_get_longest(ptr noalias %ptr) {91 %tmp2 = getelementptr i32, ptr %ptr, i64 192 %tmp3 = getelementptr i32, ptr %ptr, i64 293 %tmp4 = getelementptr i32, ptr %ptr, i64 394 %tmp5 = getelementptr i32, ptr %ptr, i64 495 96 %l1 = load i32, ptr %tmp2, align 497 %l2 = load i32, ptr %ptr, align 498 store i32 0, ptr %tmp2, align 499 store i32 0, ptr %ptr, align 4100 %l3 = load i32, ptr %tmp2, align 4101 %l4 = load i32, ptr %tmp3, align 4102 %l5 = load i32, ptr %tmp4, align 4103 %l6 = load i32, ptr %tmp5, align 4104 %l7 = load i32, ptr %tmp5, align 4105 106 ret void107}108 109; CHECK-LABEL: @interleave_get_longest_aligned110; CHECK: load <2 x i32>111; CHECK: store <2 x i32> zeroinitializer112; CHECK: load <4 x i32>113 114define void @interleave_get_longest_aligned(ptr noalias %ptr) {115 %tmp2 = getelementptr i32, ptr %ptr, i64 1116 %tmp3 = getelementptr i32, ptr %ptr, i64 2117 %tmp4 = getelementptr i32, ptr %ptr, i64 3118 %tmp5 = getelementptr i32, ptr %ptr, i64 4119 120 %l1 = load i32, ptr %tmp2, align 4121 %l2 = load i32, ptr %ptr, align 4122 store i32 0, ptr %tmp2, align 4123 store i32 0, ptr %ptr, align 4124 %l3 = load i32, ptr %tmp2, align 16125 %l4 = load i32, ptr %tmp3, align 4126 %l5 = load i32, ptr %tmp4, align 8127 %l6 = load i32, ptr %tmp5, align 4128 %l7 = load i32, ptr %tmp5, align 4129 130 ret void131}132 133