summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
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