Changes in directory llvm/lib/Target/X86:
X86InstrInfo.h updated: 1.65 -> 1.66 X86InstrInfo.cpp updated: 1.90 -> 1.91 --- Log message: Do not treat FP_REG_KILL as terminator in branch analysis (X86). --- Diffs of the changes: (+11 -4) X86InstrInfo.cpp | 14 ++++++++++---- X86InstrInfo.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.h diff -u llvm/lib/Target/X86/X86InstrInfo.h:1.65 llvm/lib/Target/X86/X86InstrInfo.h:1.66 --- llvm/lib/Target/X86/X86InstrInfo.h:1.65 Thu Jun 14 15:50:44 2007 +++ llvm/lib/Target/X86/X86InstrInfo.h Thu Jun 14 17:03:45 2007 @@ -261,6 +261,7 @@ 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; Index: llvm/lib/Target/X86/X86InstrInfo.cpp diff -u llvm/lib/Target/X86/X86InstrInfo.cpp:1.90 llvm/lib/Target/X86/X86InstrInfo.cpp:1.91 --- llvm/lib/Target/X86/X86InstrInfo.cpp:1.90 Thu Jun 14 15:50:44 2007 +++ llvm/lib/Target/X86/X86InstrInfo.cpp Thu Jun 14 17:03:45 2007 @@ -398,13 +398,20 @@ } } +// 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 @@ 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. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits