[LVI] Compute range for xor
authorNikita Popov <npopov@redhat.com>
Tue, 17 May 2022 08:18:38 +0000 (10:18 +0200)
committerNikita Popov <npopov@redhat.com>
Tue, 17 May 2022 08:18:38 +0000 (10:18 +0200)
We do have a non-trivial implementation for binaryXor() now.

llvm/lib/Analysis/LazyValueInfo.cpp
llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

index d159333..5fa5a30 100644 (file)
@@ -955,13 +955,6 @@ Optional<ValueLatticeElement> LazyValueInfoImpl::solveBlockValueBinaryOp(
     BinaryOperator *BO, BasicBlock *BB) {
   assert(BO->getOperand(0)->getType()->isSized() &&
          "all operands to binary operators are sized");
-  if (BO->getOpcode() == Instruction::Xor) {
-    // Xor is the only operation not supported by ConstantRange::binaryOp().
-    LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
-                      << "' - overdefined (unknown binary operator).\n");
-    return ValueLatticeElement::getOverdefined();
-  }
-
   if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(BO)) {
     unsigned NoWrapKind = 0;
     if (OBO->hasNoUnsignedWrap())
index d7730fc..7a08f4d 100644 (file)
@@ -1832,12 +1832,10 @@ define void @xor(i8 %a, i1* %p) {
 ; CHECK-LABEL: @xor(
 ; CHECK-NEXT:    [[A_MASK:%.*]] = and i8 [[A:%.*]], 15
 ; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[A_MASK]], -86
-; CHECK-NEXT:    [[C1:%.*]] = icmp uge i8 [[XOR]], -96
-; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    store i1 true, i1* [[P:%.*]], align 1
 ; CHECK-NEXT:    [[C2:%.*]] = icmp ugt i8 [[XOR]], -96
 ; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
-; CHECK-NEXT:    [[C3:%.*]] = icmp ule i8 [[XOR]], -81
-; CHECK-NEXT:    store i1 [[C3]], i1* [[P]], align 1
+; CHECK-NEXT:    store i1 true, i1* [[P]], align 1
 ; CHECK-NEXT:    [[C4:%.*]] = icmp ult i8 [[XOR]], -81
 ; CHECK-NEXT:    store i1 [[C4]], i1* [[P]], align 1
 ; CHECK-NEXT:    ret void