diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.h | 1 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index f06827522c3..c8621ad1b73 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -398,13 +398,20 @@ X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {    }  } +// For purposes of branch analysis do not count FP_REG_KILL as a terminator. +bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const { +  const TargetInstrDescriptor *TID = MI->getInstrDescriptor(); +  if (MI->getOpcode() == X86::FP_REG_KILL) +    return false; +  if (TID->Flags & M_TERMINATOR_FLAG) +    return !isPredicated(MI); +  return false; +}  bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,                                    MachineBasicBlock *&TBB,                                   MachineBasicBlock *&FBB,                                   std::vector<MachineOperand> &Cond) const { -  // TODO: If FP_REG_KILL is around, ignore it. -                                       // If the block has no terminators, it just falls into the block after it.    MachineBasicBlock::iterator I = MBB.end();    if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) @@ -439,8 +446,7 @@ bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,    MachineInstr *SecondLastInst = I;    // If there are three terminators, we don't know what sort of block this is. -  if (SecondLastInst && I != MBB.begin() && -      isTerminatorInstr((--I)->getOpcode())) +  if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(--I))      return true;    // If the block ends with X86::JMP and a conditional branch, handle it. diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h index 3d3952a6ee3..75cce47401d 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.h +++ b/llvm/lib/Target/X86/X86InstrInfo.h @@ -261,6 +261,7 @@ public:    virtual MachineInstr *commuteInstruction(MachineInstr *MI) const;    // Branch analysis. +  virtual bool isUnpredicatedTerminator(const MachineInstr* MI) const;    virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,                               MachineBasicBlock *&FBB,                               std::vector<MachineOperand> &Cond) const;  | 

