From 76908cba94b4e6c3d8cdd8322facfa1c283439da Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Fri, 13 Feb 2015 03:48:38 +0000 Subject: [PATCH] [unroll] Use a small set to de-duplicate operands prior to putting them into the worklist. This avoids allocating lots of worklist memory for them when there are large numbers of repeated operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229052 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnrollPass.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index bffaec01336..e4771dbc89b 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -503,6 +503,12 @@ public: SmallVector Worklist; SmallPtrSet DeadInstructions; + // We keep a very small set of operands that we use to de-duplicate things + // when inserting into the worklist. This lets us handle duplicates within + // a single instruction's operands without buring lots of memory on the + // worklist. + SmallPtrSet OperandSet; + // Start by initializing worklist with simplified instructions. for (auto &FoldedKeyValue : SimplifiedValues) if (auto *FoldedInst = dyn_cast(FoldedKeyValue.first)) { @@ -510,9 +516,11 @@ public: // Add each instruction operand of this dead instruction to the // worklist. + OperandSet.clear(); for (auto *Op : FoldedInst->operand_values()) if (auto *OpI = dyn_cast(Op)) - Worklist.push_back(OpI); + if (OperandSet.insert(OpI).second) + Worklist.push_back(OpI); } // If a definition of an insn is only used by simplified or dead @@ -537,9 +545,11 @@ public: if (AllUsersFolded) { NumberOfOptimizedInstructions += TTI.getUserCost(I); DeadInstructions.insert(I); + OperandSet.clear(); for (auto *Op : I->operand_values()) if (auto *OpI = dyn_cast(Op)) - Worklist.push_back(OpI); + if (OperandSet.insert(OpI).second) + Worklist.push_back(OpI); } } return NumberOfOptimizedInstructions; -- 2.34.1