[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