[llvm] [SCEVExpander] Attempt to reinfer flags dropped due to CSE (PR #72431)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 7 11:10:17 PST 2023
================
@@ -1532,8 +1532,28 @@ Value *SCEVExpander::expand(const SCEV *S) {
V = visit(S);
V = fixupLCSSAFormFor(V);
} else {
- for (Instruction *I : DropPoisonGeneratingInsts)
+ for (Instruction *I : DropPoisonGeneratingInsts) {
I->dropPoisonGeneratingFlagsAndMetadata();
+ // See if we can re-infer from first principles any of the flags we just
+ // dropped.
+ if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(I))
+ if (auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
+ auto *BO = cast<BinaryOperator>(I);
+ BO->setHasNoUnsignedWrap(
+ ScalarEvolution::maskFlags(*Flags, SCEV::FlagNUW) == SCEV::FlagNUW);
+ BO->setHasNoSignedWrap(
+ ScalarEvolution::maskFlags(*Flags, SCEV::FlagNSW) == SCEV::FlagNSW);
+ }
+ if (auto *NNI = dyn_cast<PossiblyNonNegInst>(I)) {
+ auto *Src = NNI->getOperand(0);
+ if (SE.isKnownNonNegative(SE.getSCEV(Src)) ||
+ isKnownNonNegative(Src, DL, 0, &SE.AC, I, &SE.DT) ||
+ isImpliedByDomCondition(ICmpInst::ICMP_SGE, Src,
+ Constant::getNullValue(Src->getType()), I,
+ DL).value_or(false))
----------------
preames wrote:
Deleted for now. I'd originally intended for this to be read along side https://github.com/llvm/llvm-project/pull/72437, but let's keep them separate for now.
https://github.com/llvm/llvm-project/pull/72431
More information about the llvm-commits
mailing list