[llvm] [CGP] [CodeGenPrepare] Folding `urem` with loop invariant value plus offset (PR #104724)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 21 11:30:45 PDT 2024
================
@@ -2066,6 +2094,29 @@ static bool foldURemOfLoopIncrement(Instruction *Rem, const DataLayout *DL,
Loop *L = LI->getLoopFor(LoopIncrPN->getParent());
Value *Start = LoopIncrPN->getIncomingValueForBlock(L->getLoopPreheader());
+ // If we have add/sub create initial value for remainder.
+ // The logic here is:
+ // (urem (add/sub nuw Start, IncrLoopInvariant), RemAmtLoopInvariant
+ //
+ // Only proceed if the expression simplifies (otherwise we can't fully
+ // optimize out the urem).
+ if (AddOrSub) {
+ assert(AddOrSubOffset && AddOrSubInst &&
+ "We found an add/sub but missing values");
+ // Without dom-condition/assumption cache we aren't likely to get much out
+ // of a context instruction.
+ const SimplifyQuery Q(*DL);
+ bool NSW = cast<OverflowingBinaryOperator>(AddOrSubInst)->hasNoSignedWrap();
----------------
goldsteinn wrote:
Fixed + Tests.
https://github.com/llvm/llvm-project/pull/104724
More information about the llvm-commits
mailing list