diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp --- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "RISCVLegalizerInfo.h" +#include "RISCVSubtarget.h" #include "llvm/CodeGen/TargetOpcodes.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/IR/DerivedTypes.h" @@ -19,5 +20,67 @@ using namespace llvm; RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) { + const LLT s1 = LLT::scalar(1); + const LLT s128 = LLT::scalar(128); + + const unsigned XLen = ST.getXLen(); + const LLT XLenLLT = LLT::scalar(XLen); + + using namespace TargetOpcode; + + getActionDefinitionsBuilder({G_ADD, G_SUB, G_AND, G_OR, G_XOR}) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT); + + getActionDefinitionsBuilder({G_SHL, G_ASHR, G_LSHR}) + .legalFor({XLenLLT, XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT) + .clampScalar(1, XLenLLT, XLenLLT); + + getActionDefinitionsBuilder({G_UADDO, G_UADDE, G_USUBO, G_USUBE}) + .lowerFor({{XLenLLT, s1}}); + + if (ST.hasStdExtM()) { + if (ST.is64Bit()) { + getActionDefinitionsBuilder({G_MUL, G_SDIV, G_SREM, G_UDIV, G_UREM}) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT); + } else { + getActionDefinitionsBuilder({G_MUL, G_SDIV, G_SREM, G_UDIV, G_UREM}) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT) + .libcallFor({s128}); + } + + getActionDefinitionsBuilder(G_UMULO).lowerFor({{XLenLLT, s1}}); + + // clang-format off + getActionDefinitionsBuilder(G_UMULH) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT); + // clang-format on + } else { + getActionDefinitionsBuilder({G_MUL, G_SDIV, G_SREM, G_UDIV, G_UREM}) + .clampScalar(0, XLenLLT, XLenLLT) + .libcall(); + } + + getActionDefinitionsBuilder({G_ICMP, G_SELECT}) + .legalFor({XLenLLT, XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT) + .clampScalar(1, XLenLLT, XLenLLT); + + getActionDefinitionsBuilder(G_CONSTANT) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT) + .maxScalar(1, XLenLLT); + + getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT}) + .legalFor({XLenLLT}) + .clampScalar(0, XLenLLT, XLenLLT) + .maxScalar(1, XLenLLT); + + getActionDefinitionsBuilder(G_SEXT_INREG).lower(); + getLegacyLegalizerInfo().computeTables(); } diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-add.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-add.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-add.mir @@ -0,0 +1,91 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: add_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[ADD]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s16) = G_TRUNC %0(s32) + %3:_(s16) = G_TRUNC %1(s32) + %4:_(s16) = G_ADD %3, %4 + %5:_(s32) = G_ANYEXT %4(s16) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: add_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[COPY2]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY1]], [[COPY3]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s32) + ; CHECK-NEXT: $x11 = COPY [[ADD2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_ADD %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: add_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[COPY1]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD2]](s32), [[COPY1]] + ; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ICMP1]], [[C1]] + ; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[ADD3]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s32) + ; CHECK-NEXT: $x11 = COPY [[ADD2]](s32) + ; CHECK-NEXT: $x12 = COPY [[ADD4]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_ADD %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-and.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-and.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-and.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: and_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_AND %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: and_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s32) + ; CHECK-NEXT: $x11 = COPY [[AND1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_AND %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: and_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s32) + ; CHECK-NEXT: $x11 = COPY [[AND1]](s32) + ; CHECK-NEXT: $x12 = COPY [[AND2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_AND %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-cmp.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-cmp.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-cmp.mir @@ -0,0 +1,36 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: test_icmp +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_icmp + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) + ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32) + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(sge), [[COPY]](s32), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[ICMP]](s32) + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[TRUNC]](s8), [[TRUNC1]] + ; CHECK-NEXT: $x11 = COPY [[ICMP1]](s32) + ; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY1]](s32), [[ICMP]] + ; CHECK-NEXT: $x12 = COPY [[ICMP2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s1) = G_ICMP intpred(sge), %0(s32), %1 + %11:_(s32) = G_ANYEXT %4(s1) + $x10 = COPY %11(s32) + %8:_(s1) = G_ICMP intpred(ult), %2(s8), %3 + %12:_(s32) = G_ANYEXT %8(s1) + $x11 = COPY %12(s32) + %10:_(s1) = G_ICMP intpred(eq), %1(s32), %11 + %14:_(s32) = G_ANYEXT %10(s1) + $x12 = COPY %14(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... + diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-div.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-div.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-div.mir @@ -0,0 +1,51 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -mattr=+m -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: sdiv_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: sdiv_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL %8, [[C1]](s32) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]](s32) + ; CHECK-NEXT: [[SDIV:%[0-9]+]]:_(s32) = G_SDIV [[ASHR]], [[ASHR1]] + ; CHECK-NEXT: $x10 = COPY [[SDIV]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_SDIV %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: udiv_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: udiv_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND %8, [[C1]] + ; CHECK-NEXT: [[UDIV:%[0-9]+]]:_(s32) = G_UDIV [[AND]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[UDIV]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_UDIV %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-mul.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-mul.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-mul.mir @@ -0,0 +1,103 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -mattr=+m -run-pass=legalizer %s -o -\ +# RUN: | FileCheck %s +--- +name: mul_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[MUL]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_MUL %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: mul_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY3]] + ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s32) + ; CHECK-NEXT: $x11 = COPY [[ADD1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_MUL %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: mul_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY1]] + ; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[MUL2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), [[UMULH]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ICMP1]], [[C1]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[AND1]] + ; CHECK-NEXT: [[MUL3:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY1]] + ; CHECK-NEXT: [[MUL4:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[MUL5:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY3]] + ; CHECK-NEXT: [[UMULH1:%[0-9]+]]:_(s32) = G_UMULH [[COPY1]], [[COPY1]] + ; CHECK-NEXT: [[UMULH2:%[0-9]+]]:_(s32) = G_UMULH [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[MUL3]], [[MUL4]] + ; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[ADD3]], [[MUL5]] + ; CHECK-NEXT: [[ADD5:%[0-9]+]]:_(s32) = G_ADD [[ADD4]], [[UMULH1]] + ; CHECK-NEXT: [[ADD6:%[0-9]+]]:_(s32) = G_ADD [[ADD5]], [[UMULH2]] + ; CHECK-NEXT: [[ADD7:%[0-9]+]]:_(s32) = G_ADD [[ADD6]], [[ADD2]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s32) + ; CHECK-NEXT: $x11 = COPY [[ADD1]](s32) + ; CHECK-NEXT: $x12 = COPY [[ADD7]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_MUL %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-or.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-or.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-or.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: or_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[COPY]], [[OR]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_OR %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: or_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s32) + ; CHECK-NEXT: $x11 = COPY [[OR1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_OR %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: or_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s32) + ; CHECK-NEXT: $x11 = COPY [[OR1]](s32) + ; CHECK-NEXT: $x12 = COPY [[OR2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_OR %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-rem.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-rem.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-rem.mir @@ -0,0 +1,51 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -mattr=+m -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: srem_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: srem_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL %8, [[C1]](s32) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]](s32) + ; CHECK-NEXT: [[SREM:%[0-9]+]]:_(s32) = G_SREM [[ASHR]], [[ASHR1]] + ; CHECK-NEXT: $x10 = COPY [[SREM]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_SREM %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: urem_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: urem_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND %8, [[C1]] + ; CHECK-NEXT: [[UREM:%[0-9]+]]:_(s32) = G_UREM [[AND]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[UREM]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_UREM %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-shift.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-shift.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-shift.mir @@ -0,0 +1,39 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: test_shift +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_shift + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32) + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[TRUNC]](s8) + ; CHECK-NEXT: $x12 = COPY [[ASHR1]](s32) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C1]] + ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[TRUNC]](s8) + ; CHECK-NEXT: $x13 = COPY [[LSHR]](s32) + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[TRUNC]](s8) + ; CHECK-NEXT: $x14 = COPY [[SHL1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x12, implicit $x13, implicit $x14 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_ASHR %2, %3 + %7:_(s32) = G_ANYEXT %4(s8) + $x12 = COPY %7(s32) + %5:_(s8) = G_LSHR %2, %3 + %8:_(s32) = G_ANYEXT %5(s8) + $x13 = COPY %8(s32) + %6:_(s8) = G_SHL %2, %3 + %9:_(s32) = G_ANYEXT %6(s8) + $x14 = COPY %9(s32) + PseudoRET implicit $x12, implicit $x13, implicit $x14 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-sub.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-sub.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-sub.mir @@ -0,0 +1,94 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: sub_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[SUB]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_SUB %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: sub_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s32), [[COPY2]] + ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[COPY1]], [[COPY3]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s32) + ; CHECK-NEXT: $x11 = COPY [[SUB2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_SUB %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: sub_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s32), [[COPY1]] + ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY1]](s32), [[COPY2]] + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP1]](s32) + ; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY1]](s32), [[COPY2]] + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[ICMP]], [[ICMP2]] + ; CHECK-NEXT: [[SUB3:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[SELECT]], [[C1]] + ; CHECK-NEXT: [[SUB4:%[0-9]+]]:_(s32) = G_SUB [[SUB3]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s32) + ; CHECK-NEXT: $x11 = COPY [[SUB2]](s32) + ; CHECK-NEXT: $x12 = COPY [[SUB4]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_SUB %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uadde.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uadde.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uadde.mir @@ -0,0 +1,30 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uadde_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uadde_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]] + ; CHECK-NEXT: %sum:_(s32) = G_ADD [[ADD]], [[AND]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), %sum(s32), [[COPY]] + ; CHECK-NEXT: $x10 = COPY %sum(s32) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %carry_in:_(s1) = G_TRUNC %2(s32) + %sum:_(s32), %carry_out:_(s1) = G_UADDE %0, %1, %carry_in + %3:_(s32) = G_ANYEXT %carry_out(s1) + $x10 = COPY %sum(s32) + $x11 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uaddo.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uaddo.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-uaddo.mir @@ -0,0 +1,24 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uaddo_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uaddo_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s64) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64), %3:_(s1) = G_UADDO %0, %1 + %4:_(s64) = G_ANYEXT %3(s1) + $x10 = COPY %2(s64) + $x11 = COPY %4(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usube.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usube.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usube.mir @@ -0,0 +1,33 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uadde_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uadde_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]] + ; CHECK-NEXT: %sum:_(s32) = G_SUB [[SUB]], [[AND]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]] + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32) + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s32), [[COPY1]] + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[COPY2]], [[ICMP1]] + ; CHECK-NEXT: $x10 = COPY %sum(s32) + ; CHECK-NEXT: $x11 = COPY [[SELECT]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %carry_in:_(s1) = G_TRUNC %2(s32) + %sum:_(s32), %carry_out:_(s1) = G_USUBE %0, %1, %carry_in + %3:_(s32) = G_ANYEXT %carry_out(s1) + $x10 = COPY %sum(s32) + $x11 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usubo.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usubo.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-usubo.mir @@ -0,0 +1,24 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uaddo_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uaddo_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s64) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64), %3:_(s1) = G_USUBO %0, %1 + %4:_(s64) = G_ANYEXT %3(s1) + $x10 = COPY %2(s64) + $x11 = COPY %4(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-xor.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-xor.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-xor.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: xor_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[XOR]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s32) + %3:_(s8) = G_TRUNC %1(s32) + %4:_(s8) = G_XOR %3, %4 + %5:_(s32) = G_ANYEXT %4(s8) + $x10 = COPY %5(s32) + PseudoRET implicit $x10 + +... +--- +name: xor_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s32) + ; CHECK-NEXT: $x11 = COPY [[XOR1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s64) = G_MERGE_VALUES %0(s32), %1(s32) + %5:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) + %6:_(s64) = G_XOR %4, %5 + %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: xor_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s32) + ; CHECK-NEXT: $x11 = COPY [[XOR1]](s32) + ; CHECK-NEXT: $x12 = COPY [[XOR2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s32) = COPY $x10 + %1:_(s32) = COPY $x11 + %2:_(s32) = COPY $x12 + %3:_(s32) = COPY $x13 + %4:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) + %5:_(s96) = G_MERGE_VALUES %1(s32), %2(s32), %3(s32) + %6:_(s96) = G_XOR %4, %5 + %7:_(s32), %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %6(s96) + $x10 = COPY %7(s32) + $x11 = COPY %8(s32) + $x12 = COPY %9(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-add.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-add.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-add.mir @@ -0,0 +1,91 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: add_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[ADD]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_ADD %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: add_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[COPY2]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD [[COPY1]], [[COPY3]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[ADD1]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s64) + ; CHECK-NEXT: $x11 = COPY [[ADD2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_ADD %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: add_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: add_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[COPY1]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[ADD1]], [[AND]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD2]](s64), [[COPY1]] + ; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s64) = G_ADD [[COPY2]], [[COPY3]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[ICMP1]], [[C1]] + ; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s64) = G_ADD [[ADD3]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s64) + ; CHECK-NEXT: $x11 = COPY [[ADD2]](s64) + ; CHECK-NEXT: $x12 = COPY [[ADD4]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_ADD %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-and.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-and.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-and.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: and_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_AND %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: and_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s64) + ; CHECK-NEXT: $x11 = COPY [[AND1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_AND %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: and_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: and_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s64) = G_AND [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[AND]](s64) + ; CHECK-NEXT: $x11 = COPY [[AND1]](s64) + ; CHECK-NEXT: $x12 = COPY [[AND2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_AND %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-cmp.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-cmp.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-cmp.mir @@ -0,0 +1,36 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: test_icmp +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_icmp + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s64) + ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s64) + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(sge), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[ICMP]](s64) + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[TRUNC]](s8), [[TRUNC1]] + ; CHECK-NEXT: $x11 = COPY [[ICMP1]](s64) + ; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[COPY1]](s64), [[ICMP]] + ; CHECK-NEXT: $x12 = COPY [[ICMP2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s1) = G_ICMP intpred(sge), %0(s64), %1 + %11:_(s64) = G_ANYEXT %4(s1) + $x10 = COPY %11(s64) + %8:_(s1) = G_ICMP intpred(ult), %2(s8), %3 + %12:_(s64) = G_ANYEXT %8(s1) + $x11 = COPY %12(s64) + %10:_(s1) = G_ICMP intpred(eq), %1(s64), %11 + %14:_(s64) = G_ANYEXT %10(s1) + $x12 = COPY %14(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... + diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-div.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-div.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-div.mir @@ -0,0 +1,51 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -mattr=+m -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: sdiv_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: sdiv_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[C]](s64) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]](s64) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL %8, [[C1]](s64) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s64) = G_ASHR [[SHL1]], [[C1]](s64) + ; CHECK-NEXT: [[SDIV:%[0-9]+]]:_(s64) = G_SDIV [[ASHR]], [[ASHR1]] + ; CHECK-NEXT: $x10 = COPY [[SDIV]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_SDIV %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: udiv_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: udiv_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 255 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND %8, [[C1]] + ; CHECK-NEXT: [[UDIV:%[0-9]+]]:_(s64) = G_UDIV [[AND]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[UDIV]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_UDIV %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-mul.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-mul.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-mul.mir @@ -0,0 +1,103 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -mattr=+m -run-pass=legalizer %s -o -\ +# RUN: | FileCheck %s +--- +name: mul_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[MUL]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_MUL %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: mul_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s64) = G_MUL [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY3]] + ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s64) = G_UMULH [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[MUL1]], [[MUL2]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD [[ADD]], [[UMULH]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s64) + ; CHECK-NEXT: $x11 = COPY [[ADD1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_MUL %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: mul_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: mul_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s64) = G_MUL [[COPY1]], [[COPY1]] + ; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s64) = G_UMULH [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[MUL1]], [[MUL2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[MUL2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD [[ADD]], [[UMULH]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD1]](s64), [[UMULH]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[ICMP1]], [[C1]] + ; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[AND]], [[AND1]] + ; CHECK-NEXT: [[MUL3:%[0-9]+]]:_(s64) = G_MUL [[COPY2]], [[COPY1]] + ; CHECK-NEXT: [[MUL4:%[0-9]+]]:_(s64) = G_MUL [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[MUL5:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY3]] + ; CHECK-NEXT: [[UMULH1:%[0-9]+]]:_(s64) = G_UMULH [[COPY1]], [[COPY1]] + ; CHECK-NEXT: [[UMULH2:%[0-9]+]]:_(s64) = G_UMULH [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s64) = G_ADD [[MUL3]], [[MUL4]] + ; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s64) = G_ADD [[ADD3]], [[MUL5]] + ; CHECK-NEXT: [[ADD5:%[0-9]+]]:_(s64) = G_ADD [[ADD4]], [[UMULH1]] + ; CHECK-NEXT: [[ADD6:%[0-9]+]]:_(s64) = G_ADD [[ADD5]], [[UMULH2]] + ; CHECK-NEXT: [[ADD7:%[0-9]+]]:_(s64) = G_ADD [[ADD6]], [[ADD2]] + ; CHECK-NEXT: $x10 = COPY [[MUL]](s64) + ; CHECK-NEXT: $x11 = COPY [[ADD1]](s64) + ; CHECK-NEXT: $x12 = COPY [[ADD7]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_MUL %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-or.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-or.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-or.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: or_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[COPY]], [[OR]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_OR %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: or_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s64) = G_OR [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s64) + ; CHECK-NEXT: $x11 = COPY [[OR1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_OR %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: or_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: or_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s64) = G_OR [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s64) = G_OR [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[OR]](s64) + ; CHECK-NEXT: $x11 = COPY [[OR1]](s64) + ; CHECK-NEXT: $x12 = COPY [[OR2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_OR %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-rem.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-rem.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-rem.mir @@ -0,0 +1,51 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -mattr=+m -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: srem_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: srem_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[C]](s64) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]](s64) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL %8, [[C1]](s64) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s64) = G_ASHR [[SHL1]], [[C1]](s64) + ; CHECK-NEXT: [[SREM:%[0-9]+]]:_(s64) = G_SREM [[ASHR]], [[ASHR1]] + ; CHECK-NEXT: $x10 = COPY [[SREM]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_SREM %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: urem_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: urem_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 255 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND %8, [[C1]] + ; CHECK-NEXT: [[UREM:%[0-9]+]]:_(s64) = G_UREM [[AND]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[UREM]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_UREM %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-shift.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-shift.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-shift.mir @@ -0,0 +1,39 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: test_shift +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_shift + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s64) + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 + ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[C]](s64) + ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]](s64) + ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s64) = G_ASHR [[ASHR]], [[TRUNC]](s8) + ; CHECK-NEXT: $x12 = COPY [[ASHR1]](s64) + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 255 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C1]] + ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[AND]], [[TRUNC]](s8) + ; CHECK-NEXT: $x13 = COPY [[LSHR]](s64) + ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[TRUNC]](s8) + ; CHECK-NEXT: $x14 = COPY [[SHL1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x12, implicit $x13, implicit $x14 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_ASHR %2, %3 + %7:_(s64) = G_ANYEXT %4(s8) + $x12 = COPY %7(s64) + %5:_(s8) = G_LSHR %2, %3 + %8:_(s64) = G_ANYEXT %5(s8) + $x13 = COPY %8(s64) + %6:_(s8) = G_SHL %2, %3 + %9:_(s64) = G_ANYEXT %6(s8) + $x14 = COPY %9(s64) + PseudoRET implicit $x12, implicit $x13, implicit $x14 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-sub.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-sub.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-sub.mir @@ -0,0 +1,94 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: sub_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[SUB]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_SUB %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: sub_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY]](s64), [[COPY2]] + ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[COPY1]], [[COPY3]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s64) = G_SUB [[SUB1]], [[AND]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s64) + ; CHECK-NEXT: $x11 = COPY [[SUB2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_SUB %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: sub_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: sub_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]] + ; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s64) = G_SUB [[SUB1]], [[AND]] + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[COPY1]](s64), [[COPY2]] + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP1]](s64) + ; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY1]](s64), [[COPY2]] + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC]](s1), [[ICMP]], [[ICMP2]] + ; CHECK-NEXT: [[SUB3:%[0-9]+]]:_(s64) = G_SUB [[COPY2]], [[COPY3]] + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[SELECT]], [[C1]] + ; CHECK-NEXT: [[SUB4:%[0-9]+]]:_(s64) = G_SUB [[SUB3]], [[AND1]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s64) + ; CHECK-NEXT: $x11 = COPY [[SUB2]](s64) + ; CHECK-NEXT: $x12 = COPY [[SUB4]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_SUB %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uadde.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uadde.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uadde.mir @@ -0,0 +1,30 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uadde_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uadde_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY2]], [[C]] + ; CHECK-NEXT: %sum:_(s64) = G_ADD [[ADD]], [[AND]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), %sum(s64), [[COPY]] + ; CHECK-NEXT: $x10 = COPY %sum(s64) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %carry_in:_(s1) = G_TRUNC %2(s64) + %sum:_(s64), %carry_out:_(s1) = G_UADDE %0, %1, %carry_in + %3:_(s64) = G_ANYEXT %carry_out(s1) + $x10 = COPY %sum(s64) + $x11 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uaddo.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uaddo.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-uaddo.mir @@ -0,0 +1,24 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: uaddo_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: uaddo_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[ADD]](s64) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64), %3:_(s1) = G_UADDO %0, %1 + %4:_(s64) = G_ANYEXT %3(s1) + $x10 = COPY %2(s64) + $x11 = COPY %4(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usube.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usube.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usube.mir @@ -0,0 +1,33 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: usube_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: usube_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY2]], [[C]] + ; CHECK-NEXT: %sum:_(s64) = G_SUB [[SUB]], [[AND]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s64) + ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC]](s1), [[COPY2]], [[ICMP1]] + ; CHECK-NEXT: $x10 = COPY %sum(s64) + ; CHECK-NEXT: $x11 = COPY [[SELECT]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %carry_in:_(s1) = G_TRUNC %2(s64) + %sum:_(s64), %carry_out:_(s1) = G_USUBE %0, %1, %carry_in + %3:_(s64) = G_ANYEXT %carry_out(s1) + $x10 = COPY %sum(s64) + $x11 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usubo.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usubo.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-usubo.mir @@ -0,0 +1,24 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 --global-isel -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: usubo_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: usubo_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[COPY]](s64), [[COPY1]] + ; CHECK-NEXT: $x10 = COPY [[SUB]](s64) + ; CHECK-NEXT: $x11 = COPY [[ICMP]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64), %3:_(s1) = G_USUBO %0, %1 + %4:_(s64) = G_ANYEXT %3(s1) + $x10 = COPY %2(s64) + $x11 = COPY %4(s64) + PseudoRET implicit $x10, implicit $x11 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-xor.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-xor.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-xor.mir @@ -0,0 +1,79 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc --global-isel -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: xor_scalar_small +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_small + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[COPY]], [[XOR]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s8) = G_TRUNC %0(s64) + %3:_(s8) = G_TRUNC %1(s64) + %4:_(s8) = G_XOR %3, %4 + %5:_(s64) = G_ANYEXT %4(s8) + $x10 = COPY %5(s64) + PseudoRET implicit $x10 + +... +--- +name: xor_scalar_big +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_big + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[COPY]], [[COPY2]] + ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s64) = G_XOR [[COPY1]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s64) + ; CHECK-NEXT: $x11 = COPY [[XOR1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s128) = G_MERGE_VALUES %0(s64), %1(s64) + %5:_(s128) = G_MERGE_VALUES %2(s64), %3(s64) + %6:_(s128) = G_XOR %4, %5 + %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6(s128) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: xor_scalar_big_nonpow2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: xor_scalar_big_nonpow2 + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12 + ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13 + ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[COPY]], [[COPY1]] + ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s64) = G_XOR [[COPY1]], [[COPY2]] + ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s64) = G_XOR [[COPY2]], [[COPY3]] + ; CHECK-NEXT: $x10 = COPY [[XOR]](s64) + ; CHECK-NEXT: $x11 = COPY [[XOR1]](s64) + ; CHECK-NEXT: $x12 = COPY [[XOR2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s64) = COPY $x10 + %1:_(s64) = COPY $x11 + %2:_(s64) = COPY $x12 + %3:_(s64) = COPY $x13 + %4:_(s192) = G_MERGE_VALUES %0(s64), %1(s64), %2(s64) + %5:_(s192) = G_MERGE_VALUES %1(s64), %2(s64), %3(s64) + %6:_(s192) = G_XOR %4, %5 + %7:_(s64), %8:_(s64), %9:_(s64) = G_UNMERGE_VALUES %6(s192) + $x10 = COPY %7(s64) + $x11 = COPY %8(s64) + $x12 = COPY %9(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +...