1 //===------ DeLICM.h --------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Undo the effect of Loop Invariant Code Motion (LICM) and 10 // GVN Partial Redundancy Elimination (PRE) on SCoP-level. 11 // 12 // Namely, remove register/scalar dependencies by mapping them back to array 13 // elements. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef POLLY_DELICM_H 18 #define POLLY_DELICM_H 19 20 #include "polly/ScopPass.h" 21 #include "isl/isl-noexceptions.h" 22 23 namespace llvm { 24 class PassRegistry; 25 class Pass; 26 class raw_ostream; 27 } // namespace llvm 28 29 namespace polly { 30 /// Create a new DeLICM pass instance. 31 llvm::Pass *createDeLICMWrapperPass(); 32 llvm::Pass *createDeLICMPrinterLegacyPass(llvm::raw_ostream &OS); 33 34 struct DeLICMPass final : llvm::PassInfoMixin<DeLICMPass> { DeLICMPassfinal35 DeLICMPass() {} 36 37 llvm::PreservedAnalyses run(Scop &S, ScopAnalysisManager &SAM, 38 ScopStandardAnalysisResults &SAR, SPMUpdater &U); 39 }; 40 41 struct DeLICMPrinterPass final : llvm::PassInfoMixin<DeLICMPrinterPass> { DeLICMPrinterPassfinal42 DeLICMPrinterPass(raw_ostream &OS) : OS(OS) {} 43 44 PreservedAnalyses run(Scop &S, ScopAnalysisManager &, 45 ScopStandardAnalysisResults &SAR, SPMUpdater &); 46 47 private: 48 llvm::raw_ostream &OS; 49 }; 50 51 /// Determine whether two lifetimes are conflicting. 52 /// 53 /// Used by unittesting. 54 bool isConflicting(isl::union_set ExistingOccupied, 55 isl::union_set ExistingUnused, isl::union_map ExistingKnown, 56 isl::union_map ExistingWrites, 57 isl::union_set ProposedOccupied, 58 isl::union_set ProposedUnused, isl::union_map ProposedKnown, 59 isl::union_map ProposedWrites, 60 llvm::raw_ostream *OS = nullptr, unsigned Indent = 0); 61 62 } // namespace polly 63 64 namespace llvm { 65 void initializeDeLICMWrapperPassPass(llvm::PassRegistry &); 66 void initializeDeLICMPrinterLegacyPassPass(llvm::PassRegistry &); 67 } // namespace llvm 68 69 #endif /* POLLY_DELICM_H */ 70