mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #6172 from ethereum/runYulOptAsLongAsHelpful
[Yul] Run yul optimizer until it has no effect anymore.
This commit is contained in:
		
						commit
						831353c590
					
				| @ -52,9 +52,16 @@ size_t CodeSize::codeSize(Block const& _block) | ||||
| 	return cs.m_size; | ||||
| } | ||||
| 
 | ||||
| size_t CodeSize::codeSizeIncludingFunctions(Block const& _block) | ||||
| { | ||||
| 	CodeSize cs(false); | ||||
| 	cs(_block); | ||||
| 	return cs.m_size; | ||||
| } | ||||
| 
 | ||||
| void CodeSize::visit(Statement const& _statement) | ||||
| { | ||||
| 	if (_statement.type() == typeid(FunctionDefinition)) | ||||
| 	if (_statement.type() == typeid(FunctionDefinition) && m_ignoreFunctions) | ||||
| 		return; | ||||
| 	else if (!( | ||||
| 		_statement.type() == typeid(Block) || | ||||
|  | ||||
| @ -28,7 +28,7 @@ namespace yul | ||||
| /**
 | ||||
|  * Metric for the size of code. | ||||
|  * More specifically, the number of AST nodes. | ||||
|  * Ignores function definitions while traversing the AST. | ||||
|  * Ignores function definitions while traversing the AST by default. | ||||
|  * If you want to know the size of a function, you have to invoke this on its body. | ||||
|  * | ||||
|  * As an exception, the following AST elements have a cost of zero: | ||||
| @ -44,14 +44,16 @@ public: | ||||
| 	static size_t codeSize(Statement const& _statement); | ||||
| 	static size_t codeSize(Expression const& _expression); | ||||
| 	static size_t codeSize(Block const& _block); | ||||
| 	static size_t codeSizeIncludingFunctions(Block const& _block); | ||||
| 
 | ||||
| private: | ||||
| 	CodeSize() {} | ||||
| 	CodeSize(bool _ignoreFunctions = true): m_ignoreFunctions(_ignoreFunctions) {} | ||||
| 
 | ||||
| 	void visit(Statement const& _statement) override; | ||||
| 	void visit(Expression const& _expression) override; | ||||
| 
 | ||||
| private: | ||||
| 	bool m_ignoreFunctions; | ||||
| 	size_t m_size = 0; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -41,6 +41,7 @@ | ||||
| #include <libyul/optimiser/StructuralSimplifier.h> | ||||
| #include <libyul/optimiser/RedundantAssignEliminator.h> | ||||
| #include <libyul/optimiser/VarNameCleaner.h> | ||||
| #include <libyul/optimiser/Metrics.h> | ||||
| #include <libyul/AsmAnalysis.h> | ||||
| #include <libyul/AsmAnalysisInfo.h> | ||||
| #include <libyul/AsmData.h> | ||||
| @ -80,8 +81,16 @@ void OptimiserSuite::run( | ||||
| 
 | ||||
| 	NameDispenser dispenser{*_dialect, ast}; | ||||
| 
 | ||||
| 	for (size_t i = 0; i < 4; i++) | ||||
| 	size_t codeSize = 0; | ||||
| 	for (size_t rounds = 0; rounds < 12; ++rounds) | ||||
| 	{ | ||||
| 		{ | ||||
| 			size_t newSize = CodeSize::codeSizeIncludingFunctions(ast); | ||||
| 			if (newSize == codeSize) | ||||
| 				break; | ||||
| 			codeSize = newSize; | ||||
| 		} | ||||
| 
 | ||||
| 		{ | ||||
| 			// Turn into SSA and simplify
 | ||||
| 			ExpressionSplitter{*_dialect, dispenser}(ast); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user