[llvm] [LoopRotation] Enable LoopRotation with -Oz if header folds (PR #72842)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 29 14:13:56 PST 2024
================
@@ -365,6 +365,65 @@ static void updateBranchWeights(BranchInst &PreHeaderBI, BranchInst &LoopBI,
}
}
+// Check if duplicating the header to the preheader will fold all duplicated
+// instructions, terminating with an unconditional jump. So No code duplication
+// would be necessary.
+static bool canRotateWithoutDuplication(Loop *L, llvm::LoopInfo *LI,
+ llvm::SimplifyQuery SQ) {
+ BasicBlock *OrigHeader = L->getHeader();
+ BasicBlock *OrigPreheader = L->getLoopPreheader();
+
+ BranchInst *T = dyn_cast<BranchInst>(OrigHeader->getTerminator());
+ assert(T && T->isConditional() && "Header Terminator should be conditional!");
+
+ // a value map to holds the values incoming from preheader
+ ValueToValueMapTy ValueMap;
+
+ // iterate over non-debug instructions and check which ones fold
+ for (Instruction &Inst : OrigHeader->instructionsWithoutDebug()) {
+ // For PHI nodes, the values in the cloned header are the values in the
+ // preheader
+ if (PHINode *PN = dyn_cast<PHINode>(&Inst)) {
+ InsertNewValueIntoMap(ValueMap, PN,
+ PN->getIncomingValueForBlock(OrigPreheader));
+ continue;
+ }
+ if (Inst.mayHaveSideEffects())
+ return false;
+
+ Instruction *C = Inst.clone();
+ C->insertBefore(&Inst);
----------------
nikic wrote:
Why is it necessary to actually clone and remap instructions for this? Can you simplifyInstructionWithOperands() instead?
https://github.com/llvm/llvm-project/pull/72842
More information about the llvm-commits
mailing list