From 2aadad7243aef94914eb0b383496cd230a2629fb Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Wed, 3 Aug 2016 20:54:38 +0000 Subject: [PATCH] GVN-hoist: limit the length of dependent instructions Limit the number of times the while(1) loop is executed. With this restriction the number of hoisted instructions does not change in a significant way on the test-suite. Differential Revision: https://reviews.llvm.org/D23028 llvm-svn: 277651 --- llvm/lib/Transforms/Scalar/GVNHoist.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/llvm/lib/Transforms/Scalar/GVNHoist.cpp b/llvm/lib/Transforms/Scalar/GVNHoist.cpp index 2ddec453edbc..19632d637fa9 100644 --- a/llvm/lib/Transforms/Scalar/GVNHoist.cpp +++ b/llvm/lib/Transforms/Scalar/GVNHoist.cpp @@ -53,6 +53,11 @@ static cl::opt MaxDepthInBB( cl::desc("Hoist instructions from the beginning of the BB up to the " "maximum specified depth (default = 100, unlimited = -1)")); +static cl::opt MaxChainLength( + "gvn-hoist-max-chain-length", cl::Hidden, cl::init(10), + cl::desc("Maximum length of dependent chains to hoist " + "(default = 10, unlimited = -1)")); + namespace { // Provides a sorting function based on the execution order of two instructions. @@ -212,8 +217,13 @@ public: DFSNumber[&Inst] = ++I; } + int ChainLength = 0; + // FIXME: use lazy evaluation of VN to avoid the fix-point computation. while (1) { + if (MaxChainLength != -1 && ++ChainLength >= MaxChainLength) + return Res; + auto HoistStat = hoistExpressions(F); if (HoistStat.first + HoistStat.second == 0) return Res;