diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-17 20:22:38 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-17 20:22:38 +0000 |
commit | 914a59cad825f322ef10273327e708fe5eb78283 (patch) | |
tree | 3878f684cc227582940e418b011b91d36c98c347 /llvm/lib/CodeGen | |
parent | a0858e2f20c84df1be9d0add9b726996bbe395a4 (diff) | |
download | bcm5719-llvm-914a59cad825f322ef10273327e708fe5eb78283.tar.gz bcm5719-llvm-914a59cad825f322ef10273327e708fe5eb78283.zip |
GlobalISel: Handle more cases for widenScalar of G_MERGE_VALUES
Use an anyext to the requested type for the leftover operand to
produce a slightly wider type, and then truncate the final merge.
I have another implementation almost ready which handles arbitrary
widens, but I think it produces worse code in this example (which I
think is 90% due to not folding redundant copies or folding out
implicit_def users), so I wanted to add this as a baseline first.
llvm-svn: 366366
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 958e9b59cf4..caa49cf2cf7 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -875,10 +875,14 @@ LegalizerHelper::widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx, // Try to turn this into a merge of merges if we can use the requested type as // the source. - - // TODO: Pad with undef if DstTy > WideTy - if (NumMerge > 1 && WideTy.getSizeInBits() % SrcTy.getSizeInBits() == 0) { + if (NumMerge > 1) { int PartsPerMerge = WideTy.getSizeInBits() / SrcTy.getSizeInBits(); + if (WideTy.getSizeInBits() % SrcTy.getSizeInBits() != 0) + return UnableToLegalize; + + int RemainderBits = DstTy.getSizeInBits() % WideTy.getSizeInBits(); + int RemainderParts = RemainderBits / SrcTy.getSizeInBits(); + SmallVector<Register, 4> Parts; SmallVector<Register, 4> SubMerges; @@ -891,7 +895,22 @@ LegalizerHelper::widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx, Parts.clear(); } - MIRBuilder.buildMerge(DstReg, SubMerges); + if (RemainderParts == 0) { + MIRBuilder.buildMerge(DstReg, SubMerges); + MI.eraseFromParent(); + return Legalized; + } + + assert(RemainderParts == 1); + + auto AnyExt = MIRBuilder.buildAnyExt( + WideTy, MI.getOperand(MI.getNumOperands() - 1).getReg()); + SubMerges.push_back(AnyExt.getReg(0)); + + LLT WiderDstTy = LLT::scalar(SubMerges.size() * WideTy.getSizeInBits()); + auto Merge = MIRBuilder.buildMerge(WiderDstTy, SubMerges); + MIRBuilder.buildTrunc(DstReg, Merge); + MI.eraseFromParent(); return Legalized; } |