[InstCombine] Fix wrong folding of constant comparisons involving ashr and negative values.

This patch fixes a bug in method InstCombiner::FoldCmpCstShrCst where we
wrongly computed the distance between the highest bits set of two negative
values.

This fixes PR21222.

Differential Revision: http://reviews.llvm.org/D5700


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219406 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrea Di Biagio 2014-10-09 12:41:49 +00:00
parent f73400a864
commit c53401ee91
2 changed files with 10 additions and 1 deletions

View File

@ -1107,7 +1107,8 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A,
// Get the distance between the highest bit that's set.
int Shift;
if (IsNegative)
Shift = (-AP2).logBase2() - (-AP1).logBase2();
// Get the ones' complement of AP2 and AP1 when computing the distance.
Shift = (~AP2).logBase2() - (~AP1).logBase2();
else
Shift = AP2.logBase2() - AP1.logBase2();

View File

@ -688,3 +688,11 @@ define i1 @PR20945(i32 %B) {
%cmp = icmp ne i32 %shr, -5
ret i1 %cmp
}
; CHECK-LABEL: @PR21222
; CHECK: icmp eq i32 %B, 6
define i1 @PR21222(i32 %B) {
%shr = ashr i32 -93, %B
%cmp = icmp eq i32 %shr, -2
ret i1 %cmp
}