1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

[RegisterBankInfo] Strengthen getInstrMappingImpl.

Teach the target independent code how to take advantage of type
information to get the mapping of an instruction.

llvm-svn: 265739
This commit is contained in:
Quentin Colombet 2016-04-07 22:52:49 +00:00
parent d0a8a26f78
commit 549a7ee32a

View File

@ -18,6 +18,7 @@
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetInstrInfo.h"
@ -255,18 +256,26 @@ RegisterBankInfo::getInstrMappingImpl(const MachineInstr &MI) const {
// the register bank from the encoding constraints.
CurRegBank = getRegBankFromConstraints(MI, OpIdx, TII, TRI);
if (!CurRegBank) {
// All our attempts failed, give up.
CompleteMapping = false;
// Check if we can deduce the register bank from the type of
// the instruction.
Type *MITy = MI.getType();
if (MITy)
CurRegBank = getRegBankForType(
MVT::getVT(MITy, /*HandleUnknown*/ true).SimpleTy);
if (!CurRegBank) {
// All our attempts failed, give up.
CompleteMapping = false;
if (!isCopyLike)
// MI does not carry enough information to guess the mapping.
return InstructionMapping();
if (!isCopyLike)
// MI does not carry enough information to guess the mapping.
return InstructionMapping();
// For copies, we want to keep interating to find a register
// bank for the other operands if we did not find one yet.
if (RegBank)
break;
continue;
// For copies, we want to keep interating to find a register
// bank for the other operands if we did not find one yet.
if (RegBank)
break;
continue;
}
}
}
RegBank = CurRegBank;
@ -298,11 +307,9 @@ RegisterBankInfo::getInstrMappingImpl(const MachineInstr &MI) const {
RegisterBankInfo::InstructionMapping
RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
if (!isPreISelGenericOpcode(MI.getOpcode())) {
RegisterBankInfo::InstructionMapping Mapping = getInstrMappingImpl(MI);
if (Mapping.isValid())
return Mapping;
}
llvm_unreachable("The target must implement this");
}