[llvm] e5dc4db - [LICM][NFC] Restructure code to have one entry point for reassociation-based hoistings
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 11 00:19:20 PDT 2023
Author: Max Kazantsev
Date: 2023-04-11T14:18:53+07:00
New Revision: e5dc4dbe8750b80987af5fb38557fd03447ca467
URL: https://github.com/llvm/llvm-project/commit/e5dc4dbe8750b80987af5fb38557fd03447ca467
DIFF: https://github.com/llvm/llvm-project/commit/e5dc4dbe8750b80987af5fb38557fd03447ca467.diff
LOG: [LICM][NFC] Restructure code to have one entry point for reassociation-based hoistings
We already hoist min/max functions and want to do more of this kind. Some
refactoring to make growth points for it.
Added:
Modified:
llvm/lib/Transforms/Scalar/LICM.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index 178808202b7e5..bb450b2e86421 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -170,6 +170,10 @@ static bool pointerInvalidatedByLoop(MemorySSA *MSSA, MemoryUse *MU,
bool InvariantGroup);
static bool pointerInvalidatedByBlock(BasicBlock &BB, MemorySSA &MSSA,
MemoryUse &MU);
+/// Aggregates various functions for hoisting computations out of loop.
+static bool hoistArithmetics(Instruction &I, Loop &L,
+ ICFLoopSafetyInfo &SafetyInfo,
+ MemorySSAUpdater &MSSAU);
/// Try to simplify things like (A < INV_1 AND icmp A < INV_2) into (A <
/// min(INV_1, INV_2)), if INV_1 and INV_2 are both loop invariants and their
/// minimun can be computed outside of loop, and X is not a loop-invariant.
@@ -983,11 +987,9 @@ bool llvm::hoistRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
}
}
- // Optimize complex patterns, such as (x < INV1 && x < INV2), turning them
- // into (x < min(INV1, INV2)), and hoisting the invariant part of this
- // expression out of the loop.
- if (hoistMinMax(I, *CurLoop, *SafetyInfo, MSSAU)) {
- ++NumMinMaxHoisted;
+ // Try to reassociate instructions so that part of computations can be
+ // done out of loop.
+ if (hoistArithmetics(I, *CurLoop, *SafetyInfo, MSSAU)) {
Changed = true;
continue;
}
@@ -2493,6 +2495,19 @@ static bool hoistMinMax(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo,
return true;
}
+static bool hoistArithmetics(Instruction &I, Loop &L,
+ ICFLoopSafetyInfo &SafetyInfo,
+ MemorySSAUpdater &MSSAU) {
+ // Optimize complex patterns, such as (x < INV1 && x < INV2), turning them
+ // into (x < min(INV1, INV2)), and hoisting the invariant part of this
+ // expression out of the loop.
+ if (hoistMinMax(I, L, SafetyInfo, MSSAU)) {
+ ++NumMinMaxHoisted;
+ return true;
+ }
+ return false;
+}
+
/// Little predicate that returns true if the specified basic block is in
/// a subloop of the current one, not the current one itself.
///
More information about the llvm-commits
mailing list