diff options
| author | Craig Topper <craig.topper@intel.com> | 2020-01-14 10:18:32 -0800 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2020-01-14 10:50:39 -0800 |
| commit | 98c54fb1feba081c509f7e389877550df130a80d (patch) | |
| tree | 81442673068eca4289e77f82151f63628af5599a /llvm/lib/Target/X86 | |
| parent | f7e9f4f4c50245d10ca9869a9f8f3d431dfb6948 (diff) | |
| download | bcm5719-llvm-98c54fb1feba081c509f7e389877550df130a80d.tar.gz bcm5719-llvm-98c54fb1feba081c509f7e389877550df130a80d.zip | |
[X86] Directly emit a BROADCAST_LOAD from constant pool in lowerUINT_TO_FP_vXi32 to avoid double loads seen in D71971
By directly emitting the constants as a constant pool load we seem to avoid the build_vector/extract_subvector combines that resulted in the duplicate loads we had before.
Differential Revision: https://reviews.llvm.org/D72307
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 2cb8fce20fe..2bf6c3e51c9 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -19158,8 +19158,18 @@ static SDValue lowerUINT_TO_FP_vXi32(SDValue Op, SelectionDAG &DAG, if (Subtarget.hasAVX() && VecIntVT == MVT::v4i32 && Op->getSimpleValueType(0) == MVT::v4f64) { SDValue ZExtIn = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::v4i64, V); - SDValue VBias = - DAG.getConstantFP(BitsToDouble(0x4330000000000000ULL), DL, MVT::v4f64); + Constant *Bias = ConstantFP::get( + *DAG.getContext(), + APFloat(APFloat::IEEEdouble(), APInt(64, 0x4330000000000000ULL))); + auto PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()); + SDValue CPIdx = DAG.getConstantPool(Bias, PtrVT, /*Alignment*/ 8); + SDVTList Tys = DAG.getVTList(MVT::v4f64, MVT::Other); + SDValue Ops[] = {DAG.getEntryNode(), CPIdx}; + SDValue VBias = DAG.getMemIntrinsicNode( + X86ISD::VBROADCAST_LOAD, DL, Tys, Ops, MVT::f64, + MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), + /*Alignment*/ 8, MachineMemOperand::MOLoad); + SDValue Or = DAG.getNode(ISD::OR, DL, MVT::v4i64, ZExtIn, DAG.getBitcast(MVT::v4i64, VBias)); Or = DAG.getBitcast(MVT::v4f64, Or); |

