forked from OSchip/llvm-project
[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 llvm-svn: 219406
This commit is contained in:
parent
9b280eab66
commit
458a669f49
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue