diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-14 14:18:56 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-14 14:18:56 +0000 |
commit | 133716929cdd993a587d8f9d610c87678480bb43 (patch) | |
tree | 5b103d03a8ea14d96b53f0ffe43664fe9b77f166 /llvm/lib/CodeGen | |
parent | 9f96f1f17aa9c3db76ca419a60f913015a679bf2 (diff) | |
download | bcm5719-llvm-133716929cdd993a587d8f9d610c87678480bb43.tar.gz bcm5719-llvm-133716929cdd993a587d8f9d610c87678480bb43.zip |
GlobalISel: Use multiple returns for intrinsic structs
This is consistent with what SelectionDAG does and is much easier to
work with than the extract sequence with an artificial wide register.
For the AMDGPU control flow intrinsics, this was producing an s128 for
the i64, i1 tuple return. Any legalization that should apply to a real
s128 value would badly obscure the direct values that need to be seen.
llvm-svn: 356147
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 6 |
2 files changed, 9 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 7db54079af1..8528636a67d 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1138,8 +1138,8 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(F)); } - bool IsSplitType = valueIsSplit(CI); if (!F || !F->isIntrinsic() || ID == Intrinsic::not_intrinsic) { + bool IsSplitType = valueIsSplit(CI); unsigned Res = IsSplitType ? MRI->createGenericVirtualRegister( getLLTForType(*CI.getType(), *DL)) : getOrCreateVReg(CI); @@ -1163,16 +1163,12 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { if (translateKnownIntrinsic(CI, ID, MIRBuilder)) return true; - unsigned Res = 0; - if (!CI.getType()->isVoidTy()) { - if (IsSplitType) - Res = - MRI->createGenericVirtualRegister(getLLTForType(*CI.getType(), *DL)); - else - Res = getOrCreateVReg(CI); - } + ArrayRef<unsigned> ResultRegs; + if (!CI.getType()->isVoidTy()) + ResultRegs = getOrCreateVRegs(CI); + MachineInstrBuilder MIB = - MIRBuilder.buildIntrinsic(ID, Res, !CI.doesNotAccessMemory()); + MIRBuilder.buildIntrinsic(ID, ResultRegs, !CI.doesNotAccessMemory()); for (auto &Arg : CI.arg_operands()) { // Some intrinsics take metadata parameters. Reject them. @@ -1181,9 +1177,6 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { MIB.addUse(packRegs(*Arg, MIRBuilder)); } - if (IsSplitType) - unpackRegs(CI, Res, MIRBuilder); - // Add a MachineMemOperand if it is a target mem intrinsic. const TargetLowering &TLI = *MF->getSubtarget().getTargetLowering(); TargetLowering::IntrinsicInfo Info; diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 30fe2b01af4..81d26e6addb 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -609,13 +609,13 @@ MachineInstrBuilder MachineIRBuilder::buildInsert(unsigned Res, unsigned Src, } MachineInstrBuilder MachineIRBuilder::buildIntrinsic(Intrinsic::ID ID, - unsigned Res, + ArrayRef<unsigned> ResultRegs, bool HasSideEffects) { auto MIB = buildInstr(HasSideEffects ? TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS : TargetOpcode::G_INTRINSIC); - if (Res) - MIB.addDef(Res); + for (unsigned ResultReg : ResultRegs) + MIB.addDef(ResultReg); MIB.addIntrinsicID(ID); return MIB; } |