[ARM] VECTOR_REG_CAST undef -> undef
authorDavid Green <david.green@arm.com>
Sun, 28 Feb 2021 11:13:49 +0000 (11:13 +0000)
committerDavid Green <david.green@arm.com>
Sun, 28 Feb 2021 11:13:49 +0000 (11:13 +0000)
Propagate undef through VECTOR_REG_CAST nodes, allowing extra
simplification in some patterns.

llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/Thumb2/mve-be.ll

index cc326b9..4fca4f5 100644 (file)
@@ -14020,6 +14020,10 @@ PerformVECTOR_REG_CASTCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
   if (ST->isLittle())
     return DCI.DAG.getNode(ISD::BITCAST, dl, VT, Op);
 
+  // VECTOR_REG_CAST undef -> undef
+  if (Op.isUndef())
+    return DCI.DAG.getUNDEF(VT);
+
   // VECTOR_REG_CAST(VECTOR_REG_CAST(x)) == VECTOR_REG_CAST(x)
   if (Op->getOpcode() == ARMISD::VECTOR_REG_CAST) {
     // If the valuetypes are the same, we can remove the cast entirely.
index 049f77e..d941036 100644 (file)
@@ -355,4 +355,13 @@ entry:
   ret void
 }
 
+define arm_aapcs_vfpcc <8 x half> @undef_one() {
+; CHECK-LABEL: undef_one:
+; CHECK:       @ %bb.0:
+; CHECK-NEXT:    bx lr
+    %c = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v4f32(<4 x float> undef)
+    ret <8 x half> %c
+}
+
+declare <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v4f32(<4 x float>)
 declare <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32>)