Skip to content

Commit e218140

Browse files
authored
[RISCV][llvm] Correct shamt in P extension EXTRACT_VECTOR_ELT lowering (#169823)
During operation legalization, element type should have been turn into XLenVT which makes the SHL a no-op. We need to use exact vector element type instead.
1 parent 6369279 commit e218140

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10743,7 +10743,7 @@ SDValue RISCVTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
1074310743
VecVT != MVT::v4i8 && VecVT != MVT::v2i32)
1074410744
return SDValue();
1074510745
SDValue Extracted = DAG.getBitcast(XLenVT, Vec);
10746-
unsigned ElemWidth = EltVT.getSizeInBits();
10746+
unsigned ElemWidth = VecVT.getVectorElementType().getSizeInBits();
1074710747
SDValue Shamt = DAG.getNode(ISD::MUL, DL, XLenVT, Idx,
1074810748
DAG.getConstant(ElemWidth, DL, XLenVT));
1074910749
return DAG.getNode(ISD::SRL, DL, XLenVT, Extracted, Shamt);

llvm/test/CodeGen/RISCV/rvp-ext-rv32.ll

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,25 @@ define void @test_extract_vector_16(ptr %ret_ptr, ptr %a_ptr) {
484484
ret void
485485
}
486486

487+
define void @test_extract_vector_16_elem1(ptr %ret_ptr, ptr %a_ptr) {
488+
; CHECK-RV32-LABEL: test_extract_vector_16_elem1:
489+
; CHECK-RV32: # %bb.0:
490+
; CHECK-RV32-NEXT: lhu a1, 2(a1)
491+
; CHECK-RV32-NEXT: sh a1, 0(a0)
492+
; CHECK-RV32-NEXT: ret
493+
;
494+
; CHECK-RV64-LABEL: test_extract_vector_16_elem1:
495+
; CHECK-RV64: # %bb.0:
496+
; CHECK-RV64-NEXT: lw a1, 0(a1)
497+
; CHECK-RV64-NEXT: srli a1, a1, 16
498+
; CHECK-RV64-NEXT: sh a1, 0(a0)
499+
; CHECK-RV64-NEXT: ret
500+
%a = load <2 x i16>, ptr %a_ptr
501+
%extracted = extractelement <2 x i16> %a, i32 1
502+
store i16 %extracted, ptr %ret_ptr
503+
ret void
504+
}
505+
487506
define void @test_extract_vector_8(ptr %ret_ptr, ptr %a_ptr) {
488507
; CHECK-LABEL: test_extract_vector_8:
489508
; CHECK: # %bb.0:
@@ -496,6 +515,19 @@ define void @test_extract_vector_8(ptr %ret_ptr, ptr %a_ptr) {
496515
ret void
497516
}
498517

518+
define void @test_extract_vector_8_elem1(ptr %ret_ptr, ptr %a_ptr) {
519+
; CHECK-LABEL: test_extract_vector_8_elem1:
520+
; CHECK: # %bb.0:
521+
; CHECK-NEXT: lw a1, 0(a1)
522+
; CHECK-NEXT: srli a1, a1, 8
523+
; CHECK-NEXT: sb a1, 0(a0)
524+
; CHECK-NEXT: ret
525+
%a = load <4 x i8>, ptr %a_ptr
526+
%extracted = extractelement <4 x i8> %a, i32 1
527+
store i8 %extracted, ptr %ret_ptr
528+
ret void
529+
}
530+
499531
; Test for splat
500532
define void @test_non_const_splat_i8(ptr %ret_ptr, ptr %a_ptr, i8 %elt) {
501533
; CHECK-LABEL: test_non_const_splat_i8:

llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,18 @@ define void @test_extract_vector_32(ptr %ret_ptr, ptr %a_ptr) {
495495
ret void
496496
}
497497

498+
define void @test_extract_vector_32_elem1(ptr %ret_ptr, ptr %a_ptr) {
499+
; CHECK-LABEL: test_extract_vector_32_elem1:
500+
; CHECK: # %bb.0:
501+
; CHECK-NEXT: lw a1, 4(a1)
502+
; CHECK-NEXT: sw a1, 0(a0)
503+
; CHECK-NEXT: ret
504+
%a = load <2 x i32>, ptr %a_ptr
505+
%extracted = extractelement <2 x i32> %a, i32 1
506+
store i32 %extracted, ptr %ret_ptr
507+
ret void
508+
}
509+
498510
; Test basic add/sub operations for v2i32 (RV64 only)
499511
define void @test_padd_w(ptr %ret_ptr, ptr %a_ptr, ptr %b_ptr) {
500512
; CHECK-LABEL: test_padd_w:

0 commit comments

Comments
 (0)