Skip to content

Commit

Permalink
[SelectionDAG] Add the option of disabling generic combines.
Browse files Browse the repository at this point in the history
Summary:
For some targets generic combines don't really do much and they
consume a disproportionate amount of time.
There's not really a mechanism in SDISel to tactically disable
combines, but we can have a switch to disable all of them and
let the targets just implement what they specifically need.

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D79112
  • Loading branch information
Kariddi committed May 21, 2020
1 parent 0c14843 commit dbaed58
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
5 changes: 5 additions & 0 deletions llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
Expand Up @@ -160,6 +160,11 @@ class SelectionDAGTargetInfo {
virtual bool generateFMAsInMachineCombiner(CodeGenOpt::Level OptLevel) const {
return false;
}

// Return true if the DAG Combiner should disable generic combines.
virtual bool disableGenericCombines(CodeGenOpt::Level OptLevel) const {
return false;
}
};

} // end namespace llvm
Expand Down
14 changes: 9 additions & 5 deletions llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Expand Up @@ -130,12 +130,14 @@ namespace {
class DAGCombiner {
SelectionDAG &DAG;
const TargetLowering &TLI;
const SelectionDAGTargetInfo *STI;
CombineLevel Level;
CodeGenOpt::Level OptLevel;
bool LegalDAG = false;
bool LegalOperations = false;
bool LegalTypes = false;
bool ForCodeSize;
bool DisableGenericCombines;

/// Worklist of all of the nodes that need to be simplified.
///
Expand Down Expand Up @@ -223,9 +225,11 @@ namespace {

public:
DAGCombiner(SelectionDAG &D, AliasAnalysis *AA, CodeGenOpt::Level OL)
: DAG(D), TLI(D.getTargetLoweringInfo()), Level(BeforeLegalizeTypes),
OptLevel(OL), AA(AA) {
: DAG(D), TLI(D.getTargetLoweringInfo()),
STI(D.getSubtarget().getSelectionDAGInfo()),
Level(BeforeLegalizeTypes), OptLevel(OL), AA(AA) {
ForCodeSize = DAG.shouldOptForSize();
DisableGenericCombines = STI && STI->disableGenericCombines(OptLevel);

MaximumLegalStoreInBits = 0;
// We use the minimum store size here, since that's all we can guarantee
Expand Down Expand Up @@ -1648,7 +1652,9 @@ SDValue DAGCombiner::visit(SDNode *N) {
}

SDValue DAGCombiner::combine(SDNode *N) {
SDValue RV = visit(N);
SDValue RV;
if (!DisableGenericCombines)
RV = visit(N);

// If nothing happened, try a target-specific DAG combine.
if (!RV.getNode()) {
Expand Down Expand Up @@ -11790,7 +11796,6 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
if (!AllowFusionGlobally && !isContractable(N))
return SDValue();

const SelectionDAGTargetInfo *STI = DAG.getSubtarget().getSelectionDAGInfo();
if (STI && STI->generateFMAsInMachineCombiner(OptLevel))
return SDValue();

Expand Down Expand Up @@ -12008,7 +12013,6 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {
if (!AllowFusionGlobally && !isContractable(N))
return SDValue();

const SelectionDAGTargetInfo *STI = DAG.getSubtarget().getSelectionDAGInfo();
if (STI && STI->generateFMAsInMachineCombiner(OptLevel))
return SDValue();

Expand Down

0 comments on commit dbaed58

Please sign in to comment.