[llvm] [LoopInterchange] Update the direction of undistributed loop to EQ (PR #78951)
Madhur Amilkanthwar via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 17 08:03:03 PDT 2024
================
@@ -82,6 +82,101 @@ static void printDepMatrix(CharMatrix &DepMatrix) {
}
#endif
+static bool isDirectionNegative(std::vector<Dependence::DVEntry> &DV) {
+ for (unsigned Level = 1; Level <= DV.size(); ++Level) {
+ unsigned char Direction = DV[Level - 1].Direction;
+ if (Direction == Dependence::DVEntry::EQ)
+ continue;
+ if (Direction == Dependence::DVEntry::GT ||
+ Direction == Dependence::DVEntry::GE)
+ return true;
+ return false;
+ }
+ return false;
+}
+
+static void dumpDirection(raw_ostream &OS,
+ std::vector<Dependence::DVEntry> &DV) {
+ OS << " [";
+ for (unsigned II = 1; II <= DV.size(); ++II) {
+ unsigned Direction = DV[II - 1].Direction;
+ if (Direction == Dependence::DVEntry::ALL)
+ OS << "*";
+ else {
+ if (Direction & Dependence::DVEntry::LT)
+ OS << "<";
+ if (Direction & Dependence::DVEntry::EQ)
+ OS << "=";
+ if (Direction & Dependence::DVEntry::GT)
+ OS << ">";
+ }
+ if (II < DV.size())
+ OS << " ";
+ }
+ OS << "]\n";
+}
+
+// Get the Loops will affect Expr result.
+static void getAffectedLoop(const SCEV *Expr, SmallBitVector &Loops,
+ ScalarEvolution *SE) {
+ const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
+ if (!AddRec)
+ return;
+
+ Loops.set(AddRec->getLoop()->getLoopDepth());
+ const SCEV *Start = AddRec->getStart();
+ const SCEV *Step = AddRec->getStepRecurrence(*SE);
+ getAffectedLoop(Start, Loops, SE);
+ getAffectedLoop(Step, Loops, SE);
+}
+
+// Update the Direction of undistributed loop to EQ.
+static void
+updateUndistributedLoopDirection(std::vector<Dependence::DVEntry> &DV,
+ ScalarEvolution *SE, Instruction *Src,
+ Instruction *Dst) {
+ SmallBitVector DistributedLoops(DV.size() + 1);
+ Value *SrcPtr = getLoadStorePointerOperand(Src);
+ Value *DstPtr = getLoadStorePointerOperand(Dst);
+ const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);
+ const SCEV *DstSCEV = SE->getSCEV(DstPtr);
+ getAffectedLoop(SrcSCEV, DistributedLoops, SE);
+ getAffectedLoop(DstSCEV, DistributedLoops, SE);
+ for (unsigned II = 1; II <= DV.size(); ++II)
+ // Set the direction of the loop to EQ if the loop won't affect the
+ // SCEV of Src and Dst.
+ if (!DistributedLoops.test(II)) {
+ LLVM_DEBUG(dbgs() << "Set level " << II << " loop direction to =\n");
+ DV[II - 1].Direction = Dependence::DVEntry::EQ;
+ }
+}
+
+static bool normalize(std::vector<Dependence::DVEntry> &DV, ScalarEvolution *SE,
----------------
madhur13490 wrote:
I am learning this transformation and came across your patch.
This function is sort of duplicate of FullDependece::normalize() but does not update the distance vector. Do you think we should avoid duplication? and updating distance vector is not necessary?
https://github.com/llvm/llvm-project/pull/78951
More information about the llvm-commits
mailing list