@@ -174,6 +174,7 @@ class SROA {
174
174
DomTreeUpdater *const DTU;
175
175
AssumptionCache *const AC;
176
176
const bool PreserveCFG;
177
+ const bool DecomposeStructs;
177
178
178
179
// / Worklist of alloca instructions to simplify.
179
180
// /
@@ -236,9 +237,10 @@ class SROA {
236
237
237
238
public:
238
239
SROA (LLVMContext *C, DomTreeUpdater *DTU, AssumptionCache *AC,
239
- SROAOptions PreserveCFG_ )
240
+ const SROAOptions &Options )
240
241
: C(C), DTU(DTU), AC(AC),
241
- PreserveCFG (PreserveCFG_ == SROAOptions::PreserveCFG) {}
242
+ PreserveCFG (Options.PCFGOption == SROAOptions::PreserveCFG),
243
+ DecomposeStructs(Options.DSOption == SROAOptions::DecomposeStructs) {}
242
244
243
245
// / Main run method used by both the SROAPass and by the legacy pass.
244
246
std::pair<bool /* Changed*/ , bool /* CFGChanged*/ > runSROA (Function &F);
@@ -6040,7 +6042,7 @@ PreservedAnalyses SROAPass::run(Function &F, FunctionAnalysisManager &AM) {
6040
6042
AssumptionCache &AC = AM.getResult <AssumptionAnalysis>(F);
6041
6043
DomTreeUpdater DTU (DT, DomTreeUpdater::UpdateStrategy::Lazy);
6042
6044
auto [Changed, CFGChanged] =
6043
- SROA (&F.getContext (), &DTU, &AC, PreserveCFG ).runSROA (F);
6045
+ SROA (&F.getContext (), &DTU, &AC, Options ).runSROA (F);
6044
6046
if (!Changed)
6045
6047
return PreservedAnalyses::all ();
6046
6048
PreservedAnalyses PA;
@@ -6054,23 +6056,29 @@ void SROAPass::printPipeline(
6054
6056
raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
6055
6057
static_cast <PassInfoMixin<SROAPass> *>(this )->printPipeline (
6056
6058
OS, MapClassName2PassName);
6057
- OS << (PreserveCFG == SROAOptions::PreserveCFG ? " <preserve-cfg>"
6058
- : " <modify-cfg>" );
6059
+ OS << (Options.PCFGOption == SROAOptions::PreserveCFG
6060
+ ? " <preserve-cfg>"
6061
+ : " <modify-cfg>" );
6059
6062
}
6060
6063
6061
- SROAPass::SROAPass (SROAOptions PreserveCFG) : PreserveCFG(PreserveCFG) {}
6064
+ SROAPass::SROAPass (SROAOptions::PreserveCFGOption PreserveCFG)
6065
+ : Options({PreserveCFG, SROAOptions::NoDecomposeStructs}) {}
6066
+ SROAPass::SROAPass (const SROAOptions &Options) : Options(Options) {}
6062
6067
6063
6068
namespace {
6064
6069
6065
6070
// / A legacy pass for the legacy pass manager that wraps the \c SROA pass.
6066
6071
class SROALegacyPass : public FunctionPass {
6067
- SROAOptions PreserveCFG ;
6072
+ SROAOptions Options ;
6068
6073
6069
6074
public:
6070
6075
static char ID;
6071
6076
6072
- SROALegacyPass (SROAOptions PreserveCFG = SROAOptions::PreserveCFG)
6073
- : FunctionPass(ID), PreserveCFG(PreserveCFG) {
6077
+ SROALegacyPass (
6078
+ const SROAOptions &Options =
6079
+ {SROAOptions::PreserveCFGOption::PreserveCFG,
6080
+ SROAOptions::DecomposeStructsOption::NoDecomposeStructs})
6081
+ : FunctionPass(ID), Options(Options) {
6074
6082
initializeSROALegacyPassPass (*PassRegistry::getPassRegistry ());
6075
6083
}
6076
6084
@@ -6083,7 +6091,7 @@ class SROALegacyPass : public FunctionPass {
6083
6091
getAnalysis<AssumptionCacheTracker>().getAssumptionCache (F);
6084
6092
DomTreeUpdater DTU (DT, DomTreeUpdater::UpdateStrategy::Lazy);
6085
6093
auto [Changed, _] =
6086
- SROA (&F.getContext (), &DTU, &AC, PreserveCFG ).runSROA (F);
6094
+ SROA (&F.getContext (), &DTU, &AC, Options ).runSROA (F);
6087
6095
return Changed;
6088
6096
}
6089
6097
@@ -6101,9 +6109,11 @@ class SROALegacyPass : public FunctionPass {
6101
6109
6102
6110
char SROALegacyPass::ID = 0 ;
6103
6111
6104
- FunctionPass *llvm::createSROAPass (bool PreserveCFG) {
6105
- return new SROALegacyPass (PreserveCFG ? SROAOptions::PreserveCFG
6106
- : SROAOptions::ModifyCFG);
6112
+ FunctionPass *llvm::createSROAPass (bool PreserveCFG, bool DecomposeStructs) {
6113
+ return new SROALegacyPass (
6114
+ {PreserveCFG ? SROAOptions::PreserveCFG : SROAOptions::ModifyCFG,
6115
+ DecomposeStructs ? SROAOptions::DecomposeStructs
6116
+ : SROAOptions::NoDecomposeStructs});
6107
6117
}
6108
6118
6109
6119
INITIALIZE_PASS_BEGIN (SROALegacyPass, " sroa" ,
0 commit comments