|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -passes=slp-vectorizer -S -mtriple=riscv64 --mattr=+v,+zvl256b -slp-threshold=-7 < %s | FileCheck %s |
| 3 | + |
| 4 | +define void @splat_trim(ptr %A, ptr %C, ptr %D, ptr %F, ptr %S, ptr %E, ptr %B) { |
| 5 | +; CHECK-LABEL: define void @splat_trim( |
| 6 | +; CHECK-SAME: ptr [[A:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], ptr [[F:%.*]], ptr [[S:%.*]], ptr [[E:%.*]], ptr [[B:%.*]]) #[[ATTR0:[0-9]+]] { |
| 7 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 8 | +; CHECK-NEXT: [[A0:%.*]] = load i64, ptr [[A]], align 8 |
| 9 | +; CHECK-NEXT: [[B0:%.*]] = load i64, ptr [[B]], align 8 |
| 10 | +; CHECK-NEXT: [[C0:%.*]] = load i64, ptr [[C]], align 8 |
| 11 | +; CHECK-NEXT: [[D0:%.*]] = load i64, ptr [[D]], align 8 |
| 12 | +; CHECK-NEXT: [[E0:%.*]] = load i64, ptr [[E]], align 8 |
| 13 | +; CHECK-NEXT: [[F0:%.*]] = load i64, ptr [[F]], align 8 |
| 14 | +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A0]], i64 0 |
| 15 | +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B0]], i64 1 |
| 16 | +; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> splat (i64 1), [[TMP1]] |
| 17 | +; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i64> [[TMP2]], i64 1 |
| 18 | +; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i64> [[TMP2]], i64 0 |
| 19 | +; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[E0]], i64 0 |
| 20 | +; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[B0]], i64 1 |
| 21 | +; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> splat (i64 1), [[TMP5]] |
| 22 | +; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i64> [[TMP6]], <2 x i64> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 0> |
| 23 | +; CHECK-NEXT: [[AS2:%.*]] = add i64 [[TMP8]], [[TMP7]] |
| 24 | +; CHECK-NEXT: [[AS3:%.*]] = sub i64 [[TMP8]], [[TMP7]] |
| 25 | +; CHECK-NEXT: [[SH2:%.*]] = lshr i64 [[AS2]], [[E0]] |
| 26 | +; CHECK-NEXT: [[SH3:%.*]] = shl i64 [[AS3]], [[F0]] |
| 27 | +; CHECK-NEXT: [[AS13:%.*]] = sub i64 [[SH2]], [[E0]] |
| 28 | +; CHECK-NEXT: [[AS12:%.*]] = add i64 [[SH3]], [[F0]] |
| 29 | +; CHECK-NEXT: [[TMP23:%.*]] = insertelement <2 x i64> poison, i64 [[TMP8]], i64 0 |
| 30 | +; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <2 x i64> [[TMP23]], <2 x i64> poison, <2 x i32> zeroinitializer |
| 31 | +; CHECK-NEXT: [[TMP24:%.*]] = insertelement <2 x i64> poison, i64 [[TMP7]], i64 0 |
| 32 | +; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <2 x i64> [[TMP24]], <2 x i64> poison, <2 x i32> zeroinitializer |
| 33 | +; CHECK-NEXT: [[TMP11:%.*]] = add <2 x i64> [[TMP9]], [[TMP10]] |
| 34 | +; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i64> poison, i64 [[C0]], i64 0 |
| 35 | +; CHECK-NEXT: [[TMP13:%.*]] = insertelement <2 x i64> [[TMP12]], i64 [[D0]], i64 1 |
| 36 | +; CHECK-NEXT: [[TMP14:%.*]] = shl <2 x i64> [[TMP11]], [[TMP13]] |
| 37 | +; CHECK-NEXT: [[TMP15:%.*]] = lshr <2 x i64> [[TMP11]], [[TMP13]] |
| 38 | +; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <2 x i64> [[TMP14]], <2 x i64> [[TMP15]], <2 x i32> <i32 0, i32 3> |
| 39 | +; CHECK-NEXT: [[TMP17:%.*]] = add <2 x i64> [[TMP16]], [[TMP13]] |
| 40 | +; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <2 x i64> [[TMP17]], <2 x i64> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| 41 | +; CHECK-NEXT: [[TMP19:%.*]] = insertelement <4 x i64> [[TMP18]], i64 [[AS12]], i64 2 |
| 42 | +; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i64> [[TMP19]], i64 [[AS13]], i64 3 |
| 43 | +; CHECK-NEXT: [[TMP21:%.*]] = add <4 x i64> [[TMP20]], splat (i64 1) |
| 44 | +; CHECK-NEXT: [[TMP22:%.*]] = add <4 x i64> [[TMP21]], [[TMP3]] |
| 45 | +; CHECK-NEXT: store <4 x i64> [[TMP22]], ptr [[S]], align 8 |
| 46 | +; CHECK-NEXT: ret void |
| 47 | +; |
| 48 | +entry: |
| 49 | + %A0 = load i64, ptr %A, align 8 |
| 50 | + %B0 = load i64, ptr %B, align 8 |
| 51 | + %C0 = load i64, ptr %C, align 8 |
| 52 | + %D0 = load i64, ptr %D, align 8 |
| 53 | + %E0 = load i64, ptr %E, align 8 |
| 54 | + %F0 = load i64, ptr %F, align 8 |
| 55 | + |
| 56 | + %v1 = add i64 1, %A0 |
| 57 | + %v2 = add i64 1, %B0 |
| 58 | + %v3 = add i64 1, %E0 |
| 59 | + |
| 60 | + %AS0 = add i64 %v1, %v2 |
| 61 | + %AS1 = add i64 %v1, %v2 |
| 62 | + %AS2 = add i64 %v1, %v2 |
| 63 | + %AS3 = sub i64 %v1, %v2 |
| 64 | + |
| 65 | + %Sh0 = shl i64 %AS0, %C0 |
| 66 | + %Sh1 = lshr i64 %AS1, %D0 |
| 67 | + %Sh2 = lshr i64 %AS2, %E0 |
| 68 | + %Sh3 = shl i64 %AS3, %F0 |
| 69 | + |
| 70 | + %AS10 = add i64 %Sh0, %C0 |
| 71 | + %AS11 = add i64 %Sh1, %D0 |
| 72 | + %AS12 = add i64 %Sh3, %F0 |
| 73 | + %AS13 = sub i64 %Sh2, %E0 |
| 74 | + |
| 75 | + %AS20 = add i64 %AS10, 1 |
| 76 | + %AS21 = add i64 %AS11, 1 |
| 77 | + %AS22 = add i64 %AS12, 1 |
| 78 | + %AS23 = add i64 %AS13, 1 |
| 79 | + |
| 80 | + %Add0 = add i64 %AS20, %v3 |
| 81 | + %Add1 = add i64 %AS21, %v2 |
| 82 | + %Add2 = add i64 %AS22, %v3 |
| 83 | + %Add3 = add i64 %AS23, %v3 |
| 84 | + |
| 85 | + %idxS1 = getelementptr inbounds i64, ptr %S, i64 1 |
| 86 | + %idxS2 = getelementptr inbounds i64, ptr %S, i64 2 |
| 87 | + %idxS3 = getelementptr inbounds i64, ptr %S, i64 3 |
| 88 | + |
| 89 | + store i64 %Add0, ptr %S, align 8 |
| 90 | + store i64 %Add1, ptr %idxS1, align 8 |
| 91 | + store i64 %Add2, ptr %idxS2, align 8 |
| 92 | + store i64 %Add3, ptr %idxS3, align 8 |
| 93 | + ret void |
| 94 | +} |
0 commit comments