[PATCH] D106555: [PowerPC] handle more splat loads
Jinsong Ji via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 26 08:01:13 PDT 2021
jsji added inline comments.
================
Comment at: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:5825
+ // Perm = VPERM Load, Load, Mask
+ // Splat = VSPLTH 15/0, Perm
+ SDNode *Mask = CurDAG->getMachineNode(
----------------
VSPLTB?
================
Comment at: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:5847
+ return;
+ } else if (N->getValueType(0) == MVT::v8i16) {
+ // v8i16 LD_SPLAT addr
----------------
clang-tidy has warneed, don't use 'else' after 'return'.
================
Comment at: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:5855
+ // Splat = VSPLTH 7/0, Perm
+ SDNode *Mask = CurDAG->getMachineNode(
+ Subtarget->isLittleEndian() ? PPC::LVSR : PPC::LVSL, dl, MVT::v8i16,
----------------
The code patterns are very similar for these two cases, can we common them?
eg: something like:
```
SDNode *Mask = CurDAG->getMachineNode(
Subtarget->isLittleEndian() ? PPC::LVSR : PPC::LVSL, dl, N->getValueType(0) ,
CurDAG->getRegister(ZeroReg, MVT::i64), N->getOperand(1));
SDNode *Load =
CurDAG->getMachineNode(PPC::LVX, dl, N->getValueType(0), MVT::Other,
{CurDAG->getRegister(ZeroReg, MVT::i64),
N->getOperand(1), N->getOperand(0)});
opcode = ...
splatconst=...
if (N->getValueType(0) == MVT::v8i16){
SDNode *LoadHigh = CurDAG->getMachineNode(
PPC::LVX, dl, MVT::v16i8, MVT::Other,
{SDValue(CurDAG->getMachineNode(
LIOpcode, dl, MVT::i32,
CurDAG->getTargetConstant(1, dl, MVT::i8)),
0),
N->getOperand(1), SDValue(Load, 1)});
Load = LoadHigh;
opcode=...
spltconst =...
}
CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 1), SDValue(Load, 1));
transferMemOperands(N, Load);
CurDAG->SelectNodeTo(
N, opcode, N->getValueType(0),
spliconst,
SDValue(Perm, 0));
```
================
Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:9206
+ // these cases.
+ if (NumUsesOfInputLD == 1 &&
+ ((Op->getValueType(0) == MVT::v2i64 &&
----------------
Can we split this into multiple early returns, with comments to corresponding ones.
```
//case 1 ...
if(...)
return SDValue();
//case 2 ...
if(...)
return SDValue();
...
```
================
Comment at: llvm/lib/Target/PowerPC/PPCInstrVSX.td:2835
+def : Pat<(v4f32 (PPCldsplat ForceXForm:$A)),
+ (v4f32 (XXSPLTW (SUBREG_TO_REG (i64 1), (LFIWZX ForceXForm:$A), sub_64), 1))>;
def : Pat<(v2i64 (PPCldsplat ForceXForm:$A)),
----------------
Do we need some conditional checking here? As `LFIWZX` is changing the type to int now, are there any precision change?
================
Comment at: llvm/lib/Target/PowerPC/PPCInstrVSX.td:3556
+def : Pat<(v8i16 (PPCldsplat ForceXForm:$A)),
+ (v8i16 (VSPLTHs 3, (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (LHZX ForceXForm:$A), sub_32))))>;
+def : Pat<(v16i8 (PPCldsplat ForceXForm:$A)),
----------------
Do we need to predicate 64 bit before using `MTVSRD`?
================
Comment at: llvm/lib/Target/PowerPC/PPCInstrVSX.td:4107
+def : Pat<(v8i16 (PPCldsplat ForceXForm:$A)),
+ (v8i16 (VSPLTHs 3, (LXSIHZX ForceXForm:$A)))>;
+def : Pat<(v16i8 (PPCldsplat ForceXForm:$A)),
----------------
Do we need alignment check here for `LXSIHZX`?
================
Comment at: llvm/test/CodeGen/PowerPC/canonical-merge-shuffles.ll:646
+; CHECK-P8-NEXT: lfiwzx f0, r3, r4
+; CHECK-P8-NEXT: xxspltd v2, f0, 0
+; CHECK-P8-NEXT: vmrglb v2, v3, v2
----------------
`f0` here looks weird regarding register classes, `xxspltd` does need `vs0` to get the `element 0` of doubleword. Maybe we should follow up to see why we are printing `f0` here in ASMPrinter.
================
Comment at: llvm/test/CodeGen/PowerPC/scalar_vector_test_3.ll:18
; P9LE-NEXT: blr
-
+;
; P9BE-LABEL: s2v_test1:
----------------
Unrelated changes?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D106555/new/
https://reviews.llvm.org/D106555
More information about the llvm-commits
mailing list