[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Chris Lattner clattner at apple.com
Mon Apr 9 10:24:52 PDT 2007


> Next stage into switch lowering refactoring
> 1. Fix some bugs in the jump table lowering threshold
> 2. Implement much better metric for optimal pivot selection
> 3. Tune thresholds for different lowering methods
> 4. Implement shift-and trick for lowering small (<machine word
> length) cases with few destinations. Good testcase will follow.

Oooh, very cool.

> @@ -1484,20 +1593,33 @@
>
>    uint64_t LSize = FrontCase.size();
>    uint64_t RSize = TSize-LSize;
> +  DOUT << "Selecting best pivot: \n"
> +       << "First: " << First << ", Last: " << Last <<"\n"
> +       << "LSize: " << LSize << ", RSize: " << RSize << "\n";
>    for (CaseItr I = CR.Range.first, J=I+1, E = CR.Range.second;
>         J!=E; ++I, ++J) {
>      int64_t LEnd = cast<ConstantInt>(I->High)->getSExtValue();
>      int64_t RBegin = cast<ConstantInt>(J->Low)->getSExtValue();
> +    assert((RBegin-LEnd>=1) && "Invalid case distance");
>      double LDensity = (double)LSize / (double)((LEnd - First) +  
> 1ULL);
>      double RDensity = (double)RSize / (double)((Last - RBegin) +  
> 1ULL);
> -    if (Density < (LDensity + RDensity)) {
> +    double Metric = log(RBegin-LEnd)*(LDensity+RDensity);

Is there any metric you can use here other than something based on  
'log'?  Can you do this determination with integer arithmetic?

> @@ -1549,6 +1671,130 @@
>    return true;
>  }
>
> +/// handleBitTestsSwitchCase - if current case range has few  
> destination and
> +/// range span less, than machine word bitwidth, encode case range  
> into series
> +/// of masks and emit bit tests with these masks.
> +bool SelectionDAGLowering::handleBitTestsSwitchCase(CaseRec& CR,
> +                                                    CaseRecVector&  
> WorkList,
> +                                                    Value* SV,
> +                                                     
> MachineBasicBlock* Default) {
> +  unsigned IntPtrBits = getSizeInBits(TLI.getPointerTy());
...
> +  if (range>IntPtrBits ||

Using intptr here is a good first step.  However, some targets has  
GPR's wider than intptr_t that are efficient (e.g. a ppc64 chip  
running in ppc32 mode).

Overall, very very nice Anton,

-Chris



More information about the llvm-commits mailing list