[llvm] [SDAG] Construct constants via instructions if materialization is costly (PR #86659)
Wang Pengcheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 26 06:24:18 PDT 2024
================
@@ -8666,14 +8667,32 @@ SDValue TargetLowering::expandCTPOP(SDNode *Node, SelectionDAG &DAG) const {
if (VT.isVector() && !canExpandVectorCTPOP(*this, VT))
return SDValue();
+ const auto &TLI = DAG.getTargetLoweringInfo();
+ const auto &TTI = TLI.getTargetMachine().getTargetTransformInfo(
+ DAG.getMachineFunction().getFunction());
+ Type *VTTy = VT.getScalarType().getTypeForEVT(*DAG.getContext());
+
// This is the "best" algorithm from
// http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
- SDValue Mask55 =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
+ // 0x0F0F0F0F...
+ const APInt &Constant0F = APInt::getSplat(Len, APInt(8, 0x0F));
+ SDValue Mask0F = DAG.getConstant(Constant0F, dl, VT);
+ // 0x33333333... = (0x0F0F0F0F... ^ (0x0F0F0F0F... << 2))
+ const APInt &Constant33 = APInt::getSplat(Len, APInt(8, 0x33));
SDValue Mask33 =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
- SDValue Mask0F =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
+ TTI.getIntImmCost(Constant33, VTTy, TargetTransformInfo::TCK_Latency) > 2
+ ? DAG.getNode(ISD::XOR, dl, VT, Mask0F,
----------------
wangpc-pp wrote:
For scalar, the result will be just like `DAG.getConstant(Constant33, dl, VT)` because we have simplified the DAG. Any way to stop the constant folding here?
https://github.com/llvm/llvm-project/pull/86659
More information about the llvm-commits
mailing list