[llvm] [AArch64] Lower alias mask to a whilewr (PR #100769)
    David Green via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Mon Jul 29 10:49:41 PDT 2024
    
    
  
================
@@ -13782,8 +13784,89 @@ static SDValue tryLowerToSLI(SDNode *N, SelectionDAG &DAG) {
   return ResultSLI;
 }
 
+/// Try to lower the construction of a pointer alias mask to a WHILEWR.
+/// The mask's enabled lanes represent the elements that will not overlap across
+/// one loop iteration. This tries to match: or (splat (setcc_lt (sub ptrA,
+/// ptrB), -(element_size - 1))),
+///    (get_active_lane_mask 0, (div (sub ptrA, ptrB), element_size))
+SDValue tryWhileWRFromOR(SDValue Op, SelectionDAG &DAG) {
+  if (!DAG.getSubtarget<AArch64Subtarget>().hasSVE2())
+    return SDValue();
+  auto LaneMask = Op.getOperand(0);
+  auto Splat = Op.getOperand(1);
+
+  if (LaneMask.getOpcode() != ISD::INTRINSIC_WO_CHAIN ||
----------------
davemgreen wrote:
Or is commutative, should we try and match or(LaneMask, Splat) and or (Splat, LaneMask)?
You can often check
```
if (Splat.getOpcode() != ISD::SPLAT_VECTOR)
  std::swap(LaneMask, Splat);
```
https://github.com/llvm/llvm-project/pull/100769
    
    
More information about the llvm-commits
mailing list