diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-30 01:10:42 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-30 01:10:42 +0000 |
commit | ccb810fb5481dd91b3890805f3f85a89237faf40 (patch) | |
tree | df1f7d2f111e912ee3f6f366c300924647408233 /llvm/lib/CodeGen/MachineVerifier.cpp | |
parent | 3a94519a777b9ac407a1d5ff5c31ec48b3768eec (diff) | |
download | bcm5719-llvm-ccb810fb5481dd91b3890805f3f85a89237faf40.tar.gz bcm5719-llvm-ccb810fb5481dd91b3890805f3f85a89237faf40.zip |
GlobalISel: Verify memory size for load/store
llvm-svn: 352578
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index fb15c178307..761c4e68d4e 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1004,6 +1004,7 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { case TargetOpcode::G_STORE: case TargetOpcode::G_ZEXTLOAD: case TargetOpcode::G_SEXTLOAD: { + LLT ValTy = MRI->getType(MI->getOperand(0).getReg()); LLT PtrTy = MRI->getType(MI->getOperand(1).getReg()); if (!PtrTy.isPointer()) report("Generic memory instruction must access a pointer", MI); @@ -1014,13 +1015,17 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { report("Generic instruction accessing memory must have one mem operand", MI); } else { + const MachineMemOperand &MMO = **MI->memoperands_begin(); 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()) { + if (MMO.getSize() * 8 >= ValTy.getSizeInBits()) report("Generic extload must have a narrower memory type", MI); - } + } else if (MI->getOpcode() == TargetOpcode::G_LOAD) { + if (MMO.getSize() > (ValTy.getSizeInBits() + 7) / 8) + report("load memory size cannot exceed result size", MI); + } else if (MI->getOpcode() == TargetOpcode::G_STORE) { + if ((ValTy.getSizeInBits() + 7) / 8 < MMO.getSize()) + report("store memory size cannot exceed value size", MI); } } |