diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-18 22:39:27 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-18 22:39:27 +0000 |
| commit | fbe92a53d073bf03c47870a11589868424863ca0 (patch) | |
| tree | 4851b9c680707c6d43f73a36f04b3bf0316f731d /llvm/lib/CodeGen | |
| parent | e84bdce60998f2d0236317e9b44b98865d337d86 (diff) | |
| download | bcm5719-llvm-fbe92a53d073bf03c47870a11589868424863ca0.tar.gz bcm5719-llvm-fbe92a53d073bf03c47870a11589868424863ca0.zip | |
GlobalISel: Implement widenScalar for g_extract scalar results
llvm-svn: 354293
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index e8b5b8cd3b5..38f0e221431 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -846,20 +846,62 @@ LegalizerHelper::widenScalarUnmergeValues(MachineInstr &MI, unsigned TypeIdx, LegalizerHelper::LegalizeResult LegalizerHelper::widenScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) { - if (TypeIdx != 1) - return UnableToLegalize; - + unsigned DstReg = MI.getOperand(0).getReg(); unsigned SrcReg = MI.getOperand(1).getReg(); LLT SrcTy = MRI.getType(SrcReg); + + LLT DstTy = MRI.getType(DstReg); + unsigned Offset = MI.getOperand(2).getImm(); + + if (TypeIdx == 0) { + if (SrcTy.isVector() || DstTy.isVector()) + return UnableToLegalize; + + SrcOp Src(SrcReg); + if (SrcTy.isPointer()) { + // Extracts from pointers can be handled only if they are really just + // simple integers. + const DataLayout &DL = MIRBuilder.getDataLayout(); + if (DL.isNonIntegralAddressSpace(SrcTy.getAddressSpace())) + return UnableToLegalize; + + LLT SrcAsIntTy = LLT::scalar(SrcTy.getSizeInBits()); + Src = MIRBuilder.buildPtrToInt(SrcAsIntTy, Src); + SrcTy = SrcAsIntTy; + } + + if (DstTy.isPointer()) + return UnableToLegalize; + + if (Offset == 0) { + // Avoid a shift in the degenerate case. + MIRBuilder.buildTrunc(DstReg, + MIRBuilder.buildAnyExtOrTrunc(WideTy, Src)); + MI.eraseFromParent(); + return Legalized; + } + + // Do a shift in the source type. + LLT ShiftTy = SrcTy; + if (WideTy.getSizeInBits() > SrcTy.getSizeInBits()) { + Src = MIRBuilder.buildAnyExt(WideTy, Src); + ShiftTy = WideTy; + } else if (WideTy.getSizeInBits() > SrcTy.getSizeInBits()) + return UnableToLegalize; + + auto LShr = MIRBuilder.buildLShr( + ShiftTy, Src, MIRBuilder.buildConstant(ShiftTy, Offset)); + MIRBuilder.buildTrunc(DstReg, LShr); + MI.eraseFromParent(); + return Legalized; + } + if (!SrcTy.isVector()) return UnableToLegalize; - unsigned DstReg = MI.getOperand(0).getReg(); - LLT DstTy = MRI.getType(DstReg); if (DstTy != SrcTy.getElementType()) return UnableToLegalize; - unsigned Offset = MI.getOperand(2).getImm(); if (Offset % SrcTy.getScalarSizeInBits() != 0) return UnableToLegalize; |

