diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp index 22cae389cc335..7f3510727dbce 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp @@ -183,6 +183,12 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) getActionDefinitionsBuilder(G_BITREVERSE).maxScalar(0, sXLen).lower(); + getActionDefinitionsBuilder(G_BITCAST).legalIf( + all(LegalityPredicates::any(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST), + typeIsLegalBoolVec(0, BoolVecTys, ST)), + LegalityPredicates::any(typeIsLegalIntOrFPVec(1, IntOrFPVecTys, ST), + typeIsLegalBoolVec(1, BoolVecTys, ST)))); + auto &BSWAPActions = getActionDefinitionsBuilder(G_BSWAP); if (ST.hasStdExtZbb() || ST.hasStdExtZbkb()) BSWAPActions.legalFor({sXLen}).clampScalar(0, sXLen, sXLen); diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-bitcast.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-bitcast.mir new file mode 100644 index 0000000000000..7b5d56864a340 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-bitcast.mir @@ -0,0 +1,356 @@ +# 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 +# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: bitcast_nxv1i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv1i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv2i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv2i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv4i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv4i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv8i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv8i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv16i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv16i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m2 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m2 = COPY %1() + PseudoRET implicit $v8m2 +... +--- +name: bitcast_nxv32i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv32i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m4 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m4 = COPY %1() + PseudoRET implicit $v8m4 +... +--- +name: bitcast_nxv64i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv64i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m8 = COPY %1() + PseudoRET implicit $v8m8 +... +--- +name: bitcast_nxv1i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv1i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv2i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv2i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv4i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv4i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv8i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv8i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m2 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m2 = COPY %1() + PseudoRET implicit $v8m2 +... +--- +name: bitcast_nxv16i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv16i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m4 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m4 = COPY %1() + PseudoRET implicit $v8m4 +... +--- +name: bitcast_nxv32i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv32i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m8 = COPY %1() + PseudoRET implicit $v8m8 +... +--- +name: bitcast_nxv1i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv1i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv2i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv2i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv4i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv4i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m2 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m2 = COPY %1() + PseudoRET implicit $v8m2 +... +--- +name: bitcast_nxv8i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv8i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m4 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m4 = COPY %1() + PseudoRET implicit $v8m4 +... +--- +name: bitcast_nxv16i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv16i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m8 = COPY %1() + PseudoRET implicit $v8m8 +... +--- +name: bitcast_nxv1i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv1i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8 = COPY %1() + PseudoRET implicit $v8 +... +--- +name: bitcast_nxv2i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv2i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m2 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m2 = COPY %1() + PseudoRET implicit $v8m2 +... +--- +name: bitcast_nxv4i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv4i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m4 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m4 = COPY %1() + PseudoRET implicit $v8m4 +... +--- +name: bitcast_nxv8i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: bitcast_nxv8i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_() = G_BITCAST [[DEF]]() + ; CHECK-NEXT: $v8m8 = COPY [[BITCAST]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + %1:_() = G_BITCAST %0() + $v8m8 = COPY %1() + PseudoRET implicit $v8m8 +...