[PATCH] D72714: [ARM][MVE] WIP: Tail-Predication: rematerialise iteration count in exit blocks
Sjoerd Meijer via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 14 09:08:57 PST 2020
SjoerdMeijer created this revision.
SjoerdMeijer added reviewers: samparker, dmgreen.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: LLVM.
This is a Work-In-Progress patch showing the usage of helper function rewriteLoopExitValues that is refactored out in D72602 <https://reviews.llvm.org/D72602>. We want to rematerialise the iteration count in exit blocks, so that we can clean-up loop update expressions inside the hardware-loops later in ARMLowOverheadLoops.
TODO:
- This should have just worked, except that LCSSA thinks loops are not in LCSSA form, so I will need to look into that, and
- update test cases as do we remove more SUBs from loops now.
https://reviews.llvm.org/D72714
Files:
llvm/lib/Target/ARM/MVETailPredication.cpp
Index: llvm/lib/Target/ARM/MVETailPredication.cpp
===================================================================
--- llvm/lib/Target/ARM/MVETailPredication.cpp
+++ llvm/lib/Target/ARM/MVETailPredication.cpp
@@ -35,12 +35,14 @@
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/TargetPassConfig.h"
+#include "llvm/InitializePasses.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicsARM.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Support/Debug.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+#include "llvm/Transforms/Utils/LoopUtils.h"
using namespace llvm;
@@ -56,8 +58,12 @@
class MVETailPredication : public LoopPass {
SmallVector<IntrinsicInst*, 4> MaskedInsts;
Loop *L = nullptr;
+ LoopInfo *LI = nullptr;
+ const DataLayout *DL;
+ DominatorTree *DT = nullptr;
ScalarEvolution *SE = nullptr;
TargetTransformInfo *TTI = nullptr;
+ TargetLibraryInfo *TLI = nullptr;
public:
static char ID;
@@ -69,8 +75,12 @@
AU.addRequired<LoopInfoWrapperPass>();
AU.addRequired<TargetPassConfig>();
AU.addRequired<TargetTransformInfoWrapperPass>();
+ AU.addRequired<DominatorTreeWrapperPass>();
+ AU.addRequired<TargetLibraryInfoWrapperPass>();
AU.addPreserved<LoopInfoWrapperPass>();
+
AU.setPreservesCFG();
+ getLoopAnalysisUsage(AU);
}
bool runOnLoop(Loop *L, LPPassManager&) override;
@@ -128,8 +138,13 @@
auto &TPC = getAnalysis<TargetPassConfig>();
auto &TM = TPC.getTM<TargetMachine>();
auto *ST = &TM.getSubtarget<ARMSubtarget>(F);
+ DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+ LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+ auto *TLIP = getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
+ TLI = TLIP ? &TLIP->getTLI(*L->getHeader()->getParent()) : nullptr;
+ DL = &L->getHeader()->getModule()->getDataLayout();
this->L = L;
// The MVE and LOB extensions are combined to enable tail-predication, but
@@ -185,7 +200,18 @@
LLVM_DEBUG(dbgs() << "ARM TP: Running on Loop: " << *L << *Setup << "\n"
<< *Decrement << "\n");
- return TryConvert(Setup->getArgOperand(0));
+
+ if (TryConvert(Setup->getArgOperand(0))) {
+ SmallVector<WeakTrackingVH, 16> DeadInsts;
+ SCEVExpander Rewriter(*SE, *DL, "mvetp");
+ ReplaceExitVal ReplaceExitValue = AlwaysRepl;
+
+ rewriteLoopExitValues(L, LI, TLI, SE, Rewriter, DT, ReplaceExitValue,
+ DeadInsts);
+ return true;
+ }
+
+ return false;
}
bool MVETailPredication::isTailPredicate(Instruction *I, Value *NumElements) {
@@ -549,4 +575,5 @@
char MVETailPredication::ID = 0;
INITIALIZE_PASS_BEGIN(MVETailPredication, DEBUG_TYPE, DESC, false, false)
+INITIALIZE_PASS_DEPENDENCY(LoopPass)
INITIALIZE_PASS_END(MVETailPredication, DEBUG_TYPE, DESC, false, false)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72714.237997.patch
Type: text/x-patch
Size: 3062 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200114/3ef1d955/attachment.bin>
More information about the llvm-commits
mailing list