[llvm-branch-commits] X86: Add X86TTIImpl::isProfitableToSinkOperands hook for immediate operands. (PR #141326)
Nikita Popov via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed May 28 02:53:42 PDT 2025
================
@@ -7170,16 +7165,31 @@ bool X86TTIImpl::isProfitableToSinkOperands(Instruction *I,
II->getIntrinsicID() == Intrinsic::fshr)
ShiftAmountOpNum = 2;
}
-
if (ShiftAmountOpNum == -1)
return false;
+ auto *ShiftAmount = &I->getOperandUse(ShiftAmountOpNum);
- auto *Shuf = dyn_cast<ShuffleVectorInst>(I->getOperand(ShiftAmountOpNum));
+ // A uniform shift amount in a vector shift or funnel shift may be much
+ // cheaper than a generic variable vector shift, so make that pattern visible
+ // to SDAG by sinking the shuffle instruction next to the shift.
+ auto *Shuf = dyn_cast<ShuffleVectorInst>(ShiftAmount);
if (Shuf && getSplatIndex(Shuf->getShuffleMask()) >= 0 &&
isVectorShiftByScalarCheap(I->getType())) {
- Ops.push_back(&I->getOperandUse(ShiftAmountOpNum));
+ Ops.push_back(ShiftAmount);
return true;
}
+ // Casts taking a constant expression (generally derived from a global
+ // variable address) as an operand are profitable to sink because they appear
+ // as subexpressions in the instruction sequence generated by the
+ // LowerTypeTests pass which is expected to pattern match to the rotate
+ // instruction's immediate operand.
+ if (auto *CI = dyn_cast<CastInst>(ShiftAmount)) {
+ if (isa<ConstantExpr>(CI->getOperand(0))) {
+ Ops.push_back(ShiftAmount);
+ return true;
+ }
+ }
----------------
nikic wrote:
This check needs to be more specific. Even the `zext ptrtoint (ptr @g to i8)` pattern would not become a relocatable ror immediate under normal circumstances. The fact that the global has `!absolute_symbol` with an appropriate range is load-bearing here. (Looking at selectRelocImm, it does specifically check for getAbsoluteSymbolRange.)
https://github.com/llvm/llvm-project/pull/141326
More information about the llvm-branch-commits
mailing list