[PATCH] D100812: [DAGCombiner] Allow operand of step_vector to be negative.
Paul Walker via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 21 02:58:34 PDT 2021
paulwalker-arm added inline comments.
================
Comment at: llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp:4794-4795
APInt StepVal = cast<ConstantSDNode>(N->getOperand(0))->getAPIntValue();
- SDValue Step = DAG.getConstant(StepVal.getZExtValue(), dl, NOutElemVT);
+ SDValue Step = DAG.getConstant(
+ StepVal.sextOrTrunc(NOutElemVT.getSizeInBits()), dl, NOutElemVT);
return DAG.getStepVector(dl, NOutVT, Step);
----------------
Is calling sextOrTrunc necessary? I would have thought you could just replace `getZExtValue()` with `getSExtValue()`.
That said with @frasercrmck previous patch to remove the size restriction of `STEP_VECTOR`'s operands I don't believe there's need for this function to extend the operand at all and so `N->getOperand(0)` can be passed directly to `getStepVector`.
================
Comment at: llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp:1658-1665
+ APInt StepVal = cast<ConstantSDNode>(Step)->getAPIntValue();
SDValue StartOfHi =
- DAG.getVScale(dl, EltVT,
- cast<ConstantSDNode>(Step)->getAPIntValue() *
- LoVT.getVectorMinNumElements());
- StartOfHi = DAG.getZExtOrTrunc(StartOfHi, dl, HiVT.getVectorElementType());
+ DAG.getVScale(dl, EltVT, StepVal * LoVT.getVectorMinNumElements());
+ StartOfHi =
+ StepVal.isNonNegative()
+ ? DAG.getZExtOrTrunc(StartOfHi, dl, HiVT.getVectorElementType())
+ : DAG.getSExtOrTrunc(StartOfHi, dl, HiVT.getVectorElementType());
----------------
This doesn't look correct to me. The operand is either signed or unsigned and should be treated accordingly. Given this patch wants to allow negative value then we're essentially converting the STEP_VECTOR to take a signed operand and should always use SExt.
That said I'm wondering if the issue here is using DAG to do the extension even though the operand is defined to be a constant. Perhaps the following works for you?
```
SDValue StartOfHi =
DAG.getVScale(HiVT.getVectorElementType(), StepVal * LoVT.getVectorMinNumElements());
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100812/new/
https://reviews.llvm.org/D100812
More information about the llvm-commits
mailing list