Skip to content

Commit 6041815

Browse files
committed
[ValueTracking] Infer X | Y != 0 from X != Y
1 parent db35b12 commit 6041815

File tree

2 files changed

+5
-4
lines changed

2 files changed

+5
-4
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2910,6 +2910,10 @@ static bool isKnownNonZeroFromOperator(const Operator *I,
29102910
// (X | (X != 0)) is non zero
29112911
if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1)))
29122912
return true;
2913+
// X | Y != 0 if X != Y.
2914+
if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Depth,
2915+
Q))
2916+
return true;
29132917
// X | Y != 0 if X != 0 or Y != 0.
29142918
return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) ||
29152919
isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);

llvm/test/Transforms/InstCombine/icmp-dom.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -535,16 +535,13 @@ else:
535535
ret i1 %cmp1
536536
}
537537

538-
; TODO: X != Y implies X | Y != 0
539538
define i1 @or_nonzero_from_nonequal(i8 %x, i8 %y) {
540539
; CHECK-LABEL: @or_nonzero_from_nonequal(
541540
; CHECK-NEXT: entry:
542541
; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
543542
; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
544543
; CHECK: if.then:
545-
; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], [[Y]]
546-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
547-
; CHECK-NEXT: ret i1 [[CMP]]
544+
; CHECK-NEXT: ret i1 false
548545
; CHECK: if.else:
549546
; CHECK-NEXT: ret i1 false
550547
;

0 commit comments

Comments
 (0)