[AArch64] Redundant AllOne/AllZero patterns?

Chad Rosier mcrosier at codeaurora.org
Thu Nov 14 08:48:44 PST 2013


All,
I noticed that we have both leaf patterns and pattern fragments for the
AllZero and AllOne patterns in the AArch64 backend:

------------------------------------------------------------------------
def Neon_immAllOnes: PatLeaf<(Neon_movi (i32 timm), (i32 imm)), [{
  ConstantSDNode *ImmConstVal = cast<ConstantSDNode>(N->getOperand(0));
  ConstantSDNode *OpCmodeConstVal = cast<ConstantSDNode>(N->getOperand(1));
  unsigned EltBits;
  uint64_t EltVal = A64Imms::decodeNeonModImm(ImmConstVal->getZExtValue(),
    OpCmodeConstVal->getZExtValue(), EltBits);
  return (EltBits == 8 && EltVal == 0xff);
}]>;

def Neon_immAllZeros: PatLeaf<(Neon_movi (i32 timm), (i32 imm)), [{
  ConstantSDNode *ImmConstVal = cast<ConstantSDNode>(N->getOperand(0));
  ConstantSDNode *OpCmodeConstVal = cast<ConstantSDNode>(N->getOperand(1));
  unsigned EltBits;
  uint64_t EltVal = A64Imms::decodeNeonModImm(ImmConstVal->getZExtValue(),
    OpCmodeConstVal->getZExtValue(), EltBits);
  return (EltBits == 8 && EltVal == 0x0);
}]>

*and*

def Neon_AllZero : PatFrag<(ops), (Neon_movi (i32 0), (i32 14))>;
def Neon_AllOne : PatFrag<(ops), (Neon_movi (i32 255), (i32 14))>;
------------------------------------------------------------------------

Are these redundant?  If so, which should we prefer?

 Chad




More information about the llvm-commits mailing list