summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-17 20:22:38 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-17 20:22:38 +0000
commit914a59cad825f322ef10273327e708fe5eb78283 (patch)
tree3878f684cc227582940e418b011b91d36c98c347 /llvm/lib/CodeGen
parenta0858e2f20c84df1be9d0add9b726996bbe395a4 (diff)
downloadbcm5719-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.cpp27
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;
}
OpenPOWER on IntegriCloud