327 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 6define void @vec_add(ptr %dest, ptr %p) {7; CHECK-LABEL: @vec_add(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 410; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)11; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 412; CHECK-NEXT: ret void13;14; DEFAULT-LABEL: @vec_add(15; DEFAULT-NEXT: entry:16; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 417; DEFAULT-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)18; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 419; DEFAULT-NEXT: ret void20;21entry:22 %e0 = load i16, ptr %p, align 423 %inc = getelementptr inbounds i16, ptr %p, i64 124 %e1 = load i16, ptr %inc, align 225 26 %a0 = add i16 %e0, 127 %a1 = add i16 %e1, 128 29 store i16 %a0, ptr %dest, align 430 %inc2 = getelementptr inbounds i16, ptr %dest, i64 131 store i16 %a1, ptr %inc2, align 232 ret void33}34 35define void @vec_sub(ptr %dest, ptr %p) {36; CHECK-LABEL: @vec_sub(37; CHECK-NEXT: entry:38; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 439; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i16> [[TMP0]], splat (i16 17)40; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 441; CHECK-NEXT: ret void42;43; DEFAULT-LABEL: @vec_sub(44; DEFAULT-NEXT: entry:45; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 446; DEFAULT-NEXT: [[TMP1:%.*]] = sub <2 x i16> [[TMP0]], splat (i16 17)47; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 448; DEFAULT-NEXT: ret void49;50entry:51 %e0 = load i16, ptr %p, align 452 %inc = getelementptr inbounds i16, ptr %p, i64 153 %e1 = load i16, ptr %inc, align 254 55 %a0 = sub i16 %e0, 1756 %a1 = sub i16 %e1, 1757 58 store i16 %a0, ptr %dest, align 459 %inc2 = getelementptr inbounds i16, ptr %dest, i64 160 store i16 %a1, ptr %inc2, align 261 ret void62}63 64define void @vec_rsub(ptr %dest, ptr %p) {65; CHECK-LABEL: @vec_rsub(66; CHECK-NEXT: entry:67; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 468; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i16> splat (i16 29), [[TMP0]]69; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 470; CHECK-NEXT: ret void71;72; DEFAULT-LABEL: @vec_rsub(73; DEFAULT-NEXT: entry:74; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 475; DEFAULT-NEXT: [[TMP1:%.*]] = sub <2 x i16> splat (i16 29), [[TMP0]]76; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 477; DEFAULT-NEXT: ret void78;79entry:80 %e0 = load i16, ptr %p, align 481 %inc = getelementptr inbounds i16, ptr %p, i64 182 %e1 = load i16, ptr %inc, align 283 84 %a0 = sub i16 29, %e085 %a1 = sub i16 29, %e186 87 store i16 %a0, ptr %dest, align 488 %inc2 = getelementptr inbounds i16, ptr %dest, i64 189 store i16 %a1, ptr %inc2, align 290 ret void91}92 93define void @vec_mul(ptr %dest, ptr %p) {94; CHECK-LABEL: @vec_mul(95; CHECK-NEXT: entry:96; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 497; CHECK-NEXT: [[TMP1:%.*]] = mul <2 x i16> [[TMP0]], splat (i16 7)98; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 499; CHECK-NEXT: ret void100;101; DEFAULT-LABEL: @vec_mul(102; DEFAULT-NEXT: entry:103; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4104; DEFAULT-NEXT: [[TMP1:%.*]] = mul <2 x i16> [[TMP0]], splat (i16 7)105; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4106; DEFAULT-NEXT: ret void107;108entry:109 %e0 = load i16, ptr %p, align 4110 %inc = getelementptr inbounds i16, ptr %p, i64 1111 %e1 = load i16, ptr %inc, align 2112 113 %a0 = mul i16 %e0, 7114 %a1 = mul i16 %e1, 7115 116 store i16 %a0, ptr %dest, align 4117 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1118 store i16 %a1, ptr %inc2, align 2119 ret void120}121 122define void @vec_sdiv(ptr %dest, ptr %p) {123; CHECK-LABEL: @vec_sdiv(124; CHECK-NEXT: entry:125; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4126; CHECK-NEXT: [[TMP1:%.*]] = sdiv <2 x i16> [[TMP0]], splat (i16 7)127; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4128; CHECK-NEXT: ret void129;130; DEFAULT-LABEL: @vec_sdiv(131; DEFAULT-NEXT: entry:132; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4133; DEFAULT-NEXT: [[TMP1:%.*]] = sdiv <2 x i16> [[TMP0]], splat (i16 7)134; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4135; DEFAULT-NEXT: ret void136;137entry:138 %e0 = load i16, ptr %p, align 4139 %inc = getelementptr inbounds i16, ptr %p, i64 1140 %e1 = load i16, ptr %inc, align 2141 142 %a0 = sdiv i16 %e0, 7143 %a1 = sdiv i16 %e1, 7144 145 store i16 %a0, ptr %dest, align 4146 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1147 store i16 %a1, ptr %inc2, align 2148 ret void149}150 151define void @vec_and(ptr %dest, ptr %p, ptr %q) {152; CHECK-LABEL: @vec_and(153; CHECK-NEXT: entry:154; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4155; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4156; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i16> [[TMP0]], [[TMP1]]157; CHECK-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4158; CHECK-NEXT: ret void159;160; DEFAULT-LABEL: @vec_and(161; DEFAULT-NEXT: entry:162; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4163; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4164; DEFAULT-NEXT: [[TMP2:%.*]] = and <2 x i16> [[TMP0]], [[TMP1]]165; DEFAULT-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4166; DEFAULT-NEXT: ret void167;168entry:169 %e0 = load i16, ptr %p, align 4170 %inc = getelementptr inbounds i16, ptr %p, i64 1171 %e1 = load i16, ptr %inc, align 2172 173 %f0 = load i16, ptr %q, align 4174 %inq = getelementptr inbounds i16, ptr %q, i64 1175 %f1 = load i16, ptr %inq, align 2176 177 %a0 = and i16 %e0, %f0178 %a1 = and i16 %e1, %f1179 180 store i16 %a0, ptr %dest, align 4181 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1182 store i16 %a1, ptr %inc2, align 2183 ret void184}185 186define void @vec_or(ptr %dest, ptr %p, ptr %q) {187; CHECK-LABEL: @vec_or(188; CHECK-NEXT: entry:189; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4190; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4191; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i16> [[TMP0]], [[TMP1]]192; CHECK-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4193; CHECK-NEXT: ret void194;195; DEFAULT-LABEL: @vec_or(196; DEFAULT-NEXT: entry:197; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4198; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4199; DEFAULT-NEXT: [[TMP2:%.*]] = or <2 x i16> [[TMP0]], [[TMP1]]200; DEFAULT-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4201; DEFAULT-NEXT: ret void202;203entry:204 %e0 = load i16, ptr %p, align 4205 %inc = getelementptr inbounds i16, ptr %p, i64 1206 %e1 = load i16, ptr %inc, align 2207 208 %f0 = load i16, ptr %q, align 4209 %inq = getelementptr inbounds i16, ptr %q, i64 1210 %f1 = load i16, ptr %inq, align 2211 212 %a0 = or i16 %e0, %f0213 %a1 = or i16 %e1, %f1214 215 store i16 %a0, ptr %dest, align 4216 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1217 store i16 %a1, ptr %inc2, align 2218 ret void219}220 221define void @vec_sll(ptr %dest, ptr %p, ptr %q) {222; CHECK-LABEL: @vec_sll(223; CHECK-NEXT: entry:224; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4225; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4226; CHECK-NEXT: [[TMP2:%.*]] = shl <2 x i16> [[TMP0]], [[TMP1]]227; CHECK-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4228; CHECK-NEXT: ret void229;230; DEFAULT-LABEL: @vec_sll(231; DEFAULT-NEXT: entry:232; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4233; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4234; DEFAULT-NEXT: [[TMP2:%.*]] = shl <2 x i16> [[TMP0]], [[TMP1]]235; DEFAULT-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4236; DEFAULT-NEXT: ret void237;238entry:239 %e0 = load i16, ptr %p, align 4240 %inc = getelementptr inbounds i16, ptr %p, i64 1241 %e1 = load i16, ptr %inc, align 2242 243 %f0 = load i16, ptr %q, align 4244 %inq = getelementptr inbounds i16, ptr %q, i64 1245 %f1 = load i16, ptr %inq, align 2246 247 %a0 = shl i16 %e0, %f0248 %a1 = shl i16 %e1, %f1249 250 store i16 %a0, ptr %dest, align 4251 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1252 store i16 %a1, ptr %inc2, align 2253 ret void254}255 256declare i16 @llvm.smin.i16(i16, i16)257define void @vec_smin(ptr %dest, ptr %p, ptr %q) {258; CHECK-LABEL: @vec_smin(259; CHECK-NEXT: entry:260; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4261; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4262; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])263; CHECK-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4264; CHECK-NEXT: ret void265;266; DEFAULT-LABEL: @vec_smin(267; DEFAULT-NEXT: entry:268; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4269; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4270; DEFAULT-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])271; DEFAULT-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4272; DEFAULT-NEXT: ret void273;274entry:275 %e0 = load i16, ptr %p, align 4276 %inc = getelementptr inbounds i16, ptr %p, i64 1277 %e1 = load i16, ptr %inc, align 2278 279 %f0 = load i16, ptr %q, align 4280 %inq = getelementptr inbounds i16, ptr %q, i64 1281 %f1 = load i16, ptr %inq, align 2282 283 %a0 = tail call i16 @llvm.smin.i16(i16 %e0, i16 %f0)284 %a1 = tail call i16 @llvm.smin.i16(i16 %e1, i16 %f1)285 286 store i16 %a0, ptr %dest, align 4287 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1288 store i16 %a1, ptr %inc2, align 2289 ret void290}291 292declare i16 @llvm.umax.i16(i16, i16)293define void @vec_umax(ptr %dest, ptr %p, ptr %q) {294; CHECK-LABEL: @vec_umax(295; CHECK-NEXT: entry:296; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4297; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4298; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])299; CHECK-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4300; CHECK-NEXT: ret void301;302; DEFAULT-LABEL: @vec_umax(303; DEFAULT-NEXT: entry:304; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4305; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4306; DEFAULT-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])307; DEFAULT-NEXT: store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4308; DEFAULT-NEXT: ret void309;310entry:311 %e0 = load i16, ptr %p, align 4312 %inc = getelementptr inbounds i16, ptr %p, i64 1313 %e1 = load i16, ptr %inc, align 2314 315 %f0 = load i16, ptr %q, align 4316 %inq = getelementptr inbounds i16, ptr %q, i64 1317 %f1 = load i16, ptr %inq, align 2318 319 %a0 = tail call i16 @llvm.umax.i16(i16 %e0, i16 %f0)320 %a1 = tail call i16 @llvm.umax.i16(i16 %e1, i16 %f1)321 322 store i16 %a0, ptr %dest, align 4323 %inc2 = getelementptr inbounds i16, ptr %dest, i64 1324 store i16 %a1, ptr %inc2, align 2325 ret void326}327