[llvm] b8fef7a - [RISCV][GlobalISel] Legalize constants, undefined values, extension instructions, and (un)merge instructions for narrow types

Nitin John Raj via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 7 11:26:31 PDT 2023


Author: Nitin John Raj
Date: 2023-08-07T11:17:08-07:00
New Revision: b8fef7a6d40105ac9bc3bf67268ff1245c4be5c8

URL: https://github.com/llvm/llvm-project/commit/b8fef7a6d40105ac9bc3bf67268ff1245c4be5c8
DIFF: https://github.com/llvm/llvm-project/commit/b8fef7a6d40105ac9bc3bf67268ff1245c4be5c8.diff

LOG: [RISCV][GlobalISel] Legalize constants, undefined values, extension instructions, and (un)merge instructions for narrow types

Test legalization for (s7, s8, s16, s32, s48, s64, s96) for rv32, (s8, s15, s16, s32, s64, s72, s128, s192) for rv64.

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D156383

Added: 
    llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-const.mir
    llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-implicit-def.mir
    llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-const.mir
    llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-implicit-def.mir

Modified: 
    llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
index 3f829cc2e6773d..f48e2a5e0ad3ff 100644
--- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
+++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
@@ -29,5 +29,45 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
       .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
index 00000000000000..817e3ff9175250
--- /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
index 00000000000000..1662ba03489ba3
--- /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
index 00000000000000..e2e3d9df1fac23
--- /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
index 00000000000000..09f1d521b2bca1
--- /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
+
+...


        


More information about the llvm-commits mailing list