diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp index 4e583d96335d9..8c6c57aebff19 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp @@ -74,7 +74,9 @@ static LegalityPredicate typeIsLegalPtrVec(unsigned TypeIdx, LegalityPredicate P = [=, &ST](const LegalityQuery &Query) { return ST.hasVInstructions() && (Query.Types[TypeIdx].getElementCount().getKnownMinValue() != 1 || - ST.getELen() == 64); + ST.getELen() == 64) && + (Query.Types[TypeIdx].getElementCount().getKnownMinValue() != 16 || + Query.Types[TypeIdx].getScalarSizeInBits() == 32); }; return all(typeInSet(TypeIdx, PtrVecTys), P); } @@ -127,6 +129,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) const LLT nxv2p0 = LLT::scalable_vector(2, p0); const LLT nxv4p0 = LLT::scalable_vector(4, p0); const LLT nxv8p0 = LLT::scalable_vector(8, p0); + const LLT nxv16p0 = LLT::scalable_vector(16, p0); using namespace TargetOpcode; @@ -137,7 +140,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32, nxv1s64, nxv2s64, nxv4s64, nxv8s64}; - auto PtrVecTys = {nxv1p0, nxv2p0, nxv4p0, nxv8p0}; + auto PtrVecTys = {nxv1p0, nxv2p0, nxv4p0, nxv8p0, nxv16p0}; getActionDefinitionsBuilder({G_ADD, G_SUB, G_AND, G_OR, G_XOR}) .legalFor({s32, sXLen}) diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv32.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv32.mir new file mode 100644 index 0000000000000..d8fe9b77de432 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv32.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: vload_nxv1ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv1ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 4) + $v8 = COPY %1() + PseudoRET implicit $v8 + +... +--- +name: vload_nxv2ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv2ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 8) + $v8 = COPY %1() + PseudoRET implicit $v8 + +... +--- +name: vload_nxv8ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv8ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8m4 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 32) + $v8m4 = COPY %1() + PseudoRET implicit $v8m4 + +... +--- +name: vload_nxv16ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv16ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8m4 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 64) + $v8m4 = COPY %1() + PseudoRET implicit $v8m8 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv64.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv64.mir new file mode 100644 index 0000000000000..98dee70a42cdb --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load-rv64.mir @@ -0,0 +1,60 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: vload_nxv1ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv1ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 8) + $v8 = COPY %1() + PseudoRET implicit $v8 + +... +--- +name: vload_nxv2ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv2ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 16) + $v8 = COPY %1() + PseudoRET implicit $v8m2 + +... +--- +name: vload_nxv8ptr +body: | + bb.1: + liveins: $x10 + + ; CHECK-LABEL: name: vload_nxv8ptr + ; CHECK: liveins: $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load ()) + ; CHECK-NEXT: $v8m4 = COPY [[LOAD]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_(p0) = COPY $x10 + %1:_() = G_LOAD %0(p0) :: (load (), align 64) + $v8m4 = COPY %1() + PseudoRET implicit $v8m8 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load.mir index 12f218863e400..2023bf7c05565 100644 --- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load.mir +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-load.mir @@ -203,21 +203,6 @@ ret %va } - define @vload_nxv1ptr(ptr %pa) #0 { - %va = load , ptr %pa, align 4 - ret %va - } - - define @vload_nxv2ptr(ptr %pa) #0 { - %va = load , ptr %pa, align 8 - ret %va - } - - define @vload_nxv8ptr(ptr %pa) #0 { - %va = load , ptr %pa, align 32 - ret %va - } - attributes #0 = { "target-features"="+v" } ... @@ -984,60 +969,3 @@ body: | PseudoRET implicit $v8m2 ... ---- -name: vload_nxv1ptr -body: | - bb.1 (%ir-block.0): - liveins: $x10 - - ; CHECK-LABEL: name: vload_nxv1ptr - ; CHECK: liveins: $x10 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load () from %ir.pa) - ; CHECK-NEXT: $v8 = COPY [[LOAD]]() - ; CHECK-NEXT: PseudoRET implicit $v8 - %0:_(p0) = COPY $x10 - %1:_() = G_LOAD %0(p0) :: (load () from %ir.pa) - $v8 = COPY %1() - PseudoRET implicit $v8 - -... ---- -name: vload_nxv2ptr -body: | - bb.1 (%ir-block.0): - liveins: $x10 - - ; CHECK-LABEL: name: vload_nxv2ptr - ; CHECK: liveins: $x10 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load () from %ir.pa) - ; CHECK-NEXT: $v8 = COPY [[LOAD]]() - ; CHECK-NEXT: PseudoRET implicit $v8 - %0:_(p0) = COPY $x10 - %1:_() = G_LOAD %0(p0) :: (load () from %ir.pa) - $v8 = COPY %1() - PseudoRET implicit $v8 - -... ---- -name: vload_nxv8ptr -body: | - bb.1 (%ir-block.0): - liveins: $x10 - - ; CHECK-LABEL: name: vload_nxv8ptr - ; CHECK: liveins: $x10 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_() = G_LOAD [[COPY]](p0) :: (load () from %ir.pa) - ; CHECK-NEXT: $v8m4 = COPY [[LOAD]]() - ; CHECK-NEXT: PseudoRET implicit $v8m4 - %0:_(p0) = COPY $x10 - %1:_() = G_LOAD %0(p0) :: (load () from %ir.pa) - $v8m4 = COPY %1() - PseudoRET implicit $v8m4 - -... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv32.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv32.mir new file mode 100644 index 0000000000000..a93cce6904c2c --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv32.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: vstore_nx1ptr +body: | + bb.1: + liveins: $v8, $x10 + + ; CHECK-LABEL: name: vstore_nx1ptr + ; CHECK: liveins: $v8, $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8 + G_STORE %1(), %0(p0) :: (store (), align 4) + PseudoRET + +... +--- +name: vstore_nx2ptr +body: | + bb.1: + liveins: $x10, $v8 + + ; CHECK-LABEL: name: vstore_nx2ptr + ; CHECK: liveins: $x10, $v8 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8 + G_STORE %1(), %0(p0) :: (store (), align 8) + PseudoRET + +... +--- +name: vstore_nx8ptr +body: | + bb.1: + liveins: $x10, $v8m4 + + ; CHECK-LABEL: name: vstore_nx8ptr + ; CHECK: liveins: $x10, $v8m4 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8m4 + G_STORE %1(), %0(p0) :: (store (), align 32) + PseudoRET + +... +--- +name: vstore_nx16ptr +body: | + bb.1: + liveins: $x10, $v8m8 + + ; CHECK-LABEL: name: vstore_nx16ptr + ; CHECK: liveins: $x10, $v8m8 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store (), align 64) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8m8 + G_STORE %1(), %0(p0) :: (store (), align 64) + PseudoRET + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv64.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv64.mir new file mode 100644 index 0000000000000..3373ed4d28746 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store-rv64.mir @@ -0,0 +1,60 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: vstore_nx1ptr +body: | + bb.1: + liveins: $v8, $x10 + + ; CHECK-LABEL: name: vstore_nx1ptr + ; CHECK: liveins: $v8, $x10 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8 + G_STORE %1(), %0(p0) :: (store (), align 8) + PseudoRET + +... +--- +name: vstore_nx2ptr +body: | + bb.1: + liveins: $x10, $v8m2 + + ; CHECK-LABEL: name: vstore_nx2ptr + ; CHECK: liveins: $x10, $v8m2 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8m2 + G_STORE %1(), %0(p0) :: (store (), align 16) + PseudoRET + +... +--- +name: vstore_nx8ptr +body: | + bb.1: + liveins: $x10, $v8m8 + + ; CHECK-LABEL: name: vstore_nx8ptr + ; CHECK: liveins: $x10, $v8m8 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store ()) + ; CHECK-NEXT: PseudoRET + %0:_(p0) = COPY $x10 + %1:_() = COPY $v8m8 + G_STORE %1(), %0(p0) :: (store (), align 64) + PseudoRET + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store.mir index b91d25509646f..4bb4eb5fa0c72 100644 --- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store.mir +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-store.mir @@ -203,21 +203,6 @@ ret void } - define void @vstore_nx1ptr(ptr %pa, %b) #0 { - store %b, ptr %pa, align 4 - ret void - } - - define void @vstore_nx2ptr(ptr %pa, %b) #0 { - store %b, ptr %pa, align 8 - ret void - } - - define void @vstore_nx8ptr(ptr %pa, %b) #0 { - store %b, ptr %pa, align 32 - ret void - } - attributes #0 = { "target-features"="+v" } ... @@ -984,60 +969,3 @@ body: | PseudoRET ... ---- -name: vstore_nx1ptr -body: | - bb.1 (%ir-block.0): - liveins: $v8, $x10 - - ; CHECK-LABEL: name: vstore_nx1ptr - ; CHECK: liveins: $v8, $x10 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 - ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) - ; CHECK-NEXT: PseudoRET - %0:_(p0) = COPY $x10 - %1:_() = COPY $v8 - G_STORE %1(), %0(p0) :: (store () into %ir.pa) - PseudoRET - -... ---- -name: vstore_nx2ptr -body: | - bb.1 (%ir-block.0): - liveins: $x10, $v8m2 - - ; CHECK-LABEL: name: vstore_nx2ptr - ; CHECK: liveins: $x10, $v8m2 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 - ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) - ; CHECK-NEXT: PseudoRET - %0:_(p0) = COPY $x10 - %1:_() = COPY $v8m2 - G_STORE %1(), %0(p0) :: (store () into %ir.pa) - PseudoRET - -... ---- -name: vstore_nx8ptr -body: | - bb.1 (%ir-block.0): - liveins: $x10, $v8m8 - - ; CHECK-LABEL: name: vstore_nx8ptr - ; CHECK: liveins: $x10, $v8m8 - ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 - ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 - ; CHECK-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) - ; CHECK-NEXT: PseudoRET - %0:_(p0) = COPY $x10 - %1:_() = COPY $v8m8 - G_STORE %1(), %0(p0) :: (store () into %ir.pa) - PseudoRET - -...