Skip to content

Commit 149cb5c

Browse files
authored
[ValueTracking] Infer X | Y != 0 from X != Y (#117443)
Alive2: https://alive2.llvm.org/ce/z/cJ75Ya Closes #117436.
1 parent 9e16792 commit 149cb5c

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
@@ -3043,6 +3043,10 @@ static bool isKnownNonZeroFromOperator(const Operator *I,
30433043
// (X | (X != 0)) is non zero
30443044
if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1)))
30453045
return true;
3046+
// X | Y != 0 if X != Y.
3047+
if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Q,
3048+
Depth))
3049+
return true;
30463050
// X | Y != 0 if X != 0 or Y != 0.
30473051
return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) ||
30483052
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)