From 171d7285967ae5129b8665998077e36c0588c1b4 Mon Sep 17 00:00:00 2001 From: Amara Emerson <aemerson@apple.com> Date: Sun, 27 Jan 2019 11:34:41 +0000 Subject: [PATCH] Re-apply "r351584: "GlobalISel: Verify g_zextload and g_sextload"" I reverted it originally due to a bot failing. The underlying bug has been fixed as of r352311. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352312 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MachineVerifier.cpp | 15 ++++++++++++- test/CodeGen/MIR/AArch64/invalid-extload.mir | 23 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/MIR/AArch64/invalid-extload.mir diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index ad7825ba3eb..879a3d33469 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -1002,11 +1002,24 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { } case TargetOpcode::G_LOAD: case TargetOpcode::G_STORE: + case TargetOpcode::G_ZEXTLOAD: + case TargetOpcode::G_SEXTLOAD: // Generic loads and stores must have a single MachineMemOperand // describing that access. - if (!MI->hasOneMemOperand()) + if (!MI->hasOneMemOperand()) { report("Generic instruction accessing memory must have one mem operand", MI); + } else { + if (MI->getOpcode() == TargetOpcode::G_ZEXTLOAD || + MI->getOpcode() == TargetOpcode::G_SEXTLOAD) { + const MachineMemOperand &MMO = **MI->memoperands_begin(); + LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); + if (MMO.getSize() * 8 >= DstTy.getSizeInBits()) { + report("Generic extload must have a narrower memory type", MI); + } + } + } + break; case TargetOpcode::G_PHI: { LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); diff --git a/test/CodeGen/MIR/AArch64/invalid-extload.mir b/test/CodeGen/MIR/AArch64/invalid-extload.mir new file mode 100644 index 00000000000..cce2639dded --- /dev/null +++ b/test/CodeGen/MIR/AArch64/invalid-extload.mir @@ -0,0 +1,23 @@ +# RUN: not llc -mtriple=aarch64-none-linux-gnu -run-pass none -o - %s 2>&1 | FileCheck %s + +# CHECK: *** Bad machine code: Generic extload must have a narrower memory type *** +# CHECK: *** Bad machine code: Generic extload must have a narrower memory type *** +# CHECK: *** Bad machine code: Generic extload must have a narrower memory type *** +# CHECK: *** Bad machine code: Generic extload must have a narrower memory type *** +# CHECK: *** Bad machine code: Generic instruction accessing memory must have one mem operand *** +# CHECK: *** Bad machine code: Generic instruction accessing memory must have one mem operand *** + +--- +name: invalid_extload_memory_sizes +body: | + bb.0: + + %0:_(p0) = COPY $x0 + %1:_(s64) = G_ZEXTLOAD %0(p0) :: (load 8) + %2:_(s64) = G_ZEXTLOAD %0(p0) :: (load 16) + %3:_(s64) = G_SEXTLOAD %0(p0) :: (load 8) + %4:_(s64) = G_SEXTLOAD %0(p0) :: (load 16) + %5:_(s64) = G_ZEXTLOAD %0(p0) + %6:_(s64) = G_SEXTLOAD %0(p0) + +... -- 2.40.0