diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 552a89f76ca2..83c00e24d14f 100644 --- a/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -68,6 +68,13 @@ EnableRescheduling("twoaddr-reschedule",                     cl::desc("Coalesce copies by rescheduling (default=true)"),                     cl::init(true), cl::Hidden); +// Limit the number of dataflow edges to traverse when evaluating the benefit +// of commuting operands. +static cl::opt<unsigned> MaxDataFlowEdge( +    "dataflow-edge-limit", cl::Hidden, cl::init(3), +    cl::desc("Maximum number of dataflow edges to traverse when evaluating " +             "the benefit of commuting operands")); +  namespace {  class TwoAddressInstructionPass : public MachineFunctionPass {    MachineFunction *MF; @@ -637,10 +644,10 @@ isProfitableToCommute(unsigned regA, unsigned regB, unsigned regC,    // To more generally minimize register copies, ideally the logic of two addr    // instruction pass should be integrated with register allocation pass where    // interference graph is available. -  if (isRevCopyChain(regC, regA, 3)) +  if (isRevCopyChain(regC, regA, MaxDataFlowEdge))      return true; -  if (isRevCopyChain(regB, regA, 3)) +  if (isRevCopyChain(regB, regA, MaxDataFlowEdge))      return false;    // Since there are no intervening uses for both registers, then commute  | 
