[llvm] r322248 - [SimplifyCFG] Add cut-off for InitializeUniqueCases.
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 11 11:31:04 PST 2018
On 01/11/2018 11:28 AM, Philip Reames via llvm-commits wrote:
> Test case? Review? If this was reviewed, please provide names or
> link. If this was not reviewed, please revert immediately.
Let me rephrase that last sentence since it comes across harsher than I
meant.
This appears to be a non-obvious change. We require pre-commit review
for such changes. If that was not done, please revert and go through
the normal review process before resubmission.
Philip
>
> On 01/10/2018 06:01 PM, Marcello Maggioni via llvm-commits wrote:
>> Author: mggm
>> Date: Wed Jan 10 18:01:16 2018
>> New Revision: 322248
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=322248&view=rev
>> Log:
>> [SimplifyCFG] Add cut-off for InitializeUniqueCases.
>>
>> The function can take a significant amount of time on some
>> complicated test cases, but for the currently only use of
>> the function we can stop the initialization much earlier
>> when we find out we are going to discard the result anyway
>> in the caller of the function.
>>
>> Adding configurable cut-off points so that we avoid wasting time.
>> NFCI.
>>
>> Modified:
>> llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=322248&r1=322247&r2=322248&view=diff
>> ==============================================================================
>>
>> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Jan 10
>> 18:01:16 2018
>> @@ -4670,30 +4670,31 @@ GetCaseResults(SwitchInst *SI, ConstantI
>> }
>> // Helper function used to add CaseVal to the list of cases that
>> generate
>> -// Result.
>> -static void MapCaseToResult(ConstantInt *CaseVal,
>> - SwitchCaseResultVectorTy &UniqueResults,
>> - Constant *Result) {
>> +// Result. Returns the updated number of cases that generate this
>> result.
>> +static uintptr_t MapCaseToResult(ConstantInt *CaseVal,
>> + SwitchCaseResultVectorTy
>> &UniqueResults,
>> + Constant *Result) {
>> for (auto &I : UniqueResults) {
>> if (I.first == Result) {
>> I.second.push_back(CaseVal);
>> - return;
>> + return I.second.size();
>> }
>> }
>> UniqueResults.push_back(
>> std::make_pair(Result, SmallVector<ConstantInt *, 4>(1,
>> CaseVal)));
>> + return 1;
>> }
>> // Helper function that initializes a map containing
>> // results for the PHI node of the common destination block for a
>> switch
>> // instruction. Returns false if multiple PHI nodes have been found
>> or if
>> // there is not a common destination block for the switch.
>> -static bool InitializeUniqueCases(SwitchInst *SI, PHINode *&PHI,
>> - BasicBlock *&CommonDest,
>> - SwitchCaseResultVectorTy
>> &UniqueResults,
>> - Constant *&DefaultResult,
>> - const DataLayout &DL,
>> - const TargetTransformInfo &TTI) {
>> +static bool
>> +InitializeUniqueCases(SwitchInst *SI, PHINode *&PHI, BasicBlock
>> *&CommonDest,
>> + SwitchCaseResultVectorTy &UniqueResults,
>> + Constant *&DefaultResult, const DataLayout &DL,
>> + const TargetTransformInfo &TTI,
>> + uintptr_t MaxUniqueResults, uintptr_t
>> MaxCasesPerResult) {
>> for (auto &I : SI->cases()) {
>> ConstantInt *CaseVal = I.getCaseValue();
>> @@ -4706,7 +4707,18 @@ static bool InitializeUniqueCases(Switch
>> // Only one value per case is permitted
>> if (Results.size() > 1)
>> return false;
>> - MapCaseToResult(CaseVal, UniqueResults, Results.begin()->second);
>> +
>> + // Add the case->result mapping to UniqueResults.
>> + const uintptr_t NumCasesForResult =
>> + MapCaseToResult(CaseVal, UniqueResults,
>> Results.begin()->second);
>> +
>> + // Early out if there are too many cases for this result.
>> + if (NumCasesForResult > MaxCasesPerResult)
>> + return false;
>> +
>> + // Early out if there are too many unique results.
>> + if (UniqueResults.size() > MaxUniqueResults)
>> + return false;
>> // Check the PHI consistency.
>> if (!PHI)
>> @@ -4806,7 +4818,7 @@ static bool switchToSelect(SwitchInst *S
>> SwitchCaseResultVectorTy UniqueResults;
>> // Collect all the cases that will deliver the same value from
>> the switch.
>> if (!InitializeUniqueCases(SI, PHI, CommonDest, UniqueResults,
>> DefaultResult,
>> - DL, TTI))
>> + DL, TTI, 2, 1))
>> return false;
>> // Selects choose between maximum two values.
>> if (UniqueResults.size() != 2)
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list