From: Matt Arsenault Date: Mon, 1 Jul 2019 18:01:35 +0000 (+0000) Subject: GlobalISel: Verify G_MERGE_VALUES operand sizes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=860def304b2b93a2efb5245c8611a3e27183b4a7;p=llvm GlobalISel: Verify G_MERGE_VALUES operand sizes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364822 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index 63fd05b2ea2..f9b548653cf 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -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 index 00000000000..4829e8f1317 --- /dev/null +++ b/test/MachineVerifier/test_g_merge_values.mir @@ -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 + +...