[PATCH] D71563: [SCEV] Recognise the hardwareloop "loop.decrement.reg" intrinsic
Sjoerd Meijer via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 16 12:07:37 PST 2019
SjoerdMeijer created this revision.
SjoerdMeijer added reviewers: samparker, fhahn, reames, nikic, sanjoy.google, apilipenko.
Herald added subscribers: javed.absar, hiraditya, kristof.beyls.
Herald added a project: LLVM.
Teach SCEV about the @loop.decrement.reg intrinsic, which has exactly the same semantics as a sub expression. The generic HardwareLoop pass introduced 3 intrinsics to model hardwareloops in IR; the @loop.decrement.reg is used to update the loop induction variable.
Teaching SCEV about @loop.decrement.reg means we can also use SCEV for hardwareloops. For example, we would like to rematerialize the loop iteration count value in loop exit blocks for hardwareloops, and this change allows us to do exactly that. This will enable us to remove any use of loop iteration counts in the hardware loop. I will follow up shortly to further support this (but that will be more ARM specific).
https://reviews.llvm.org/D71563
Files:
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/unittests/Analysis/ScalarEvolutionTest.cpp
Index: llvm/unittests/Analysis/ScalarEvolutionTest.cpp
===================================================================
--- llvm/unittests/Analysis/ScalarEvolutionTest.cpp
+++ llvm/unittests/Analysis/ScalarEvolutionTest.cpp
@@ -1683,6 +1683,34 @@
"} ");
}
+TEST_F(ScalarEvolutionsTest, SCEVLoopDecIntrinsic) {
+ LLVMContext C;
+ SMDiagnostic Err;
+ std::unique_ptr<Module> M = parseAssemblyString(
+ "define void @foo(i32 %N) { "
+ "entry: "
+ " %cmp3 = icmp sgt i32 %N, 0 "
+ " br i1 %cmp3, label %for.body, label %for.cond.cleanup "
+ "for.cond.cleanup: "
+ " ret void "
+ "for.body: "
+ " %i.04 = phi i32 [ %inc, %for.body ], [ 100, %entry ] "
+ " %inc = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %i.04, i32 1) "
+ " %exitcond = icmp ne i32 %inc, 0 "
+ " br i1 %exitcond, label %for.cond.cleanup, label %for.body "
+ "} "
+ "declare i32 @llvm.loop.decrement.reg.i32.i32.i32(i32, i32) ",
+ Err, C);
+
+ ASSERT_TRUE(M && "Could not parse module?");
+ ASSERT_TRUE(!verifyModule(*M) && "Must have been well formed!");
+
+ runWithSE(*M, "foo", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
+ auto *ScevInc = SE.getSCEV(getInstructionByName(F, "inc"));
+ EXPECT_TRUE(isa<SCEVAddRecExpr>(ScevInc));
+ });
+}
+
TEST_F(ScalarEvolutionsTest, SCEVComputeConstantDifference) {
LLVMContext C;
SMDiagnostic Err;
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -4575,6 +4575,17 @@
break;
}
+ // Recognise the loop.decrement.reg intrinsic. This has exactly the same
+ // semantics as a Sub expression, thus we return a Binary Sub expression.
+ if (auto *II = dyn_cast<IntrinsicInst>(V)) {
+ switch (II->getIntrinsicID()) {
+ default:
+ return None;
+ case Intrinsic::loop_decrement_reg:
+ return BinaryOp(Instruction::Sub, II->getOperand(0), II->getOperand(1));
+ }
+ }
+
return None;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71563.234115.patch
Type: text/x-patch
Size: 2103 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191216/e97ffd85/attachment.bin>
More information about the llvm-commits
mailing list