[llvm] r322248 - [SimplifyCFG] Add cut-off for InitializeUniqueCases.

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 11 11:28:23 PST 2018


Test case?  Review?  If this was reviewed, please provide names or 
link.  If this was not reviewed, please revert immediately.

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




More information about the llvm-commits mailing list