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,45 @@
       .legalFor({XLenLLT})
       .clampScalar(0, XLenLLT, XLenLLT);
 
+  // Extensions
+  auto ExtLegalFunc = [=](const LegalityQuery &Query) {
+    unsigned DstSize = Query.Types[0].getSizeInBits();
+
+    // Make sure that we have something that will fit in a register, and
+    // make sure it's a power of 2.
+    if (DstSize < 8 || DstSize > 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 2 * XLen bits. We shouldn't be allowing anything
+    // through which is wider than the destination in the first place.
+    unsigned SrcSize = SrcTy.getSizeInBits();
+    if (SrcSize < 8 || !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
+
+...