summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ScalarEvolution.cpp
diff options
context:
space:
mode:
authorSjoerd Meijer <sjoerd.meijer@arm.com>2020-01-10 09:30:02 +0000
committerSjoerd Meijer <sjoerd.meijer@arm.com>2020-01-10 09:35:00 +0000
commit67bf9a6154d4b82c6c01aad01141bf08c1bbd0f6 (patch)
treea58b3de84821ee7eb0dc42325cc5b6a8b18cd788 /llvm/lib/Analysis/ScalarEvolution.cpp
parent346de9b67228f42eb9b55fa3b426b5dedfdb1d40 (diff)
downloadbcm5719-llvm-67bf9a6154d4b82c6c01aad01141bf08c1bbd0f6.tar.gz
bcm5719-llvm-67bf9a6154d4b82c6c01aad01141bf08c1bbd0f6.zip
[SVEV] Recognise hardware-loop intrinsic loop.decrement.reg
Teach SCEV about the @loop.decrement.reg intrinsic, which has exactly the same semantics as a sub expression. This allows us to query hardware-loops, which contain this @loop.decrement.reg intrinsic, so that we can calculate iteration counts, exit values, etc. of hardwareloops. This "int_loop_decrement_reg" intrinsic is defined as "IntrNoDuplicate". Thus, while hardware-loops and tripcounts now become analysable by SCEV, this prevents the usual loop transformations from applying transformations on hardware-loops, which is what we want at this point, for which I have added test cases for loopunrolling and IndVarSimplify and LFTR. Differential Revision: https://reviews.llvm.org/D71563
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index e636854ad6d..7d5c71eafed 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -4507,6 +4507,17 @@ static Optional<BinaryOp> MatchBinaryOp(Value *V, DominatorTree &DT) {
if (!Op)
return None;
+ // Recognise intrinsic loop.decrement.reg, and as this has exactly the same
+ // semantics as a Sub, return a binary sub expression.
+ if (auto *II = dyn_cast<IntrinsicInst>(V)) {
+ switch (II->getIntrinsicID()) {
+ case Intrinsic::loop_decrement_reg:
+ return BinaryOp(Instruction::Sub, II->getOperand(0), II->getOperand(1));
+ default:
+ return None;
+ }
+ }
+
// Implementation detail: all the cleverness here should happen without
// creating new SCEV expressions -- our caller knowns tricks to avoid creating
// SCEV expressions when possible, and we should not break that.
OpenPOWER on IntegriCloud