From 1981f182e68d10fb6340e1d69635d2fa62299f38 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 25 Mar 2019 17:16:33 +0100 Subject: [PATCH] Fixes [TO BE SQUASHED] --- .../ValueConstraintBasedSimplifier.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/libyul/optimiser/ValueConstraintBasedSimplifier.cpp b/libyul/optimiser/ValueConstraintBasedSimplifier.cpp index c67084a03..156a0b9c3 100644 --- a/libyul/optimiser/ValueConstraintBasedSimplifier.cpp +++ b/libyul/optimiser/ValueConstraintBasedSimplifier.cpp @@ -107,7 +107,7 @@ public: case dev::solidity::Instruction::COINBASE: case dev::solidity::Instruction::CREATE: case dev::solidity::Instruction::CREATE2: - return ValueConstraint::bitRange(160, 0); + return ValueConstraint::bitRange(159, 0); case dev::solidity::Instruction::CALL: case dev::solidity::Instruction::CALLCODE: @@ -167,17 +167,22 @@ ValueConstraint ValueConstraint::bitRange(size_t _highest, size_t _lowest) ValueConstraint ValueConstraint::valueFromBits(u256 _minBits, u256 _maxBits) { - int highestBit = highestBitSet(_maxBits); + // If x fulfills the bit restriction, i.e. minb_i <= x_i <= maxb_i, + // then by monotonicity sum_i 2^i minb_i <= sum_i 2^i x_i <= sum_i 2^i maxb_i + // and thus _minBits and _maxBits are also valid value range constraints. return ValueConstraint{ - 0, - u256(-1) >> (255 - highestBit), - move(_minBits), - move(_maxBits) + _minBits, + _maxBits, + _minBits, + _maxBits }; } ValueConstraint ValueConstraint::bitsFromValue(u256 _minValue, u256 _maxValue) { + if (_minValue == _maxValue) + return constant(_minValue); + int highestBit = highestBitSet(_maxValue); return ValueConstraint{ move(_minValue), @@ -225,8 +230,8 @@ ValueConstraint ValueConstraint::operator-(ValueConstraint const& _other) return ValueConstraint{}; // underflow else return bitsFromValue( - maxValue - _other.minValue, - minValue - _other.maxValue + minValue - _other.maxValue, + maxValue - _other.minValue ); }