[PATCH] D80131: [x86] favor vector constant load to avoid GPR to XMM transfer, part 2
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 18 13:33:56 PDT 2020
spatel marked an inline comment as done.
spatel added inline comments.
================
Comment at: llvm/lib/Target/X86/X86ISelLowering.cpp:35802
+ return DAG.getLoad(VT, DL, DAG.getEntryNode(), CP, MPI, Alignment,
+ MachineMemOperand::MOLoad);
+ }
----------------
RKSimon wrote:
> Would creating X86ISD::VZEXT_LOAD be better? We'd need to zext i8/i16 cases to i32 constant pool entries but we'd avoid the upper zero constants.
My 1st draft of this patch used VZEXT_LOAD, and I think it worked without having to explicitly zext here. Does this match what you're thinking of? If so, this leads to the trade-off mentioned in the description - we save some constant space, but lose some load folds.
```
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 655147076a4..dc61867b418 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -35788,6 +35788,26 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,
}
}
+ // Load a scalar integer constant directly to XMM instead of transferring an
+ // immediate value from GPR.
+ // TODO: Would it be better to load a 128-bit vector constant instead?
+ // vzext_movl (scalar_to_vector C) --> vzext_load &C
+ if (N0.getOpcode() == ISD::SCALAR_TO_VECTOR) {
+ if (auto *C = dyn_cast<ConstantSDNode>(N0.getOperand(0))) {
+ MVT PVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
+ SDValue CP = DAG.getConstantPool(C->getConstantIntValue(), PVT);
+ Align Alignment = cast<ConstantPoolSDNode>(CP)->getAlign();
+ EVT ScalarVT = N0.getOperand(0).getValueType();
+ SDVTList MemTys = DAG.getVTList(VT, MVT::Other);
+ SDValue MemOps[] = {DAG.getEntryNode(), CP};
+ MachinePointerInfo MPI =
+ MachinePointerInfo::getConstantPool(DAG.getMachineFunction());
+ return DAG.getMemIntrinsicNode(X86ISD::VZEXT_LOAD, DL, MemTys, MemOps,
+ ScalarVT, MPI, Alignment,
+ MachineMemOperand::MOLoad);
+ }
+ }
+
return SDValue();
}
case X86ISD::BLENDI: {
```
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80131/new/
https://reviews.llvm.org/D80131
More information about the llvm-commits
mailing list