diff options
author | Tim Northover <tnorthover@apple.com> | 2017-02-06 23:41:27 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2017-02-06 23:41:27 +0000 |
commit | 868332d6bf100a216dae846863daf115009049ac (patch) | |
tree | 4e0e5d065f12d1fd6769e7361660e1d2c9f74a07 /llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | |
parent | 4a9dd70213f5359b5dc5b3772f81a0b1c40ee55b (diff) | |
download | bcm5719-llvm-868332d6bf100a216dae846863daf115009049ac.tar.gz bcm5719-llvm-868332d6bf100a216dae846863daf115009049ac.zip |
GlobalISel: legalize narrow G_SELECTS on AArch64.
Otherwise there aren't any patterns to select them.
llvm-svn: 294261
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 27b6dc755a2..aeb89a41aa9 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -343,6 +343,29 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) { MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_SELECT: { + if (TypeIdx != 0) + return UnableToLegalize; + + // 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 Src1Ext = MRI.createGenericVirtualRegister(WideTy); + unsigned Src2Ext = MRI.createGenericVirtualRegister(WideTy); + MIRBuilder.buildAnyExt(Src1Ext, MI.getOperand(2).getReg()); + MIRBuilder.buildAnyExt(Src2Ext, MI.getOperand(3).getReg()); + + unsigned DstExt = MRI.createGenericVirtualRegister(WideTy); + MIRBuilder.buildInstr(TargetOpcode::G_SELECT) + .addDef(DstExt) + .addReg(MI.getOperand(1).getReg()) + .addUse(Src1Ext) + .addUse(Src2Ext); + + MIRBuilder.buildTrunc(MI.getOperand(0).getReg(), DstExt); + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_FPTOSI: case TargetOpcode::G_FPTOUI: { if (TypeIdx != 0) |