[llvm] r259375 - [InstCombine] Don't transform (X+INT_MAX)>=(Y+INT_MAX) -> (X<=Y)

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 1 11:06:53 PST 2016


3.8?

On Mon, Feb 1, 2016 at 9:37 AM, David Majnemer via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: majnemer
> Date: Mon Feb  1 11:37:56 2016
> New Revision: 259375
>
> URL: http://llvm.org/viewvc/llvm-project?rev=259375&view=rev
> Log:
> [InstCombine] Don't transform (X+INT_MAX)>=(Y+INT_MAX) -> (X<=Y)
>
> This miscompile came about because we tried to use a transform which was
> only appropriate for xor operators when addition was present.
>
> This fixes PR26407.
>
> Modified:
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>     llvm/trunk/test/Transforms/InstCombine/icmp.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=259375&r1=259374&r2=259375&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Mon Feb  1 11:37:56 2016
> @@ -3877,7 +3877,7 @@ Instruction *InstCombiner::visitICmpInst
>                                  BO1->getOperand(0));
>            }
>
> -          if (CI->isMaxValue(true)) {
> +          if (BO0->getOpcode() == Instruction::Xor && CI->isMaxValue(true)) {
>              ICmpInst::Predicate Pred = I.isSigned()
>                                             ? I.getUnsignedPredicate()
>                                             : I.getSignedPredicate();
>
> Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=259375&r1=259374&r2=259375&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Mon Feb  1 11:37:56 2016
> @@ -1672,3 +1672,15 @@ define i1 @cmp_slt_rhs_inc(float %x, i32
>    %cmp = icmp slt i32 %conv, %inc
>    ret i1 %cmp
>  }
> +
> +; CHECK-LABEL: @PR26407
> +; CHECK-NEXT: %[[addx:.*]] = add i32 %x, 2147483647
> +; CHECK-NEXT: %[[addy:.*]] = add i32 %y, 2147483647
> +; CHECK-NEXT: %[[cmp:.*]] = icmp uge i32 %[[addx]], %[[addy]]
> +; CHECK-NEXT: ret i1 %[[cmp]]
> +define i1 @PR26407(i32 %x, i32 %y) {
> +  %addx = add i32 %x, 2147483647
> +  %addy = add i32 %y, 2147483647
> +  %cmp = icmp uge i32 %addx, %addy
> +  ret i1 %cmp
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list