| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes=slp-vectorizer -mtriple=riscv64 -mattr=+m,+v,+zvl128b \ |
| ; RUN: -riscv-v-register-bit-width-lmul=1 -slp-threshold=-100 < %s | FileCheck %s |
| |
| %pair = type { i64, i64 } |
| %quad = type { i32, i32, i32, i32 } |
| |
| define %pair @insertvalue_elt_size_i64x2(ptr %a, ptr %b) { |
| ; CHECK-LABEL: define %pair @insertvalue_elt_size_i64x2( |
| ; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0:[0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[A]], align 8 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[B]], align 8 |
| ; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> [[TMP0]], [[TMP1]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i64> [[TMP2]], i64 0 |
| ; CHECK-NEXT: [[IV0:%.*]] = insertvalue [[PAIR:%.*]] poison, i64 [[TMP3]], 0 |
| ; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i64> [[TMP2]], i64 1 |
| ; CHECK-NEXT: [[IV1:%.*]] = insertvalue [[PAIR]] [[IV0]], i64 [[TMP4]], 1 |
| ; CHECK-NEXT: ret [[PAIR]] [[IV1]] |
| ; |
| entry: |
| %a0 = load i64, ptr %a, align 8 |
| %a.gep1 = getelementptr inbounds i64, ptr %a, i64 1 |
| %a1 = load i64, ptr %a.gep1, align 8 |
| %b0 = load i64, ptr %b, align 8 |
| %b.gep1 = getelementptr inbounds i64, ptr %b, i64 1 |
| %b1 = load i64, ptr %b.gep1, align 8 |
| %s0 = add i64 %a0, %b0 |
| %s1 = add i64 %a1, %b1 |
| %iv0 = insertvalue %pair poison, i64 %s0, 0 |
| %iv1 = insertvalue %pair %iv0, i64 %s1, 1 |
| ret %pair %iv1 |
| } |
| |
| define %quad @insertvalue_elt_size_i32x4(ptr %a, ptr %b) { |
| ; CHECK-LABEL: define %quad @insertvalue_elt_size_i32x4( |
| ; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[A]], align 4 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[B]], align 4 |
| ; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[TMP0]], [[TMP1]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i32> [[TMP2]], i64 0 |
| ; CHECK-NEXT: [[IV0:%.*]] = insertvalue [[QUAD:%.*]] poison, i32 [[TMP3]], 0 |
| ; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i32> [[TMP2]], i64 1 |
| ; CHECK-NEXT: [[IV1:%.*]] = insertvalue [[QUAD]] [[IV0]], i32 [[TMP4]], 1 |
| ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[TMP2]], i64 2 |
| ; CHECK-NEXT: [[IV2:%.*]] = insertvalue [[QUAD]] [[IV1]], i32 [[TMP5]], 2 |
| ; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i32> [[TMP2]], i64 3 |
| ; CHECK-NEXT: [[IV3:%.*]] = insertvalue [[QUAD]] [[IV2]], i32 [[TMP6]], 3 |
| ; CHECK-NEXT: ret [[QUAD]] [[IV3]] |
| ; |
| entry: |
| %a0 = load i32, ptr %a, align 4 |
| %a.gep1 = getelementptr inbounds i32, ptr %a, i64 1 |
| %a1 = load i32, ptr %a.gep1, align 4 |
| %a.gep2 = getelementptr inbounds i32, ptr %a, i64 2 |
| %a2 = load i32, ptr %a.gep2, align 4 |
| %a.gep3 = getelementptr inbounds i32, ptr %a, i64 3 |
| %a3 = load i32, ptr %a.gep3, align 4 |
| %b0 = load i32, ptr %b, align 4 |
| %b.gep1 = getelementptr inbounds i32, ptr %b, i64 1 |
| %b1 = load i32, ptr %b.gep1, align 4 |
| %b.gep2 = getelementptr inbounds i32, ptr %b, i64 2 |
| %b2 = load i32, ptr %b.gep2, align 4 |
| %b.gep3 = getelementptr inbounds i32, ptr %b, i64 3 |
| %b3 = load i32, ptr %b.gep3, align 4 |
| %s0 = add i32 %a0, %b0 |
| %s1 = add i32 %a1, %b1 |
| %s2 = add i32 %a2, %b2 |
| %s3 = add i32 %a3, %b3 |
| %iv0 = insertvalue %quad poison, i32 %s0, 0 |
| %iv1 = insertvalue %quad %iv0, i32 %s1, 1 |
| %iv2 = insertvalue %quad %iv1, i32 %s2, 2 |
| %iv3 = insertvalue %quad %iv2, i32 %s3, 3 |
| ret %quad %iv3 |
| } |
| |
| |