1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
2021-09-27 14:02:44 -04:00

44 lines
1.4 KiB
C++

#include "folding.h"
#include "const_fold.h"
#include "const_prop.h"
namespace seq {
namespace ir {
namespace transform {
namespace folding {
const std::string FoldingPassGroup::KEY = "core-folding-pass-group";
FoldingPassGroup::FoldingPassGroup(const std::string &sideEffectsPass,
const std::string &reachingDefPass,
const std::string &globalVarPass,
bool runGlobalDemotion) {
auto gdUnique = std::make_unique<cleanup::GlobalDemotionPass>();
auto canonUnique = std::make_unique<cleanup::CanonicalizationPass>(sideEffectsPass);
auto fpUnique = std::make_unique<FoldingPass>();
auto dceUnique = std::make_unique<cleanup::DeadCodeCleanupPass>(sideEffectsPass);
gd = gdUnique.get();
canon = canonUnique.get();
fp = fpUnique.get();
dce = dceUnique.get();
if (runGlobalDemotion)
push_back(std::move(gdUnique));
push_back(std::make_unique<ConstPropPass>(reachingDefPass, globalVarPass));
push_back(std::move(canonUnique));
push_back(std::move(fpUnique));
push_back(std::move(dceUnique));
}
bool FoldingPassGroup::shouldRepeat() const {
return gd->getNumDemotions() != 0 || canon->getNumReplacements() != 0 ||
fp->getNumReplacements() != 0 || dce->getNumReplacements() != 0;
}
} // namespace folding
} // namespace transform
} // namespace ir
} // namespace seq