[PATCH] InstSimplify: The upper bound of X / C was missing a rounding step

Nick Lewycky nlewycky at google.com
Mon Jul 14 12:54:18 PDT 2014


LGTM

FYI, this testcase should also be canonicalized by instcombine, which makes
sense to add now that instsimplify isn't catch it ;-)


On 14 July 2014 12:48, David Majnemer <david.majnemer at gmail.com> wrote:

> Hi nicholas,
>
> When calculating the upper bound of X / -8589934592, we would perform
> the following calculation: Floor[INT_MAX / 8589934592]
>
> However, flooring the result would make us wrongly come to the
> conclusion that 1073741824 was not in the set of possible values.
> Instead, use the ceiling of the result.
>
> http://reviews.llvm.org/D4502
>
> Files:
>   lib/Analysis/InstructionSimplify.cpp
>   test/Transforms/InstSimplify/compare.ll
>
> Index: lib/Analysis/InstructionSimplify.cpp
> ===================================================================
> --- lib/Analysis/InstructionSimplify.cpp
> +++ lib/Analysis/InstructionSimplify.cpp
> @@ -1964,7 +1964,15 @@
>        APInt Val = CI2->getValue().abs();
>        if (!Val.isMinValue()) {
>          Lower = IntMin.sdiv(Val);
> -        Upper = IntMax.sdiv(Val) + 1;
> +        APInt Rem;
> +        APInt::sdivrem(IntMax, Val, Upper, Rem);
> +        // We may need to round the result of the INT_MAX / CI2
> calculation up
> +        // if we see that the division was not exact.
> +        if (Rem.isMinValue())
> +          Upper = Upper + 1;
> +        else
> +          Upper = Upper + 2;
> +        assert(Upper != Lower && "Upper part of range has wrapped!");
>        }
>      } else if (match(LHS, m_LShr(m_Value(), m_ConstantInt(CI2)))) {
>        // 'lshr x, CI2' produces [0, UINT_MAX >> CI2].
> Index: test/Transforms/InstSimplify/compare.ll
> ===================================================================
> --- test/Transforms/InstSimplify/compare.ll
> +++ test/Transforms/InstSimplify/compare.ll
> @@ -913,3 +913,14 @@
>  ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[DIV]], -1073741824
>  ; CHECK-NEXT: ret i1 [[CMP]]
>  }
> +
> +define i1 @icmp_sdiv_pr20288(i64 %a) {
> +   %div = sdiv i64 %a, -8589934592
> +   %cmp = icmp ne i64 %div, 1073741824
> +   ret i1 %cmp
> +
> +; CHECK-LABEL: @icmp_sdiv_pr20288
> +; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 %a, -8589934592
> +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[DIV]], 1073741824
> +; CHECK-NEXT: ret i1 [[CMP]]
> +}
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140714/0c5523c8/attachment.html>


More information about the llvm-commits mailing list