[llvm] [GlobalISel] Fast-path single vreg values in getOrCreateVRegs (PR #195244)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 1 02:44:16 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-globalisel
Author: Cullen Rhodes (c-rhodes)
<details>
<summary>Changes</summary>
IRTranslator::translateLoad is hot in compile-time profiles of sqlite on aarch64-O0-g. Aggregates are flattened into multiple vregs with offsets. Avoiding this path for single vregs is a small -0.11% compile-time win.
https://llvm-compile-time-tracker.com/compare.php?from=a7a2dc59616a8cb1198d933bcdf55ebdbd78894c&to=96fcfe733947db64effd5e1d1413697981cbe357&stat=instructions%3Au
---
Full diff: https://github.com/llvm/llvm-project/pull/195244.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp (+25-20)
``````````diff
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index b5b73332bac62..c10dac30d7695 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -218,6 +218,25 @@ ArrayRef<Register> IRTranslator::getOrCreateVRegs(const Value &Val) {
assert(Val.getType()->isSized() &&
"Don't know how to create an empty vreg");
+ // Fast-path values that lower to a single vreg.
+ if (!Val.getType()->isAggregateType()) {
+ LLT Ty = getLLTForType(*Val.getType(), *DL);
+ if (Offsets->empty())
+ Offsets->push_back(0);
+ VRegs->push_back(MRI->createGenericVirtualRegister(Ty));
+ if (isa<Constant>(Val)) {
+ bool Success = translate(cast<Constant>(Val), VRegs->front());
+ if (!Success) {
+ OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
+ MF->getFunction().getSubprogram(),
+ &MF->getFunction().getEntryBlock());
+ R << "unable to translate constant: " << ore::NV("Type", Val.getType());
+ reportTranslationError(*MF, *ORE, R);
+ }
+ }
+ return *VRegs;
+ }
+
SmallVector<LLT, 4> SplitTys;
computeValueLLTs(*DL, *Val.getType(), SplitTys,
Offsets->empty() ? Offsets : nullptr);
@@ -228,26 +247,12 @@ ArrayRef<Register> IRTranslator::getOrCreateVRegs(const Value &Val) {
return *VRegs;
}
- if (Val.getType()->isAggregateType()) {
- // UndefValue, ConstantAggregateZero
- auto &C = cast<Constant>(Val);
- unsigned Idx = 0;
- while (auto Elt = C.getAggregateElement(Idx++)) {
- auto EltRegs = getOrCreateVRegs(*Elt);
- llvm::append_range(*VRegs, EltRegs);
- }
- } else {
- assert(SplitTys.size() == 1 && "unexpectedly split LLT");
- VRegs->push_back(MRI->createGenericVirtualRegister(SplitTys[0]));
- bool Success = translate(cast<Constant>(Val), VRegs->front());
- if (!Success) {
- OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
- MF->getFunction().getSubprogram(),
- &MF->getFunction().getEntryBlock());
- R << "unable to translate constant: " << ore::NV("Type", Val.getType());
- reportTranslationError(*MF, *ORE, R);
- return *VRegs;
- }
+ // UndefValue, ConstantAggregateZero
+ auto &C = cast<Constant>(Val);
+ unsigned Idx = 0;
+ while (auto Elt = C.getAggregateElement(Idx++)) {
+ auto EltRegs = getOrCreateVRegs(*Elt);
+ llvm::append_range(*VRegs, EltRegs);
}
return *VRegs;
``````````
</details>
https://github.com/llvm/llvm-project/pull/195244
More information about the llvm-commits
mailing list