================ @@ -6519,17 +6518,60 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, SmallDenseMap<PHINode *, Type *> ResultTypes; SmallVector<PHINode *, 4> PHIs; - for (SwitchInst::CaseIt E = SI->case_end(); CI != E; ++CI) { - ConstantInt *CaseVal = CI->getCaseValue(); - if (CaseVal->getValue().slt(MinCaseVal->getValue())) - MinCaseVal = CaseVal; - if (CaseVal->getValue().sgt(MaxCaseVal->getValue())) - MaxCaseVal = CaseVal; + SmallVector<ConstantInt *, 8> CaseVals; + for (auto CI : SI->cases()) { + ConstantInt *CaseVal = CI.getCaseValue(); + CaseVals.push_back(CaseVal); + } + + // We want to find a range of indexes that will create the minimal table. + // We can treat all possible index values as a circle. For example, the i8 is + // [-128, -1] and [0, 127]. After that find the minimal range from this circle ---------------- DianQK wrote:
The new comment is below: We consider cases where the starting to the endpoint will cross the signed max and min. For example, for the i8 range `[-128, -127, 126, 127]`, we choose from 126 to -127. The length of the lookup table is 4. https://github.com/llvm/llvm-project/pull/67885 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits