[RegisterBankInfo] Strengthen getInstrMappingImpl.
authorQuentin Colombet <qcolombet@apple.com>
Thu, 7 Apr 2016 22:52:49 +0000 (22:52 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Thu, 7 Apr 2016 22:52:49 +0000 (22:52 +0000)
Teach the target independent code how to take advantage of type
information to get the mapping of an instruction.

llvm-svn: 265739

llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp

index f1d997e..e63f561 100644 (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;
-
-        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;
+        // 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();
+
+          // 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");
 }