Skip to content

Commit 54be865

Browse files
committed
Add decompose-structs option to SROA
1 parent 71365c0 commit 54be865

File tree

4 files changed

+67
-27
lines changed

4 files changed

+67
-27
lines changed

llvm/include/llvm/Transforms/Scalar.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ LLVM_ABI FunctionPass *createDeadStoreEliminationPass();
4444
//
4545
// SROA - Replace aggregates or pieces of aggregates with scalar SSA values.
4646
//
47-
LLVM_ABI FunctionPass *createSROAPass(bool PreserveCFG = true);
47+
LLVM_ABI FunctionPass *createSROAPass(bool PreserveCFG = true,
48+
bool DecomposeStructs = false);
4849

4950
//===----------------------------------------------------------------------===//
5051
//

llvm/include/llvm/Transforms/Scalar/SROA.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,31 @@ namespace llvm {
2121

2222
class Function;
2323

24-
enum class SROAOptions : bool { ModifyCFG, PreserveCFG };
24+
struct SROAOptions {
25+
enum PreserveCFGOption : bool { ModifyCFG, PreserveCFG };
26+
enum DecomposeStructsOption : bool { NoDecomposeStructs, DecomposeStructs };
27+
PreserveCFGOption PCFGOption;
28+
DecomposeStructsOption DSOption;
29+
SROAOptions(PreserveCFGOption PCFGOption)
30+
: PCFGOption(PCFGOption), DSOption(NoDecomposeStructs) {}
31+
SROAOptions(PreserveCFGOption PCFGOption, DecomposeStructsOption DSOption)
32+
: PCFGOption(PCFGOption), DSOption(DSOption) {}
33+
};
2534

2635
class SROAPass : public PassInfoMixin<SROAPass> {
27-
const SROAOptions PreserveCFG;
36+
const SROAOptions Options;
2837

2938
public:
3039
/// If \p PreserveCFG is set, then the pass is not allowed to modify CFG
3140
/// in any way, even if it would update CFG analyses.
32-
SROAPass(SROAOptions PreserveCFG);
41+
SROAPass(SROAOptions::PreserveCFGOption PreserveCFG);
42+
43+
/// If \p Options.PreserveCFG is set, then the pass is not allowed to modify
44+
/// CFG in any way, even if it would update CFG analyses.
45+
/// If \p Options.DecomposeStructs is set, then the pass will decompose
46+
/// structs allocas into its constituent components regardless of whether or
47+
/// not pointer offsets into them are known at compile time.
48+
SROAPass(const SROAOptions &Options);
3349

3450
/// Run the pass over the function.
3551
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,16 +1353,29 @@ Expected<ScalarizerPassOptions> parseScalarizerOptions(StringRef Params) {
13531353
}
13541354

13551355
Expected<SROAOptions> parseSROAOptions(StringRef Params) {
1356-
if (Params.empty() || Params == "modify-cfg")
1357-
return SROAOptions::ModifyCFG;
1358-
if (Params == "preserve-cfg")
1359-
return SROAOptions::PreserveCFG;
1360-
return make_error<StringError>(
1361-
formatv("invalid SROA pass parameter '{}' (either preserve-cfg or "
1362-
"modify-cfg can be specified)",
1363-
Params)
1364-
.str(),
1365-
inconvertibleErrorCode());
1356+
SROAOptions::PreserveCFGOption PreserveCFG = SROAOptions::ModifyCFG;
1357+
SROAOptions::DecomposeStructsOption DecomposeStructs =
1358+
SROAOptions::NoDecomposeStructs;
1359+
1360+
while (!Params.empty()) {
1361+
StringRef ParamName;
1362+
std::tie(ParamName, Params) = Params.split(';');
1363+
1364+
if (ParamName.consume_front("preserve-cfg"))
1365+
PreserveCFG = SROAOptions::PreserveCFG;
1366+
else if (ParamName.consume_front("modify-cfg"))
1367+
PreserveCFG = SROAOptions::ModifyCFG;
1368+
else if (ParamName.consume_front("no-decompose-structs"))
1369+
DecomposeStructs = SROAOptions::NoDecomposeStructs;
1370+
else if (ParamName.consume_front("decompose-structs"))
1371+
DecomposeStructs = SROAOptions::DecomposeStructs;
1372+
else
1373+
return make_error<StringError>(
1374+
formatv("invalid SROA pass option '{}'", ParamName).str(),
1375+
inconvertibleErrorCode());
1376+
}
1377+
1378+
return SROAOptions(PreserveCFG, DecomposeStructs);
13661379
}
13671380

13681381
Expected<StackLifetime::LivenessType>

llvm/lib/Transforms/Scalar/SROA.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ class SROA {
174174
DomTreeUpdater *const DTU;
175175
AssumptionCache *const AC;
176176
const bool PreserveCFG;
177+
const bool DecomposeStructs;
177178

178179
/// Worklist of alloca instructions to simplify.
179180
///
@@ -236,9 +237,10 @@ class SROA {
236237

237238
public:
238239
SROA(LLVMContext *C, DomTreeUpdater *DTU, AssumptionCache *AC,
239-
SROAOptions PreserveCFG_)
240+
const SROAOptions &Options)
240241
: C(C), DTU(DTU), AC(AC),
241-
PreserveCFG(PreserveCFG_ == SROAOptions::PreserveCFG) {}
242+
PreserveCFG(Options.PCFGOption == SROAOptions::PreserveCFG),
243+
DecomposeStructs(Options.DSOption == SROAOptions::DecomposeStructs) {}
242244

243245
/// Main run method used by both the SROAPass and by the legacy pass.
244246
std::pair<bool /*Changed*/, bool /*CFGChanged*/> runSROA(Function &F);
@@ -6040,7 +6042,7 @@ PreservedAnalyses SROAPass::run(Function &F, FunctionAnalysisManager &AM) {
60406042
AssumptionCache &AC = AM.getResult<AssumptionAnalysis>(F);
60416043
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
60426044
auto [Changed, CFGChanged] =
6043-
SROA(&F.getContext(), &DTU, &AC, PreserveCFG).runSROA(F);
6045+
SROA(&F.getContext(), &DTU, &AC, Options).runSROA(F);
60446046
if (!Changed)
60456047
return PreservedAnalyses::all();
60466048
PreservedAnalyses PA;
@@ -6054,23 +6056,29 @@ void SROAPass::printPipeline(
60546056
raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
60556057
static_cast<PassInfoMixin<SROAPass> *>(this)->printPipeline(
60566058
OS, MapClassName2PassName);
6057-
OS << (PreserveCFG == SROAOptions::PreserveCFG ? "<preserve-cfg>"
6058-
: "<modify-cfg>");
6059+
OS << (Options.PCFGOption == SROAOptions::PreserveCFG
6060+
? "<preserve-cfg>"
6061+
: "<modify-cfg>");
60596062
}
60606063

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) {}
60626067

60636068
namespace {
60646069

60656070
/// A legacy pass for the legacy pass manager that wraps the \c SROA pass.
60666071
class SROALegacyPass : public FunctionPass {
6067-
SROAOptions PreserveCFG;
6072+
SROAOptions Options;
60686073

60696074
public:
60706075
static char ID;
60716076

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) {
60746082
initializeSROALegacyPassPass(*PassRegistry::getPassRegistry());
60756083
}
60766084

@@ -6083,7 +6091,7 @@ class SROALegacyPass : public FunctionPass {
60836091
getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
60846092
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
60856093
auto [Changed, _] =
6086-
SROA(&F.getContext(), &DTU, &AC, PreserveCFG).runSROA(F);
6094+
SROA(&F.getContext(), &DTU, &AC, Options).runSROA(F);
60876095
return Changed;
60886096
}
60896097

@@ -6101,9 +6109,11 @@ class SROALegacyPass : public FunctionPass {
61016109

61026110
char SROALegacyPass::ID = 0;
61036111

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});
61076117
}
61086118

61096119
INITIALIZE_PASS_BEGIN(SROALegacyPass, "sroa",

0 commit comments

Comments
 (0)