[PATCH] D111132: [GlobalISel] Better verification of G_UNMERGE_VALUES

Jay Foad via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 5 04:14:53 PDT 2021


foad created this revision.
Herald added subscribers: hiraditya, rovka.
foad requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Verify three cases of G_UNMERGE_VALUES separately:

1. Splitting a vector into subvectors (the converse of G_CONCAT_VECTORS).
2. Splitting a vector into its elements (the converse of G_BUILD_VECTOR).
3. Splitting a scalar into smaller scalars (the converse of G_MERGE_VALUES).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111132

Files:
  llvm/lib/CodeGen/MachineVerifier.cpp
  llvm/test/MachineVerifier/test_g_unmerge_values.mir


Index: llvm/test/MachineVerifier/test_g_unmerge_values.mir
===================================================================
--- /dev/null
+++ llvm/test/MachineVerifier/test_g_unmerge_values.mir
@@ -0,0 +1,33 @@
+# RUN: not --crash llc -o - -march=arm64 -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+# REQUIRES: aarch64-registered-target
+
+---
+name: g_unmerge_values
+tracksRegLiveness: true
+body: |
+  bb.0:
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES destination types do not match
+    %0:_(s64) = IMPLICIT_DEF
+    %1:_(s32), %2:_(s16) = G_UNMERGE_VALUES %0
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES source operand does not match vector destination operands
+    %3:_(<4 x s32>) = IMPLICIT_DEF
+    %4:_(<3 x s32>), %5:_(<3 x s32>) = G_UNMERGE_VALUES %3
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES source operand does not match vector destination operands
+    %6:_(<2 x s16>), %7:_(<2 x s16>) = G_UNMERGE_VALUES %3
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES vector source operand does not match scalar destination operands
+    %8:_(<2 x s32>) = IMPLICIT_DEF
+    %9:_(s32), %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %8
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES vector source operand does not match scalar destination operands
+    %12:_(s16), %13:_(s16) = G_UNMERGE_VALUES %8
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES scalar source operand does not match scalar destination operands
+    %14:_(s64) = IMPLICIT_DEF
+    %15:_(s16), %16:_(s16) = G_UNMERGE_VALUES %14
+
+    ; CHECK: Bad machine code: G_UNMERGE_VALUES scalar source operand does not match scalar destination operands
+    %17:_(s32), %18:_(s32), %19:_(s32) = G_UNMERGE_VALUES %14
+...
Index: llvm/lib/CodeGen/MachineVerifier.cpp
===================================================================
--- llvm/lib/CodeGen/MachineVerifier.cpp
+++ llvm/lib/CodeGen/MachineVerifier.cpp
@@ -1239,17 +1239,38 @@
     break;
   }
   case TargetOpcode::G_UNMERGE_VALUES: {
+    unsigned NumDsts = MI->getNumOperands() - 1;
     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
-    LLT SrcTy = MRI->getType(MI->getOperand(MI->getNumOperands()-1).getReg());
-    // For now G_UNMERGE can split vectors.
-    for (unsigned i = 0; i < MI->getNumOperands()-1; ++i) {
-      if (MRI->getType(MI->getOperand(i).getReg()) != DstTy)
+    for (unsigned i = 1; i < NumDsts; ++i) {
+      if (MRI->getType(MI->getOperand(i).getReg()) != DstTy) {
         report("G_UNMERGE_VALUES destination types do not match", MI);
+        break;
+      }
     }
-    if (SrcTy.getSizeInBits() !=
-        (DstTy.getSizeInBits() * (MI->getNumOperands() - 1))) {
-      report("G_UNMERGE_VALUES source operand does not cover dest operands",
-             MI);
+
+    LLT SrcTy = MRI->getType(MI->getOperand(NumDsts).getReg());
+    if (DstTy.isVector()) {
+      // This case is the converse of G_CONCAT_VECTORS.
+      if (!SrcTy.isVector() || SrcTy.getScalarType() != DstTy.getScalarType() ||
+          SrcTy.getNumElements() != NumDsts * DstTy.getNumElements())
+        report("G_UNMERGE_VALUES source operand does not match vector "
+               "destination operands",
+               MI);
+    } else if (SrcTy.isVector()) {
+      // This case is the converse of G_BUILD_VECTOR, but relaxed to allow
+      // mismatched types as long as the total size matches:
+      //   %0:_(s64), %1:_(s64) = G_UNMERGE_VALUES %2:_(<4 x s32>)
+      if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits())
+        report("G_UNMERGE_VALUES vector source operand does not match scalar "
+               "destination operands",
+               MI);
+    } else {
+      // This case is the converse of G_MERGE_VALUES.
+      if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits()) {
+        report("G_UNMERGE_VALUES scalar source operand does not match scalar "
+               "destination operands",
+               MI);
+      }
     }
     break;
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111132.377150.patch
Type: text/x-patch
Size: 3972 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211005/1836c2d2/attachment.bin>


More information about the llvm-commits mailing list