llvm/llvm-project

Wrong types checked at DAGCombiner::visitSRA(SDNode *N)

オープン

#153,543 opened on 2025/08/14

 (7 件のコメント) (0 件のリアクション) (1 人の担当者)C++ (10,782 件のフォーク)batch import
good first issuellvm:SelectionDAG

Repository metrics

Stars
 (26,378 個のスター)
PR merge metrics
 (PR metrics pending)

説明

The following check is performed at DAGCombiner::visitSRA(SDNode *N)

if ((ShiftAmt > 0) &&
          TLI.isOperationLegalOrCustom(ISD::SIGN_EXTEND, **TruncVT**) &&
          TLI.isOperationLegalOrCustom(ISD::TRUNCATE, **VT**) &&
          TLI.isTruncateFree(VT, TruncVT)) {
        SDValue Amt = DAG.getShiftAmountConstant(ShiftAmt, VT, DL);
        SDValue Shift = DAG.getNode(ISD::SRL, DL, VT,
                                    N0.getOperand(0), Amt);
        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, TruncVT,
                                    Shift);
        return DAG.getNode(ISD::SIGN_EXTEND, DL,
                           N->getValueType(0), Trunc);
      }

but it should be

if ((ShiftAmt > 0) &&
          TLI.isOperationLegalOrCustom(ISD::SIGN_EXTEND, **VT**) &&
          TLI.isOperationLegalOrCustom(ISD::TRUNCATE, **TruncVT**) &&
          TLI.isTruncateFree(VT, TruncVT)) {
        SDValue Amt = DAG.getShiftAmountConstant(ShiftAmt, VT, DL);
        SDValue Shift = DAG.getNode(ISD::SRL, DL, VT,
                                    N0.getOperand(0), Amt);
        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, TruncVT,
                                    Shift);
        return DAG.getNode(ISD::SIGN_EXTEND, DL,
                           N->getValueType(0), Trunc);
      }

this mistake can cause operation marked with expand to reach selection

コントリビューターガイド