diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index d8c1096049dce..99670b92187c5 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3043,6 +3043,10 @@ static bool isKnownNonZeroFromOperator(const Operator *I, // (X | (X != 0)) is non zero if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1))) return true; + // X | Y != 0 if X != Y. + if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Q, + Depth)) + return true; // X | Y != 0 if X != 0 or Y != 0. return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) || isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth); diff --git a/llvm/test/Transforms/InstCombine/icmp-dom.ll b/llvm/test/Transforms/InstCombine/icmp-dom.ll index 6613bbeb8d6ae..a72b5e0bbfa03 100644 --- a/llvm/test/Transforms/InstCombine/icmp-dom.ll +++ b/llvm/test/Transforms/InstCombine/icmp-dom.ll @@ -535,16 +535,13 @@ else: ret i1 %cmp1 } -; TODO: X != Y implies X | Y != 0 define i1 @or_nonzero_from_nonequal(i8 %x, i8 %y) { ; CHECK-LABEL: @or_nonzero_from_nonequal( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] ; CHECK: if.then: -; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], [[Y]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: ret i1 false ; CHECK: if.else: ; CHECK-NEXT: ret i1 false ;
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: