brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.2 KiB · d9a9e9b Raw
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