[llvm] [AArch64][LV] Adjust costs for low-VF interleaved access (PR #209441)

Jack Styles via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 15 01:47:29 PDT 2026


================
@@ -5460,13 +5460,19 @@ InstructionCost AArch64TTIImpl::getInterleavedMemoryOpCost(
       }
 
       // llvm.vector.deinterleaveN is lowered as a binary tree of deinterleave2
-      // operations. A binary tree producing Factor leaf vectors has
-      // (Factor -1) inner deinterleave2 nodes. Each deinterleave2 on a pair of
-      // SVE registers emits one uzp1 + one uzp2.
-      // Total shuffle cost: (Factor - 1) deinterleave2 operations, each
-      // processing LT.first legal vector parts,with one uzp shuffle per part.
-      auto LT = getTypeLegalizationCost(VecTy);
-      return MemCost + (Factor - 1) * LT.first;
+      // operations. The tree has Log2(Factor) levels, with Factor UZP/ZIP
+      // operations at each level, giving a total shuffle cost of
+      // Factor * Log2(Factor).
+
+      // For stores, account for an additional legalization cost when
+      // repacking the legalized subvectors into the narrow interleaved
+      // vector.
+      auto LegalizationCost = getTypeLegalizationCost(SubVecTy).first;
+
+      if (Opcode == Instruction::Store)
+        LegalizationCost *= 2;
+
+      return MemCost + (Factor * LegalizationCost) + (Factor * Log2_64(Factor));
----------------
Stylie777 wrote:

(I'm new to these types so more of a question)
Do we need to do anything with LegalizationCost for it to be used with an `unsigned` value in arithmetic operations? I can see `getTypeLegalizationCost` returns a `std::pair`. Before we were using `LT.first` which would make sense, but that seems to have changed.

https://github.com/llvm/llvm-project/pull/209441


More information about the llvm-commits mailing list