[llvm] [AArch64] Improve lowering of truncating uzp1 (PR #82457)

David Sherwood via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 22 02:04:58 PST 2024


================
@@ -21059,20 +21055,53 @@ static SDValue performUzpCombine(SDNode *N, SelectionDAG &DAG,
     return SDValue();
 
   auto getSourceOp = [](SDValue Operand) -> SDValue {
-    const unsigned Opcode = Operand.getOpcode();
-    if (Opcode == ISD::TRUNCATE)
-      return Operand->getOperand(0);
-    if (Opcode == ISD::BITCAST &&
-        Operand->getOperand(0).getOpcode() == ISD::TRUNCATE)
-      return Operand->getOperand(0)->getOperand(0);
-    return SDValue();
+    if (Operand.getOpcode() == ISD::BITCAST)
+      Operand = Operand->getOperand(0);
+    if (Operand.getOpcode() == ISD::AssertSext ||
+        Operand.getOpcode() == ISD::AssertZext)
+      Operand = Operand->getOperand(0);
+    return Operand;
   };
 
   SDValue SourceOp0 = getSourceOp(Op0);
   SDValue SourceOp1 = getSourceOp(Op1);
 
-  if (!SourceOp0 || !SourceOp1)
+  auto IsTruncatingUZP1Concat = [](SDNode *N, LLVMContext &Ctx) -> bool {
+    if (N->getOpcode() != AArch64ISD::UZP1)
+      return false;
+    SDValue Op0 = N->getOperand(0);
+    SDValue Op1 = N->getOperand(1);
+    if (Op0.getOpcode() != ISD::BITCAST || Op1.getOpcode() != ISD::BITCAST)
+      return false;
+    EVT Op0Ty = Op0.getOperand(0).getValueType();
+    if (Op0Ty != Op1.getOperand(0).getValueType())
+      return false;
+
+    EVT ResVT = N->getValueType(0);
+    return ResVT.widenIntegerVectorElementType(Ctx).getHalfNumVectorElementsVT(
----------------
david-arm wrote:

Would it be simpler and clearer to simply write out the list of combinations if the permitted list is small? For example, above we bail out if RetVT is not MVT::v2i32 , MVT::v4i16 or MVT::v8i8, and we shouldn't be doing be widening to a i8 element type. So in theory this then just becomes

```
  return (ResVT == MVT::v4i16 && Op0Ty == MVT::v8i8) || (ResVT == MVT::v2i32 && Op0Ty == MVT::v4i16)
```

or is the idea that you want to extend this in future to cover more cases?

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


More information about the llvm-commits mailing list