diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 52110a1206c..d2501d81dd2 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -37,6 +37,7 @@ #define DEBUG_TYPE "dagcombine" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/SelectionDAG.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetLowering.h" #include @@ -76,8 +77,8 @@ namespace { // Visitation implementation - Implement dag node combining for different // node types. The semantics are as follows: // Return Value: - // null - No change was made - // otherwise - Node N should be replaced by the returned node. + // SDOperand.Val == 0 - No change was made + // otherwise - N should be replaced by the returned Operand. // SDOperand visitTokenFactor(SDNode *N); SDOperand visitADD(SDNode *N); @@ -266,9 +267,9 @@ void DAGCombiner::Run(bool RunningAfterLegalize) { // CombineTo was used. Since CombineTo takes care of the worklist // mechanics for us, we have no work to do in this case. if (RV.Val != N) { - std::cerr << "\nReplacing "; N->dump(); - std::cerr << "\nWith: "; RV.Val->dump(); - std::cerr << '\n'; + DEBUG(std::cerr << "\nReplacing "; N->dump(); + std::cerr << "\nWith: "; RV.Val->dump(); + std::cerr << '\n'); DAG.ReplaceAllUsesWith(SDOperand(N, 0), RV); // Push the new node and any users onto the worklist diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index ecf9797b484..26421c148f8 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -36,6 +36,18 @@ #include using namespace llvm; +// Temporary command line code to enable use of the dag combiner as a beta +// option. +namespace llvm { + bool CombinerEnabled; +} +namespace { + cl::opt + CombineDAG("enable-dag-combiner", cl::Hidden, + cl::desc("Run the DAG combiner before and after Legalize"), + cl::location(CombinerEnabled), + cl::init(false)); +} #ifndef NDEBUG static cl::opt ViewDAGs("view-isel-dags", cl::Hidden, @@ -44,6 +56,7 @@ ViewDAGs("view-isel-dags", cl::Hidden, static const bool ViewDAGs = 0; #endif + namespace llvm { //===--------------------------------------------------------------------===// /// FunctionLoweringInfo - This contains information that is global to a @@ -1234,6 +1247,9 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF, // types that are not supported by the target. BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo); + // Run the DAG combiner in pre-legalize mode, if we are told to do so + if (CombinerEnabled) DAG.Combine(false); + DEBUG(std::cerr << "Lowered selection DAG:\n"); DEBUG(DAG.dump()); @@ -1246,6 +1262,9 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF, if (ViewDAGs) DAG.viewGraph(); + // Run the DAG combiner in post-legalize mode, if we are told to do so + if (CombinerEnabled) DAG.Combine(true); + // Third, instruction select all of the operations to machine code, adding the // code to the MachineBasicBlock. InstructionSelectBasicBlock(DAG);