From 0a642457f7c821f0ae5f233f518fe749f521faee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 17 Dec 2014 17:53:06 +0100 Subject: [PATCH] Fix checking memory requirements with size 0 --- libevmjit/Memory.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 18d53e63ec..1168406842 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -60,12 +60,18 @@ llvm::Function* Memory::createRequireFunc(GasMeter& _gasMeter, RuntimeManager& _ auto size = offset->getNextNode(); size->setName("size"); + auto preBB = llvm::BasicBlock::Create(func->getContext(), "Pre", func); auto checkBB = llvm::BasicBlock::Create(func->getContext(), "Check", func); auto resizeBB = llvm::BasicBlock::Create(func->getContext(), "Resize", func); auto returnBB = llvm::BasicBlock::Create(func->getContext(), "Return", func); InsertPointGuard guard(m_builder); // Restores insert point at function exit + // BB "Pre": Ignore checks with size 0 + m_builder.SetInsertPoint(preBB); + auto sizeIsZero = m_builder.CreateICmpEQ(size, Constant::get(0)); + m_builder.CreateCondBr(sizeIsZero, returnBB, checkBB); + // BB "Check" m_builder.SetInsertPoint(checkBB); auto uaddWO = llvm::Intrinsic::getDeclaration(getModule(), llvm::Intrinsic::uadd_with_overflow, Type::Word);