xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/RISCV/load-binop-store.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
19855fe45SBen Shi; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
29855fe45SBen Shi; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \
39855fe45SBen Shi; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 -S | FileCheck %s --check-prefixes=CHECK
49855fe45SBen Shi; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v -S | FileCheck %s --check-prefixes=DEFAULT
59855fe45SBen Shi
69855fe45SBen Shidefine void @vec_add(ptr %dest, ptr %p) {
79855fe45SBen Shi; CHECK-LABEL: @vec_add(
89855fe45SBen Shi; CHECK-NEXT:  entry:
99855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
10*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)
119855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
129855fe45SBen Shi; CHECK-NEXT:    ret void
139855fe45SBen Shi;
149855fe45SBen Shi; DEFAULT-LABEL: @vec_add(
159855fe45SBen Shi; DEFAULT-NEXT:  entry:
167f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
17*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)
187f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
199855fe45SBen Shi; DEFAULT-NEXT:    ret void
209855fe45SBen Shi;
219855fe45SBen Shientry:
229855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
239855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
249855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
259855fe45SBen Shi
269855fe45SBen Shi  %a0 = add i16 %e0, 1
279855fe45SBen Shi  %a1 = add i16 %e1, 1
289855fe45SBen Shi
299855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
309855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
319855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
329855fe45SBen Shi  ret void
339855fe45SBen Shi}
349855fe45SBen Shi
359855fe45SBen Shidefine void @vec_sub(ptr %dest, ptr %p) {
369855fe45SBen Shi; CHECK-LABEL: @vec_sub(
379855fe45SBen Shi; CHECK-NEXT:  entry:
389855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
39*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = sub <2 x i16> [[TMP0]], splat (i16 17)
409855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
419855fe45SBen Shi; CHECK-NEXT:    ret void
429855fe45SBen Shi;
439855fe45SBen Shi; DEFAULT-LABEL: @vec_sub(
449855fe45SBen Shi; DEFAULT-NEXT:  entry:
457f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
46*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = sub <2 x i16> [[TMP0]], splat (i16 17)
477f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
489855fe45SBen Shi; DEFAULT-NEXT:    ret void
499855fe45SBen Shi;
509855fe45SBen Shientry:
519855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
529855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
539855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
549855fe45SBen Shi
559855fe45SBen Shi  %a0 = sub i16 %e0, 17
569855fe45SBen Shi  %a1 = sub i16 %e1, 17
579855fe45SBen Shi
589855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
599855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
609855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
619855fe45SBen Shi  ret void
629855fe45SBen Shi}
639855fe45SBen Shi
649855fe45SBen Shidefine void @vec_rsub(ptr %dest, ptr %p) {
659855fe45SBen Shi; CHECK-LABEL: @vec_rsub(
669855fe45SBen Shi; CHECK-NEXT:  entry:
679855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
68*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = sub <2 x i16> splat (i16 29), [[TMP0]]
699855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
709855fe45SBen Shi; CHECK-NEXT:    ret void
719855fe45SBen Shi;
729855fe45SBen Shi; DEFAULT-LABEL: @vec_rsub(
739855fe45SBen Shi; DEFAULT-NEXT:  entry:
747f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
75*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = sub <2 x i16> splat (i16 29), [[TMP0]]
767f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
779855fe45SBen Shi; DEFAULT-NEXT:    ret void
789855fe45SBen Shi;
799855fe45SBen Shientry:
809855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
819855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
829855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
839855fe45SBen Shi
849855fe45SBen Shi  %a0 = sub i16 29, %e0
859855fe45SBen Shi  %a1 = sub i16 29, %e1
869855fe45SBen Shi
879855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
889855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
899855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
909855fe45SBen Shi  ret void
919855fe45SBen Shi}
929855fe45SBen Shi
939855fe45SBen Shidefine void @vec_mul(ptr %dest, ptr %p) {
949855fe45SBen Shi; CHECK-LABEL: @vec_mul(
959855fe45SBen Shi; CHECK-NEXT:  entry:
969855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
97*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = mul <2 x i16> [[TMP0]], splat (i16 7)
989855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
999855fe45SBen Shi; CHECK-NEXT:    ret void
1009855fe45SBen Shi;
1019855fe45SBen Shi; DEFAULT-LABEL: @vec_mul(
1029855fe45SBen Shi; DEFAULT-NEXT:  entry:
1037f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
104*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = mul <2 x i16> [[TMP0]], splat (i16 7)
1057f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
1069855fe45SBen Shi; DEFAULT-NEXT:    ret void
1079855fe45SBen Shi;
1089855fe45SBen Shientry:
1099855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
1109855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
1119855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
1129855fe45SBen Shi
1139855fe45SBen Shi  %a0 = mul i16 %e0, 7
1149855fe45SBen Shi  %a1 = mul i16 %e1, 7
1159855fe45SBen Shi
1169855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
1179855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
1189855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
1199855fe45SBen Shi  ret void
1209855fe45SBen Shi}
1219855fe45SBen Shi
1229855fe45SBen Shidefine void @vec_sdiv(ptr %dest, ptr %p) {
1239855fe45SBen Shi; CHECK-LABEL: @vec_sdiv(
1249855fe45SBen Shi; CHECK-NEXT:  entry:
1259855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
126*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = sdiv <2 x i16> [[TMP0]], splat (i16 7)
1279855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
1289855fe45SBen Shi; CHECK-NEXT:    ret void
1299855fe45SBen Shi;
1309855fe45SBen Shi; DEFAULT-LABEL: @vec_sdiv(
1319855fe45SBen Shi; DEFAULT-NEXT:  entry:
1327f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
133*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = sdiv <2 x i16> [[TMP0]], splat (i16 7)
1347f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
1359855fe45SBen Shi; DEFAULT-NEXT:    ret void
1369855fe45SBen Shi;
1379855fe45SBen Shientry:
1389855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
1399855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
1409855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
1419855fe45SBen Shi
1429855fe45SBen Shi  %a0 = sdiv i16 %e0, 7
1439855fe45SBen Shi  %a1 = sdiv i16 %e1, 7
1449855fe45SBen Shi
1459855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
1469855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
1479855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
1489855fe45SBen Shi  ret void
1499855fe45SBen Shi}
1509855fe45SBen Shi
1519855fe45SBen Shidefine void @vec_and(ptr %dest, ptr %p, ptr %q) {
1529855fe45SBen Shi; CHECK-LABEL: @vec_and(
1539855fe45SBen Shi; CHECK-NEXT:  entry:
1549855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
1559855fe45SBen Shi; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
1569855fe45SBen Shi; CHECK-NEXT:    [[TMP2:%.*]] = and <2 x i16> [[TMP0]], [[TMP1]]
1579855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
1589855fe45SBen Shi; CHECK-NEXT:    ret void
1599855fe45SBen Shi;
1609855fe45SBen Shi; DEFAULT-LABEL: @vec_and(
1619855fe45SBen Shi; DEFAULT-NEXT:  entry:
1627f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
1637f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
1647f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP2:%.*]] = and <2 x i16> [[TMP0]], [[TMP1]]
1657f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
1669855fe45SBen Shi; DEFAULT-NEXT:    ret void
1679855fe45SBen Shi;
1689855fe45SBen Shientry:
1699855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
1709855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
1719855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
1729855fe45SBen Shi
1739855fe45SBen Shi  %f0 = load i16, ptr %q, align 4
1749855fe45SBen Shi  %inq = getelementptr inbounds i16, ptr %q, i64 1
1759855fe45SBen Shi  %f1 = load i16, ptr %inq, align 2
1769855fe45SBen Shi
1779855fe45SBen Shi  %a0 = and i16 %e0, %f0
1789855fe45SBen Shi  %a1 = and i16 %e1, %f1
1799855fe45SBen Shi
1809855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
1819855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
1829855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
1839855fe45SBen Shi  ret void
1849855fe45SBen Shi}
1859855fe45SBen Shi
1869855fe45SBen Shidefine void @vec_or(ptr %dest, ptr %p, ptr %q) {
1879855fe45SBen Shi; CHECK-LABEL: @vec_or(
1889855fe45SBen Shi; CHECK-NEXT:  entry:
1899855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
1909855fe45SBen Shi; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
1919855fe45SBen Shi; CHECK-NEXT:    [[TMP2:%.*]] = or <2 x i16> [[TMP0]], [[TMP1]]
1929855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
1939855fe45SBen Shi; CHECK-NEXT:    ret void
1949855fe45SBen Shi;
1959855fe45SBen Shi; DEFAULT-LABEL: @vec_or(
1969855fe45SBen Shi; DEFAULT-NEXT:  entry:
1977f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
1987f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
1997f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP2:%.*]] = or <2 x i16> [[TMP0]], [[TMP1]]
2007f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
2019855fe45SBen Shi; DEFAULT-NEXT:    ret void
2029855fe45SBen Shi;
2039855fe45SBen Shientry:
2049855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
2059855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
2069855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
2079855fe45SBen Shi
2089855fe45SBen Shi  %f0 = load i16, ptr %q, align 4
2099855fe45SBen Shi  %inq = getelementptr inbounds i16, ptr %q, i64 1
2109855fe45SBen Shi  %f1 = load i16, ptr %inq, align 2
2119855fe45SBen Shi
2129855fe45SBen Shi  %a0 = or i16 %e0, %f0
2139855fe45SBen Shi  %a1 = or i16 %e1, %f1
2149855fe45SBen Shi
2159855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
2169855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
2179855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
2189855fe45SBen Shi  ret void
2199855fe45SBen Shi}
2209855fe45SBen Shi
2219855fe45SBen Shidefine void @vec_sll(ptr %dest, ptr %p, ptr %q) {
2229855fe45SBen Shi; CHECK-LABEL: @vec_sll(
2239855fe45SBen Shi; CHECK-NEXT:  entry:
2249855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
2259855fe45SBen Shi; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
2269855fe45SBen Shi; CHECK-NEXT:    [[TMP2:%.*]] = shl <2 x i16> [[TMP0]], [[TMP1]]
2279855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
2289855fe45SBen Shi; CHECK-NEXT:    ret void
2299855fe45SBen Shi;
2309855fe45SBen Shi; DEFAULT-LABEL: @vec_sll(
2319855fe45SBen Shi; DEFAULT-NEXT:  entry:
2327f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
2337f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
2347f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP2:%.*]] = shl <2 x i16> [[TMP0]], [[TMP1]]
2357f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
2369855fe45SBen Shi; DEFAULT-NEXT:    ret void
2379855fe45SBen Shi;
2389855fe45SBen Shientry:
2399855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
2409855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
2419855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
2429855fe45SBen Shi
2439855fe45SBen Shi  %f0 = load i16, ptr %q, align 4
2449855fe45SBen Shi  %inq = getelementptr inbounds i16, ptr %q, i64 1
2459855fe45SBen Shi  %f1 = load i16, ptr %inq, align 2
2469855fe45SBen Shi
2479855fe45SBen Shi  %a0 = shl i16 %e0, %f0
2489855fe45SBen Shi  %a1 = shl i16 %e1, %f1
2499855fe45SBen Shi
2509855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
2519855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
2529855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
2539855fe45SBen Shi  ret void
2549855fe45SBen Shi}
2559855fe45SBen Shi
2569855fe45SBen Shideclare i16 @llvm.smin.i16(i16, i16)
2579855fe45SBen Shidefine void @vec_smin(ptr %dest, ptr %p, ptr %q) {
2589855fe45SBen Shi; CHECK-LABEL: @vec_smin(
2599855fe45SBen Shi; CHECK-NEXT:  entry:
2609855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
2619855fe45SBen Shi; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
2629855fe45SBen Shi; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])
2639855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
2649855fe45SBen Shi; CHECK-NEXT:    ret void
2659855fe45SBen Shi;
2669855fe45SBen Shi; DEFAULT-LABEL: @vec_smin(
2679855fe45SBen Shi; DEFAULT-NEXT:  entry:
2687f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
2697f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
2707f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])
2717f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
2729855fe45SBen Shi; DEFAULT-NEXT:    ret void
2739855fe45SBen Shi;
2749855fe45SBen Shientry:
2759855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
2769855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
2779855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
2789855fe45SBen Shi
2799855fe45SBen Shi  %f0 = load i16, ptr %q, align 4
2809855fe45SBen Shi  %inq = getelementptr inbounds i16, ptr %q, i64 1
2819855fe45SBen Shi  %f1 = load i16, ptr %inq, align 2
2829855fe45SBen Shi
2839855fe45SBen Shi  %a0 = tail call i16 @llvm.smin.i16(i16 %e0, i16 %f0)
2849855fe45SBen Shi  %a1 = tail call i16 @llvm.smin.i16(i16 %e1, i16 %f1)
2859855fe45SBen Shi
2869855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
2879855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
2889855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
2899855fe45SBen Shi  ret void
2909855fe45SBen Shi}
2919855fe45SBen Shi
2929855fe45SBen Shideclare i16 @llvm.umax.i16(i16, i16)
2939855fe45SBen Shidefine void @vec_umax(ptr %dest, ptr %p, ptr %q) {
2949855fe45SBen Shi; CHECK-LABEL: @vec_umax(
2959855fe45SBen Shi; CHECK-NEXT:  entry:
2969855fe45SBen Shi; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
2979855fe45SBen Shi; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
2989855fe45SBen Shi; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])
2999855fe45SBen Shi; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
3009855fe45SBen Shi; CHECK-NEXT:    ret void
3019855fe45SBen Shi;
3029855fe45SBen Shi; DEFAULT-LABEL: @vec_umax(
3039855fe45SBen Shi; DEFAULT-NEXT:  entry:
3047f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
3057f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr [[Q:%.*]], align 4
3067f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[TMP0]], <2 x i16> [[TMP1]])
3077f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP2]], ptr [[DEST:%.*]], align 4
3089855fe45SBen Shi; DEFAULT-NEXT:    ret void
3099855fe45SBen Shi;
3109855fe45SBen Shientry:
3119855fe45SBen Shi  %e0 = load i16, ptr %p, align 4
3129855fe45SBen Shi  %inc = getelementptr inbounds i16, ptr %p, i64 1
3139855fe45SBen Shi  %e1 = load i16, ptr %inc, align 2
3149855fe45SBen Shi
3159855fe45SBen Shi  %f0 = load i16, ptr %q, align 4
3169855fe45SBen Shi  %inq = getelementptr inbounds i16, ptr %q, i64 1
3179855fe45SBen Shi  %f1 = load i16, ptr %inq, align 2
3189855fe45SBen Shi
3199855fe45SBen Shi  %a0 = tail call i16 @llvm.umax.i16(i16 %e0, i16 %f0)
3209855fe45SBen Shi  %a1 = tail call i16 @llvm.umax.i16(i16 %e1, i16 %f1)
3219855fe45SBen Shi
3229855fe45SBen Shi  store i16 %a0, ptr %dest, align 4
3239855fe45SBen Shi  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
3249855fe45SBen Shi  store i16 %a1, ptr %inc2, align 2
3259855fe45SBen Shi  ret void
3269855fe45SBen Shi}
327