summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp10
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp5
2 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
index 29fdee8633f..632d6292f9c 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
@@ -104,6 +104,7 @@ MachineLegalizeHelper::narrowScalar(MachineInstr &MI, LLT NarrowTy) {
MachineLegalizeHelper::LegalizeResult
MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
+ unsigned WideSize = WideTy.getSizeInBits();
switch (MI.getOpcode()) {
default:
return UnableToLegalize;
@@ -116,7 +117,6 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
// Perform operation at larger width (any extension is fine here, high bits
// don't affect the result) and then truncate the result back to the
// original type.
- unsigned WideSize = WideTy.getSizeInBits();
MIRBuilder.setInstr(MI);
@@ -133,6 +133,14 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
MI.eraseFromParent();
return Legalized;
}
+ case TargetOpcode::G_CONSTANT: {
+ MIRBuilder.setInstr(MI);
+ unsigned DstExt = MRI.createGenericVirtualRegister(WideSize);
+ MIRBuilder.buildConstant(WideTy, DstExt, MI.getOperand(1).getImm());
+ MIRBuilder.buildTrunc(MI.getType(), MI.getOperand(0).getReg(), DstExt);
+ MI.eraseFromParent();
+ return Legalized;
+ }
}
}
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
index 881b5026fa6..fa23627de7c 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
@@ -119,8 +119,9 @@ LLT MachineLegalizer::findLegalType(unsigned Opcode, LLT Ty,
[&](LLT Ty) -> LLT { return Ty.halfScalarSize(); });
}
case WidenScalar: {
- return findLegalType(Opcode, Ty,
- [&](LLT Ty) -> LLT { return Ty.doubleScalarSize(); });
+ return findLegalType(Opcode, Ty, [&](LLT Ty) -> LLT {
+ return Ty.getSizeInBits() < 8 ? LLT::scalar(8) : Ty.doubleScalarSize();
+ });
}
case FewerElements: {
return findLegalType(Opcode, Ty,
OpenPOWER on IntegriCloud