[llvm] [SimplifyCFG] Add optimization for switches of powers of two (PR #70977)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 14 03:18:15 PST 2023
================
@@ -6839,6 +6838,86 @@ static bool ReduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder,
return true;
}
+static bool isSwitchOfPowersOfTwo(ArrayRef<int64_t> Values) {
+ for (auto &Value : Values) {
+ if (!llvm::isPowerOf2_64(Value))
+ return false;
+ }
+
+ return true;
+}
+
+static bool simplifySwitchOfPowersOfTwo(SwitchInst *SI, IRBuilder<> &Builder,
+ const DataLayout &DL,
+ const TargetTransformInfo &TTI) {
+
+ auto *Condition = SI->getCondition();
+ auto &Context = SI->getContext();
+ auto *CondTy = cast<IntegerType>(Condition->getType());
+
+ if (CondTy->getIntegerBitWidth() > 64 ||
+ !DL.fitsInLegalInteger(CondTy->getIntegerBitWidth()))
+ return false;
+
+ const auto CttzIntrinsicCost = TTI.getIntrinsicInstrCost(
+ IntrinsicCostAttributes(Intrinsic::cttz, CondTy,
+ {Condition, ConstantInt::getTrue(Context)}),
+ TTI::TCK_SizeAndLatency);
+
+ if (CttzIntrinsicCost > TTI::TCC_Basic) {
+ // Inserting intrinsic is too expensive
+ return false;
+ }
+
+ // Only bother with this optimization if there are more than 3 switch cases;
+ // SDAG will only bother creating jump tables for 4 or more cases.
+ if (SI->getNumCases() < 4)
+ return false;
+
+ SmallVector<int64_t, 4> Values;
+ for (const auto &Case : SI->cases())
+ Values.push_back(Case.getCaseValue()->getValue().getSExtValue());
----------------
dtcxzyw wrote:
Can you do the `isPowerOf2` check here?
```suggestion
int64_t CaseValue = Case.getCaseValue()->getValue().getSExtValue();
if (llvm::isPowerOf2_64(CaseValue))
Values.push_back(CaseValue);
else
return false;
```
https://github.com/llvm/llvm-project/pull/70977
More information about the llvm-commits
mailing list