diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -210,7 +210,7 @@ // Do not reason about pointers where the index size is larger than 64 bits, // as the coefficients used to encode constraints are 64 bit integers. if (DL.getIndexTypeSizeInBits(GEP.getPointerOperand()->getType()) > 64) - return {}; + return {{0, nullptr}, {1, &GEP}}; if (!GEP.isInBounds()) return {{0, nullptr}, {1, &GEP}}; @@ -226,7 +226,7 @@ auto GTI = gep_type_begin(GEP); // Bail out for scalable vectors for now. if (isa(GTI.getIndexedType())) - return {}; + return {{0, nullptr}, {1, &GEP}}; int64_t Scale = static_cast( DL.getTypeAllocSize(GTI.getIndexedType()).getFixedSize()); @@ -253,7 +253,7 @@ // Bail out for scalable vectors for now. if (isa(GTI.getIndexedType())) - return {}; + return {{0, nullptr}, {1, &GEP}}; // Struct indices must be constants (and reference an existing field). Add // them to the constant factor. @@ -274,14 +274,11 @@ unsigned Scale = DL.getTypeAllocSize(GTI.getIndexedType()).getFixedSize(); auto IdxResult = decompose(Index, Preconditions, IsSigned, DL); - if (IdxResult.empty()) { - Result.emplace_back(Scale, Index); - } else { - for (auto &KV : IdxResult) - KV.Coefficient = multiplyWithOverflow(KV.Coefficient, Scale); - Result[0].Coefficient += IdxResult[0].Coefficient; - append_range(Result, ArrayRef(IdxResult).drop_front()); - } + for (auto &KV : IdxResult) + KV.Coefficient = multiplyWithOverflow(KV.Coefficient, Scale); + Result[0].Coefficient += IdxResult[0].Coefficient; + append_range(Result, ArrayRef(IdxResult).drop_front()); + // If Op0 is signed non-negative, the GEP is increasing monotonically and // can be de-composed. if (!isKnownNonNegative(Index, DL, /*Depth=*/MaxAnalysisRecursionDepth - 1)) @@ -304,8 +301,6 @@ bool IsSignedB) -> SmallVector { auto ResA = decompose(A, Preconditions, IsSigned, DL); auto ResB = decompose(B, Preconditions, IsSignedB, DL); - if (ResA.empty() || ResB.empty()) - return {}; ResA[0].Coefficient += ResB[0].Coefficient; append_range(ResA, drop_begin(ResB)); return ResA; @@ -327,7 +322,7 @@ if (auto *CI = dyn_cast(V)) { if (CI->uge(MaxConstraintValue)) - return {}; + return {{0, nullptr}, {1, V}}; return {{int64_t(CI->getZExtValue()), nullptr}}; } @@ -434,10 +429,6 @@ Preconditions, IsSigned, DL); auto BDec = decompose(Op1->stripPointerCastsSameRepresentation(), Preconditions, IsSigned, DL); - // Skip if decomposing either of the values failed. - if (ADec.empty() || BDec.empty()) - return {}; - int64_t Offset1 = ADec[0].Coefficient; int64_t Offset2 = BDec[0].Coefficient; Offset1 *= -1; diff --git a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll --- a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll +++ b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll @@ -105,7 +105,7 @@ ; CHECK: then: ; CHECK-NEXT: [[SUB_1:%.*]] = sub nuw i80 [[A]], 1973801615886922022913 ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i80 [[SUB_1]], 1346612317380797267967 -; CHECK-NEXT: ret i1 [[C_1]] +; CHECK-NEXT: ret i1 true ; CHECK: else: ; CHECK-NEXT: ret i1 false ;