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 @@ -29,5 +29,48 @@ .legalFor({XLenLLT}) .clampScalar(0, XLenLLT, XLenLLT); + // Extensions + auto ExtLegalFunc = [=](const LegalityQuery &Query) { + unsigned DstSize = Query.Types[0].getSizeInBits(); + + if (DstSize == 2 * XLen && !Query.Types[0].isVector()) + return false; // Extending to a scalar s128 needs narrowing. + + // Make sure that we have something that will fit in a register, and + // make sure it's a power of 2. + if (DstSize < 1 || DstSize > 2 * XLen || !isPowerOf2_32(DstSize)) + return false; + + const LLT SrcTy = Query.Types[1]; + + // Make sure we fit in a register otherwise. Don't bother checking that + // the source type is below 128 bits. We shouldn't be allowing anything + // through which is wider than the destination in the first place. + unsigned SrcSize = SrcTy.getSizeInBits(); + if (SrcSize < 1 || !isPowerOf2_32(SrcSize)) + return false; + + return true; + }; + getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT}) + .legalIf(ExtLegalFunc) + .clampScalar(0, XLenLLT, XLenLLT); + + // Merge/Unmerge + for (unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) { + unsigned BigTyIdx = Op == G_MERGE_VALUES ? 0 : 1; + unsigned LitTyIdx = Op == G_MERGE_VALUES ? 1 : 0; + getActionDefinitionsBuilder(Op) + .widenScalarToNextPow2(LitTyIdx, XLen) + .widenScalarToNextPow2(BigTyIdx, XLen) + .clampScalar(LitTyIdx, XLenLLT, XLenLLT) + .clampScalar(BigTyIdx, XLenLLT, XLenLLT); + } + + getActionDefinitionsBuilder({G_CONSTANT, G_IMPLICIT_DEF}) + .legalFor({XLenLLT}) + .widenScalarToNextPow2(0) + .clampScalar(0, XLenLLT, XLenLLT); + getLegacyLegalizerInfo().computeTables(); } diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-const.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-const.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-const.mir @@ -0,0 +1,113 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: const_i7 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i7 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s7) = G_CONSTANT i7 15 + %1:_(s32) = G_ANYEXT %0(s7) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: const_i8 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i8 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -127 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s8) = G_CONSTANT i8 129 + %1:_(s32) = G_ANYEXT %0(s8) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: const_i16 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i16 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 32767 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s16) = G_CONSTANT i16 -32769 + %1:_(s32) = G_ANYEXT %0(s16) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: const_i32 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i32 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -2147483647 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = G_CONSTANT i32 2147483649 + $x10 = COPY %0(s32) + PseudoRET implicit $x10 + +... +--- +name: const_i48 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i48 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: $x11 = COPY [[C1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s48) = G_CONSTANT i48 2 + %1:_(s64) = G_ANYEXT %0(s48) + %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64) + $x10 = COPY %2(s32) + $x11 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: const_i64 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i64 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -2147483647 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: $x11 = COPY [[C1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = G_CONSTANT i64 2147483649 + %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(s64) + $x10 = COPY %1(s32) + $x11 = COPY %2(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: const_i96 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i96 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -121 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -51 + ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1 + ; CHECK-NEXT: $x10 = COPY [[C]](s32) + ; CHECK-NEXT: $x11 = COPY [[C1]](s32) + ; CHECK-NEXT: $x12 = COPY [[C2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s96) = G_CONSTANT i96 -214748364921 + %1:_(s32), %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(s96) + $x10 = COPY %1(s32) + $x11 = COPY %2(s32) + $x12 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-implicit-def.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-implicit-def.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-implicit-def.mir @@ -0,0 +1,113 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: implicit_def_i7 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i7 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s7) = G_IMPLICIT_DEF + %1:_(s32) = G_ANYEXT %0(s7) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i8 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i8 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s8) = G_IMPLICIT_DEF + %1:_(s32) = G_ANYEXT %0(s8) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i16 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i16 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s16) = G_IMPLICIT_DEF + %1:_(s32) = G_ANYEXT %0(s16) + $x10 = COPY %1(s32) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i32 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i32 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = G_IMPLICIT_DEF + $x10 = COPY %0(s32) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i48 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i48 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s48) = G_IMPLICIT_DEF + %1:_(s64) = G_ANYEXT %0(s48) + %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64) + $x10 = COPY %2(s32) + $x11 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: implicit_def_i64 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i64 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s64) = G_IMPLICIT_DEF + %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(s64) + $x10 = COPY %1(s32) + $x11 = COPY %2(s32) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: implicit_def_i96 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i96 + ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s32) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s32) + ; CHECK-NEXT: $x12 = COPY [[DEF2]](s32) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s96) = G_IMPLICIT_DEF + %1:_(s32), %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(s96) + $x10 = COPY %1(s32) + $x11 = COPY %2(s32) + $x12 = COPY %3(s32) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-const.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-const.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-const.mir @@ -0,0 +1,127 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: const_i8 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i8 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -127 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s8) = G_CONSTANT i8 129 + %1:_(s64) = G_ANYEXT %0(s8) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: const_i15 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i15 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 15 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s15) = G_CONSTANT i15 15 + %1:_(s64) = G_ANYEXT %0(s15) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: const_i16 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i16 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 767 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s16) = G_CONSTANT i16 -64769 + %1:_(s64) = G_ANYEXT %0(s16) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: const_i32 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i32 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -64769 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = G_CONSTANT i32 -64769 + %1:_(s64) = G_ANYEXT %0(s32) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: const_i64 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i64 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2147483649 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = G_CONSTANT i64 2147483649 + $x10 = COPY %0(s64) + PseudoRET implicit $x10 + +... +--- +name: const_i72 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i72 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -2147483649312 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: $x11 = COPY [[C1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s72) = G_CONSTANT i72 -2147483649312 + %1:_(s128) = G_ANYEXT %0(s72) + %2:_(s64), %3:_(s64) = G_UNMERGE_VALUES %1(s128) + $x10 = COPY %2(s64) + $x11 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: const_i128 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i128 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 21474831289 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: $x11 = COPY [[C1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s128) = G_CONSTANT i128 21474831289 + %1:_(s64), %2:_(s64) = G_UNMERGE_VALUES %0(s128) + $x10 = COPY %1(s64) + $x11 = COPY %2(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: const_i192 +body: | + bb.0.entry: + ; CHECK-LABEL: name: const_i192 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -214772364921 + ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1 + ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1 + ; CHECK-NEXT: $x10 = COPY [[C]](s64) + ; CHECK-NEXT: $x11 = COPY [[C1]](s64) + ; CHECK-NEXT: $x12 = COPY [[C2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s192) = G_CONSTANT i192 -214772364921 + %1:_(s64), %2:_(s64), %3:_(s64) = G_UNMERGE_VALUES %0(s192) + $x10 = COPY %1(s64) + $x11 = COPY %2(s64) + $x12 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-implicit-def.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-implicit-def.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-implicit-def.mir @@ -0,0 +1,127 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv64 -run-pass=legalizer %s -o - \ +# RUN: | FileCheck %s +--- +name: implicit_def_i8 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i8 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s8) = G_IMPLICIT_DEF + %1:_(s64) = G_ANYEXT %0(s8) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i15 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i15 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s15) = G_IMPLICIT_DEF + %1:_(s64) = G_ANYEXT %0(s15) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i16 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i16 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s16) = G_IMPLICIT_DEF + %1:_(s64) = G_ANYEXT %0(s16) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i32 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i32 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s32) = G_IMPLICIT_DEF + %1:_(s64) = G_ANYEXT %0(s32) + $x10 = COPY %1(s64) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i64 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i64 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10 + %0:_(s64) = G_IMPLICIT_DEF + $x10 = COPY %0(s64) + PseudoRET implicit $x10 + +... +--- +name: implicit_def_i72 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i72 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s72) = G_IMPLICIT_DEF + %1:_(s128) = G_ANYEXT %0(s72) + %2:_(s64), %3:_(s64) = G_UNMERGE_VALUES %1(s128) + $x10 = COPY %2(s64) + $x11 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: implicit_def_i128 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i128 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11 + %0:_(s128) = G_IMPLICIT_DEF + %1:_(s64), %2:_(s64) = G_UNMERGE_VALUES %0(s128) + $x10 = COPY %1(s64) + $x11 = COPY %2(s64) + PseudoRET implicit $x10, implicit $x11 + +... +--- +name: implicit_def_i192 +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicit_def_i192 + ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF + ; CHECK-NEXT: $x10 = COPY [[DEF]](s64) + ; CHECK-NEXT: $x11 = COPY [[DEF1]](s64) + ; CHECK-NEXT: $x12 = COPY [[DEF2]](s64) + ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12 + %0:_(s192) = G_IMPLICIT_DEF + %1:_(s64), %2:_(s64), %3:_(s64) = G_UNMERGE_VALUES %0(s192) + $x10 = COPY %1(s64) + $x11 = COPY %2(s64) + $x12 = COPY %3(s64) + PseudoRET implicit $x10, implicit $x11, implicit $x12 + +...