[SVEV] Recognise hardware-loop intrinsic loop.decrement.reg
authorSjoerd Meijer <sjoerd.meijer@arm.com>
Fri, 10 Jan 2020 09:30:02 +0000 (09:30 +0000)
committerSjoerd Meijer <sjoerd.meijer@arm.com>
Fri, 10 Jan 2020 09:35:00 +0000 (09:35 +0000)
commit67bf9a6154d4b82c6c01aad01141bf08c1bbd0f6
treea58b3de84821ee7eb0dc42325cc5b6a8b18cd788
parent346de9b67228f42eb9b55fa3b426b5dedfdb1d40
[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
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Transforms/IndVarSimplify/lftr.ll
llvm/test/Transforms/LoopUnroll/ARM/dont-unroll-loopdec.ll [new file with mode: 0644]
llvm/unittests/Analysis/ScalarEvolutionTest.cpp