diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 75c81f9ed..a7006dcde 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -297,7 +297,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti auto r = m_builder.CreateSDiv(d, n); r = m_builder.CreateSelect(divByZero, Constant::get(0), r); auto dNeg = m_builder.CreateSub(Constant::get(0), d); - r = m_builder.CreateSelect(divByMinusOne, dNeg, r); + r = m_builder.CreateSelect(divByMinusOne, dNeg, r); // protect against undef i256.min / -1 stack.push(r); break; } @@ -319,9 +319,11 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti auto d = stack.pop(); auto n = stack.pop(); auto divByZero = m_builder.CreateICmpEQ(n, Constant::get(0)); + auto divByMinusOne = m_builder.CreateICmpEQ(n, Constant::get(-1)); n = m_builder.CreateSelect(divByZero, Constant::get(1), n); // protect against hardware signal auto r = m_builder.CreateSRem(d, n); r = m_builder.CreateSelect(divByZero, Constant::get(0), r); + r = m_builder.CreateSelect(divByMinusOne, Constant::get(0), r); // protect against undef i256.min / -1 stack.push(r); break; }