diff options
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 15 | ||||
-rw-r--r-- | llvm/test/CodeGen/MIR/AArch64/invalid-extload.mir | 23 |
2 files changed, 37 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 534d3699db2..aae09588b6a 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/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/llvm/test/CodeGen/MIR/AArch64/invalid-extload.mir b/llvm/test/CodeGen/MIR/AArch64/invalid-extload.mir new file mode 100644 index 00000000000..cce2639dded --- /dev/null +++ b/llvm/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) + +... |