diff options
| author | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2017-11-15 23:45:04 +0000 |
|---|---|---|
| committer | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2017-11-15 23:45:04 +0000 |
| commit | 954eea074b3dd1ea73609fafddf7d81e3468b695 (patch) | |
| tree | b3c852f07749afb92bafa67f618b6296a85adb0e | |
| parent | 7fb4d3d16e5f21c8a50a87d9a8f31da36fcdfa91 (diff) | |
| download | bcm5719-llvm-954eea074b3dd1ea73609fafddf7d81e3468b695.tar.gz bcm5719-llvm-954eea074b3dd1ea73609fafddf7d81e3468b695.zip | |
[GISel][NFC]: Move getOpcodeDef from the LegalizationArtifactCombiner into GlobalISel/Utils for use elsewhere
llvm-svn: 318350
| -rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h | 31 | ||||
| -rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/Utils.h | 6 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/Utils.cpp | 16 |
3 files changed, 29 insertions, 24 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h index 7e897649df2..bc982bba2d7 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h @@ -36,8 +36,8 @@ public: SmallVectorImpl<MachineInstr *> &DeadInsts) { if (MI.getOpcode() != TargetOpcode::G_ANYEXT) return false; - if (MachineInstr *DefMI = - getOpcodeDef(TargetOpcode::G_TRUNC, MI.getOperand(1).getReg())) { + if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_TRUNC, + MI.getOperand(1).getReg(), MRI)) { DEBUG(dbgs() << ".. Combine MI: " << MI;); unsigned DstReg = MI.getOperand(0).getReg(); unsigned SrcReg = DefMI->getOperand(1).getReg(); @@ -55,8 +55,8 @@ public: if (MI.getOpcode() != TargetOpcode::G_ZEXT) return false; - if (MachineInstr *DefMI = - getOpcodeDef(TargetOpcode::G_TRUNC, MI.getOperand(1).getReg())) { + if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_TRUNC, + MI.getOperand(1).getReg(), MRI)) { unsigned DstReg = MI.getOperand(0).getReg(); LLT DstTy = MRI.getType(DstReg); if (isInstUnsupported(TargetOpcode::G_AND, DstTy) || @@ -83,8 +83,8 @@ public: if (MI.getOpcode() != TargetOpcode::G_SEXT) return false; - if (MachineInstr *DefMI = - getOpcodeDef(TargetOpcode::G_TRUNC, MI.getOperand(1).getReg())) { + if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_TRUNC, + MI.getOperand(1).getReg(), MRI)) { unsigned DstReg = MI.getOperand(0).getReg(); LLT DstTy = MRI.getType(DstReg); if (isInstUnsupported(TargetOpcode::G_SHL, DstTy) || @@ -118,7 +118,7 @@ public: return false; if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, - MI.getOperand(1).getReg())) { + MI.getOperand(1).getReg(), MRI)) { unsigned DstReg = MI.getOperand(0).getReg(); LLT DstTy = MRI.getType(DstReg); if (isInstUnsupported(TargetOpcode::G_IMPLICIT_DEF, DstTy)) @@ -248,23 +248,6 @@ private: return Action.first == LegalizerInfo::LegalizeAction::Unsupported || Action.first == LegalizerInfo::LegalizeAction::NotFound; } - /// See if Reg is defined by an single def instruction that is - /// Opcode. Also try to do trivial folding if it's a COPY with - /// same types. Returns null otherwise. - MachineInstr *getOpcodeDef(unsigned Opcode, unsigned Reg) { - auto *DefMI = MRI.getVRegDef(Reg); - auto DstTy = MRI.getType(DefMI->getOperand(0).getReg()); - if (!DstTy.isValid()) - return nullptr; - while (DefMI->getOpcode() == TargetOpcode::COPY) { - unsigned SrcReg = DefMI->getOperand(1).getReg(); - auto SrcTy = MRI.getType(SrcReg); - if (!SrcTy.isValid() || SrcTy != DstTy) - break; - DefMI = MRI.getVRegDef(SrcReg); - } - return DefMI->getOpcode() == Opcode ? DefMI : nullptr; - } }; } // namespace llvm diff --git a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h index 50ddbeb9432..5864c15cc8e 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h @@ -79,5 +79,11 @@ Optional<int64_t> getConstantVRegVal(unsigned VReg, const ConstantFP* getConstantFPVRegVal(unsigned VReg, const MachineRegisterInfo &MRI); +/// See if Reg is defined by an single def instruction that is +/// Opcode. Also try to do trivial folding if it's a COPY with +/// same types. Returns null otherwise. +MachineInstr *getOpcodeDef(unsigned Opcode, unsigned Reg, + const MachineRegisterInfo &MRI); + } // End namespace llvm. #endif diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp index 9ae0f970f42..5f3b6a2a22c 100644 --- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp +++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp @@ -129,3 +129,19 @@ const llvm::ConstantFP* llvm::getConstantFPVRegVal(unsigned VReg, return nullptr; return MI->getOperand(1).getFPImm(); } + +llvm::MachineInstr *llvm::getOpcodeDef(unsigned Opcode, unsigned Reg, + const MachineRegisterInfo &MRI) { + auto *DefMI = MRI.getVRegDef(Reg); + auto DstTy = MRI.getType(DefMI->getOperand(0).getReg()); + if (!DstTy.isValid()) + return nullptr; + while (DefMI->getOpcode() == TargetOpcode::COPY) { + unsigned SrcReg = DefMI->getOperand(1).getReg(); + auto SrcTy = MRI.getType(SrcReg); + if (!SrcTy.isValid() || SrcTy != DstTy) + break; + DefMI = MRI.getVRegDef(SrcReg); + } + return DefMI->getOpcode() == Opcode ? DefMI : nullptr; +} |

