[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