[PATCH] [ConstantRange] Add a smultiply method for signed multiply
Sanjoy Das
sanjoy at playingwithpointers.com
Fri Feb 20 15:11:46 PST 2015
> ConstantRange
> +ConstantRange::smultiply(const ConstantRange &Other) const {
> + // TODO: If either operand is a single element and the multiply is known to
> + // be non-wrapping, round the result min and max value to the appropriate
> + // multiple of that element. If wrapping is possible, at least adjust the
> + // range according to the greatest power-of-two factor of the single element.
> +
> + if (isEmptySet() || Other.isEmptySet())
> + return ConstantRange(getBitWidth(), /*isFullSet=*/false);
> +
> + APInt this_min = getSignedMin().sext(getBitWidth() * 2);
> + APInt this_max = getSignedMax().sext(getBitWidth() * 2);
> + APInt Other_min = Other.getSignedMin().sext(getBitWidth() * 2);
> + APInt Other_max = Other.getSignedMax().sext(getBitWidth() * 2);
> +
> + ConstantRange Result_zext = ConstantRange(this_min * Other_min,
> + this_max * Other_max + 1);
> + return Result_zext.truncate(getBitWidth());
I'm not sure if this is correct: if we multiply [-1, 2) with itself,
won't this return [1, 2)? Shouldn't [-1,2) * [-1,2) be [-1,2)?
-- Sanjoy
More information about the llvm-commits
mailing list