From: Matt Arsenault Date: Fri, 18 Jan 2019 20:17:37 +0000 (+0000) Subject: GlobalISel: Verify g_zextload and g_sextload X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=04c7d10f65a3cb0b8102b897fcca71692e2a750e;p=llvm GlobalISel: Verify g_zextload and g_sextload git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351584 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index 534d3699db2..aae09588b6a 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -986,11 +986,24 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { break; 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) + +...