forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- PruneUnprofitable.cpp ----------------------------------------------===//
 | |
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // Mark a SCoP as unfeasible if not deemed profitable to optimize.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "polly/PruneUnprofitable.h"
 | |
| #include "polly/ScopDetection.h"
 | |
| #include "polly/ScopInfo.h"
 | |
| #include "polly/ScopPass.h"
 | |
| #include "llvm/ADT/Statistic.h"
 | |
| #include "llvm/IR/DebugLoc.h"
 | |
| #include "llvm/Support/Debug.h"
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| 
 | |
| using namespace llvm;
 | |
| using namespace polly;
 | |
| 
 | |
| #define DEBUG_TYPE "polly-prune-unprofitable"
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| STATISTIC(ScopsProcessed,
 | |
|           "Number of SCoPs considered for unprofitability pruning");
 | |
| STATISTIC(ScopsPruned, "Number of pruned SCoPs because it they cannot be "
 | |
|                        "optimized in a significant way");
 | |
| STATISTIC(ScopsSurvived, "Number of SCoPs after pruning");
 | |
| 
 | |
| STATISTIC(NumPrunedLoops, "Number of pruned loops");
 | |
| STATISTIC(NumPrunedBoxedLoops, "Number of pruned boxed loops");
 | |
| STATISTIC(NumPrunedAffineLoops, "Number of pruned affine loops");
 | |
| 
 | |
| STATISTIC(NumLoopsInScop, "Number of loops in scops after pruning");
 | |
| STATISTIC(NumBoxedLoops, "Number of boxed loops in SCoPs after pruning");
 | |
| STATISTIC(NumAffineLoops, "Number of affine loops in SCoPs after pruning");
 | |
| 
 | |
| class PruneUnprofitable : public ScopPass {
 | |
| private:
 | |
|   void updateStatistics(Scop &S, bool Pruned) {
 | |
|     auto ScopStats = S.getStatistics();
 | |
|     if (Pruned) {
 | |
|       ScopsPruned++;
 | |
|       NumPrunedLoops += ScopStats.NumAffineLoops + ScopStats.NumBoxedLoops;
 | |
|       NumPrunedBoxedLoops += ScopStats.NumBoxedLoops;
 | |
|       NumPrunedAffineLoops += ScopStats.NumAffineLoops;
 | |
|     } else {
 | |
|       ScopsSurvived++;
 | |
|       NumLoopsInScop += ScopStats.NumAffineLoops + ScopStats.NumBoxedLoops;
 | |
|       NumBoxedLoops += ScopStats.NumBoxedLoops;
 | |
|       NumAffineLoops += ScopStats.NumAffineLoops;
 | |
|     }
 | |
|   }
 | |
| 
 | |
| public:
 | |
|   static char ID;
 | |
| 
 | |
|   explicit PruneUnprofitable() : ScopPass(ID) {}
 | |
|   PruneUnprofitable(const PruneUnprofitable &) = delete;
 | |
|   PruneUnprofitable &operator=(const PruneUnprofitable &) = delete;
 | |
| 
 | |
|   void getAnalysisUsage(AnalysisUsage &AU) const override {
 | |
|     AU.addRequired<ScopInfoRegionPass>();
 | |
|     AU.setPreservesAll();
 | |
|   }
 | |
| 
 | |
|   bool runOnScop(Scop &S) override {
 | |
|     if (PollyProcessUnprofitable) {
 | |
|       LLVM_DEBUG(
 | |
|           dbgs() << "NOTE: -polly-process-unprofitable active, won't prune "
 | |
|                     "anything\n");
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     ScopsProcessed++;
 | |
| 
 | |
|     if (!S.isProfitable(true)) {
 | |
|       LLVM_DEBUG(
 | |
|           dbgs() << "SCoP pruned because it probably cannot be optimized in "
 | |
|                     "a significant way\n");
 | |
|       S.invalidate(PROFITABLE, DebugLoc());
 | |
|       updateStatistics(S, true);
 | |
|     } else {
 | |
|       updateStatistics(S, false);
 | |
|     }
 | |
| 
 | |
|     return false;
 | |
|   }
 | |
| };
 | |
| } // namespace
 | |
| 
 | |
| char PruneUnprofitable::ID;
 | |
| 
 | |
| Pass *polly::createPruneUnprofitablePass() { return new PruneUnprofitable(); }
 | |
| 
 | |
| INITIALIZE_PASS_BEGIN(PruneUnprofitable, "polly-prune-unprofitable",
 | |
|                       "Polly - Prune unprofitable SCoPs", false, false)
 | |
| INITIALIZE_PASS_END(PruneUnprofitable, "polly-prune-unprofitable",
 | |
|                     "Polly - Prune unprofitable SCoPs", false, false)
 |