mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[ValueTracking] Don't require strictly positive for mul nsw recurrence
Just like in the mul nuw case, it's sufficient that the step is non-zero. If the step is negative, then the values will jump between positive and negative, "crossing" zero, but the value of the recurrence is never actually zero.
This commit is contained in:
parent
5a5a9545b4
commit
e6b1858425
@ -2231,9 +2231,8 @@ static bool isNonZeroRecurrence(const PHINode *PN) {
|
||||
(BO->hasNoSignedWrap() && match(Step, m_APInt(StepC)) &&
|
||||
StartC->isNegative() == StepC->isNegative());
|
||||
case Instruction::Mul:
|
||||
return match(Step, m_APInt(StepC)) &&
|
||||
((BO->hasNoUnsignedWrap() && !StepC->isNullValue()) ||
|
||||
(BO->hasNoSignedWrap() && StepC->isStrictlyPositive()));
|
||||
return (BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap()) &&
|
||||
match(Step, m_APInt(StepC)) && !StepC->isNullValue();
|
||||
case Instruction::Shl:
|
||||
return BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap();
|
||||
case Instruction::AShr:
|
||||
|
@ -339,8 +339,7 @@ define i1 @test_mul_nsw_negative_step(i8 %n) {
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
|
||||
; CHECK: exit:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
|
||||
; CHECK-NEXT: ret i1 [[CMP]]
|
||||
; CHECK-NEXT: ret i1 false
|
||||
;
|
||||
entry:
|
||||
br label %loop
|
||||
|
Loading…
Reference in New Issue
Block a user