268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \3; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 -S | FileCheck %s --check-prefixes=CHECK4; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v -S | FileCheck %s --check-prefixes=DEFAULT5 6 7define void @simple_copy(ptr %dest, ptr %p) {8; CHECK-LABEL: @simple_copy(9; CHECK-NEXT: entry:10; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 411; CHECK-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 412; CHECK-NEXT: ret void13;14; DEFAULT-LABEL: @simple_copy(15; DEFAULT-NEXT: entry:16; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 417; DEFAULT-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 418; DEFAULT-NEXT: ret void19;20entry:21 %e0 = load i16, ptr %p, align 422 %inc = getelementptr inbounds i16, ptr %p, i64 123 %e1 = load i16, ptr %inc, align 224 25 store i16 %e0, ptr %dest, align 426 %inc2 = getelementptr inbounds i16, ptr %dest, i64 127 store i16 %e1, ptr %inc2, align 228 ret void29}30 31define void @vec_add(ptr %dest, ptr %p) {32; CHECK-LABEL: @vec_add(33; CHECK-NEXT: entry:34; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 435; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)36; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 437; CHECK-NEXT: ret void38;39; DEFAULT-LABEL: @vec_add(40; DEFAULT-NEXT: entry:41; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 442; DEFAULT-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)43; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 444; DEFAULT-NEXT: ret void45;46entry:47 %e0 = load i16, ptr %p, align 448 %inc = getelementptr inbounds i16, ptr %p, i64 149 %e1 = load i16, ptr %inc, align 250 51 %a0 = add i16 %e0, 152 %a1 = add i16 %e1, 153 54 store i16 %a0, ptr %dest, align 455 %inc2 = getelementptr inbounds i16, ptr %dest, i64 156 store i16 %a1, ptr %inc2, align 257 ret void58}59 60 61define void @splat_store_i16(ptr %dest, ptr %p) {62; CHECK-LABEL: @splat_store_i16(63; CHECK-NEXT: entry:64; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 465; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 466; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 167; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 268; CHECK-NEXT: ret void69;70; DEFAULT-LABEL: @splat_store_i16(71; DEFAULT-NEXT: entry:72; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 473; DEFAULT-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 474; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 175; DEFAULT-NEXT: store i16 [[E0]], ptr [[INC2]], align 276; DEFAULT-NEXT: ret void77;78entry:79 %e0 = load i16, ptr %p, align 480 81 store i16 %e0, ptr %dest, align 482 %inc2 = getelementptr inbounds i16, ptr %dest, i64 183 store i16 %e0, ptr %inc2, align 284 ret void85}86 87define void @splat_store_i64(ptr %dest, ptr %p) {88; CHECK-LABEL: @splat_store_i64(89; CHECK-NEXT: entry:90; CHECK-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 491; CHECK-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 492; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 193; CHECK-NEXT: store i64 [[E0]], ptr [[INC2]], align 294; CHECK-NEXT: ret void95;96; DEFAULT-LABEL: @splat_store_i64(97; DEFAULT-NEXT: entry:98; DEFAULT-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 499; DEFAULT-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 4100; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1101; DEFAULT-NEXT: store i64 [[E0]], ptr [[INC2]], align 2102; DEFAULT-NEXT: ret void103;104entry:105 %e0 = load i64, ptr %p, align 4106 107 store i64 %e0, ptr %dest, align 4108 %inc2 = getelementptr inbounds i64, ptr %dest, i64 1109 store i64 %e0, ptr %inc2, align 2110 ret void111}112 113define void @splat_store_i64_zero(ptr %dest) {114; CHECK-LABEL: @splat_store_i64_zero(115; CHECK-NEXT: entry:116; CHECK-NEXT: store i64 0, ptr [[DEST:%.*]], align 4117; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1118; CHECK-NEXT: store i64 0, ptr [[INC2]], align 2119; CHECK-NEXT: ret void120;121; DEFAULT-LABEL: @splat_store_i64_zero(122; DEFAULT-NEXT: entry:123; DEFAULT-NEXT: store i64 0, ptr [[DEST:%.*]], align 4124; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1125; DEFAULT-NEXT: store i64 0, ptr [[INC2]], align 2126; DEFAULT-NEXT: ret void127;128entry:129 store i64 0, ptr %dest, align 4130 %inc2 = getelementptr inbounds i64, ptr %dest, i64 1131 store i64 0, ptr %inc2, align 2132 ret void133}134 135define void @splat_store_i64_one(ptr %dest) {136; CHECK-LABEL: @splat_store_i64_one(137; CHECK-NEXT: entry:138; CHECK-NEXT: store i64 1, ptr [[DEST:%.*]], align 4139; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1140; CHECK-NEXT: store i64 1, ptr [[INC2]], align 2141; CHECK-NEXT: ret void142;143; DEFAULT-LABEL: @splat_store_i64_one(144; DEFAULT-NEXT: entry:145; DEFAULT-NEXT: store i64 1, ptr [[DEST:%.*]], align 4146; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1147; DEFAULT-NEXT: store i64 1, ptr [[INC2]], align 2148; DEFAULT-NEXT: ret void149;150entry:151 store i64 1, ptr %dest, align 4152 %inc2 = getelementptr inbounds i64, ptr %dest, i64 1153 store i64 1, ptr %inc2, align 2154 ret void155}156 157define void @splat_store_i32_zero(ptr %dest) {158; CHECK-LABEL: @splat_store_i32_zero(159; CHECK-NEXT: entry:160; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4161; CHECK-NEXT: ret void162;163; DEFAULT-LABEL: @splat_store_i32_zero(164; DEFAULT-NEXT: entry:165; DEFAULT-NEXT: store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4166; DEFAULT-NEXT: ret void167;168entry:169 store i32 0, ptr %dest, align 4170 %inc1 = getelementptr inbounds i32, ptr %dest, i64 1171 store i32 0, ptr %inc1, align 2172 %inc2 = getelementptr inbounds i32, ptr %dest, i64 2173 store i32 0, ptr %inc2, align 2174 %inc3 = getelementptr inbounds i32, ptr %dest, i64 3175 store i32 0, ptr %inc3, align 2176 ret void177}178 179define void @splat_store_i32_one(ptr %dest) {180; CHECK-LABEL: @splat_store_i32_one(181; CHECK-NEXT: entry:182; CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4183; CHECK-NEXT: ret void184;185; DEFAULT-LABEL: @splat_store_i32_one(186; DEFAULT-NEXT: entry:187; DEFAULT-NEXT: store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4188; DEFAULT-NEXT: ret void189;190entry:191 store i32 1, ptr %dest, align 4192 %inc1 = getelementptr inbounds i32, ptr %dest, i64 1193 store i32 1, ptr %inc1, align 2194 %inc2 = getelementptr inbounds i32, ptr %dest, i64 2195 store i32 1, ptr %inc2, align 2196 %inc3 = getelementptr inbounds i32, ptr %dest, i64 3197 store i32 1, ptr %inc3, align 2198 ret void199}200 201define void @store_stepvector_i32(ptr %dest) {202; CHECK-LABEL: @store_stepvector_i32(203; CHECK-NEXT: entry:204; CHECK-NEXT: store i32 0, ptr [[DEST:%.*]], align 4205; CHECK-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1206; CHECK-NEXT: store i32 1, ptr [[INC1]], align 2207; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2208; CHECK-NEXT: store i32 2, ptr [[INC2]], align 2209; CHECK-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3210; CHECK-NEXT: store i32 3, ptr [[INC3]], align 2211; CHECK-NEXT: ret void212;213; DEFAULT-LABEL: @store_stepvector_i32(214; DEFAULT-NEXT: entry:215; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4216; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1217; DEFAULT-NEXT: store i32 1, ptr [[INC1]], align 2218; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2219; DEFAULT-NEXT: store i32 2, ptr [[INC2]], align 2220; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3221; DEFAULT-NEXT: store i32 3, ptr [[INC3]], align 2222; DEFAULT-NEXT: ret void223;224entry:225 store i32 0, ptr %dest, align 4226 %inc1 = getelementptr inbounds i32, ptr %dest, i64 1227 store i32 1, ptr %inc1, align 2228 %inc2 = getelementptr inbounds i32, ptr %dest, i64 2229 store i32 2, ptr %inc2, align 2230 %inc3 = getelementptr inbounds i32, ptr %dest, i64 3231 store i32 3, ptr %inc3, align 2232 ret void233}234 235define void @store_arbitrary_constant_i32(ptr %dest) {236; CHECK-LABEL: @store_arbitrary_constant_i32(237; CHECK-NEXT: entry:238; CHECK-NEXT: store i32 0, ptr [[DEST:%.*]], align 4239; CHECK-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1240; CHECK-NEXT: store i32 -33, ptr [[INC1]], align 2241; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2242; CHECK-NEXT: store i32 44, ptr [[INC2]], align 2243; CHECK-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3244; CHECK-NEXT: store i32 77, ptr [[INC3]], align 2245; CHECK-NEXT: ret void246;247; DEFAULT-LABEL: @store_arbitrary_constant_i32(248; DEFAULT-NEXT: entry:249; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4250; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1251; DEFAULT-NEXT: store i32 -33, ptr [[INC1]], align 2252; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2253; DEFAULT-NEXT: store i32 44, ptr [[INC2]], align 2254; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3255; DEFAULT-NEXT: store i32 77, ptr [[INC3]], align 2256; DEFAULT-NEXT: ret void257;258entry:259 store i32 0, ptr %dest, align 4260 %inc1 = getelementptr inbounds i32, ptr %dest, i64 1261 store i32 -33, ptr %inc1, align 2262 %inc2 = getelementptr inbounds i32, ptr %dest, i64 2263 store i32 44, ptr %inc2, align 2264 %inc3 = getelementptr inbounds i32, ptr %dest, i64 3265 store i32 77, ptr %inc3, align 2266 ret void267}268