[PATCH] D148594: [X86] Transform `(cmp eq/ne trunc(X), C)` -> `(cmp eq/ne X, Zext(C))`

Noah Goldstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 19 18:58:22 PDT 2023


goldstein.w.n added a comment.

In D148594#4282222 <https://reviews.llvm.org/D148594#4282222>, @goldstein.w.n wrote:

> In D148594#4279779 <https://reviews.llvm.org/D148594#4279779>, @RKSimon wrote:
>
>> LGTM - we might want to consider a DAGISel peephole to take of cases where we lose signextended imm8 values.
>
> DAGISel? Which file is that? X86ISelDAGToDAG.cpp?

Assume that.

I tried:

  EVT OpVT = N0.getValueType();
  if (OpVT.isScalarInteger() && OpVT.getScalarSizeInBits() > 8 &&
      !isNullConstant(N1)) {
    const APInt &C = cast<ConstantSDNode>(N1)->getAPIntValue();
    if (C.getSignificantBits() <= 8 &&
        CurDAG->MaskedValueIsZero(
            N0, APInt::getBitsSetFrom(OpVT.getScalarSizeInBits(), 8))) {
      SDValue TruncN0 = CurDAG->getZExtOrTrunc(N0, dl, MVT::i8);
      insertDAGNode(*CurDAG, SDValue(Node, 0), TruncN0);
      SDValue TruncN1 = getI8Imm(C.truncSSat(8).getZExtValue(), dl);
      insertDAGNode(*CurDAG, SDValue(Node, 0), TruncN1);
      SDValue NewCmp =
          CurDAG->getNode(X86ISD::CMP, dl, MVT::i32, N0, TruncN1);
      ReplaceNode(Node, NewCmp.getNode());
      if (N1.getNode()->use_empty())
        CurDAG->RemoveDeadNode(N1.getNode());
      SelectCode(NewCmp.getNode());
      return;
    }
  }

In `X86ISD::CMP` handling of `select` but fail in `X86InstrInfo::analyzeCompare`
with:

  MachineOperand.h:370: llvm::Register llvm::MachineOperand::getReg() const: Assertion `isReg() && "This is not a register operand!"' failed.

See anything obviously wrong in home I'm setting this up?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148594/new/

https://reviews.llvm.org/D148594



More information about the llvm-commits mailing list