]> granicus.if.org Git - llvm/commitdiff
GlobalISel: Verify G_MERGE_VALUES operand sizes
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 1 Jul 2019 18:01:35 +0000 (18:01 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 1 Jul 2019 18:01:35 +0000 (18:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364822 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineVerifier.cpp
test/MachineVerifier/test_g_merge_values.mir [new file with mode: 0644]

index 63fd05b2ea204ae0e0e4601dd54ab61c1bcab294..f9b548653cf5fd6a862ad8d43a7ada336335b3bd 100644 (file)
@@ -1176,6 +1176,16 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
     if (DstTy.isVector() || SrcTy.isVector())
       report("G_MERGE_VALUES cannot operate on vectors", MI);
+
+    const unsigned NumOps = MI->getNumOperands();
+    if (DstTy.getSizeInBits() != SrcTy.getSizeInBits() * (NumOps - 1))
+      report("G_MERGE_VALUES result size is inconsistent", MI);
+
+    for (unsigned I = 2; I != NumOps; ++I) {
+      if (MRI->getType(MI->getOperand(I).getReg()) != SrcTy)
+        report("G_MERGE_VALUES source types do not match", MI);
+    }
+
     break;
   }
   case TargetOpcode::G_UNMERGE_VALUES: {
diff --git a/test/MachineVerifier/test_g_merge_values.mir b/test/MachineVerifier/test_g_merge_values.mir
new file mode 100644 (file)
index 0000000..4829e8f
--- /dev/null
@@ -0,0 +1,28 @@
+# RUN: not llc -o - -march=arm64 -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+# REQUIRES: aarch64-registered-target
+---
+name:            g_merge_values
+tracksRegLiveness: true
+liveins:
+body:             |
+  bb.0:
+    %0:_(s32) = IMPLICIT_DEF
+    %1:_(s32) = IMPLICIT_DEF
+    %2:_(<2 x s32>) = IMPLICIT_DEF
+    %3:_(<2 x s32>) = IMPLICIT_DEF
+
+    ; CHECK: Bad machine code: G_MERGE_VALUES cannot operate on vectors
+    %4:_(<4 x s32>) = G_MERGE_VALUES %2, %3
+
+    ; CHECK: Bad machine code: G_MERGE_VALUES result size is inconsistent
+    %5:_(s64) = G_MERGE_VALUES %0
+
+    ; CHECK: Bad machine code: G_MERGE_VALUES result size is inconsistent
+    %6:_(s64) = G_MERGE_VALUES %0, %1, %1
+
+    %7:_(s16) = IMPLICIT_DEF
+
+    ; CHECK: Bad machine code: G_MERGE_VALUES source types do not match
+    %8:_(s64) = G_MERGE_VALUES %0, %7
+
+...