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; | 	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) | void CodeSize::visit(Statement const& _statement) | ||||||
| { | { | ||||||
| 	if (_statement.type() == typeid(FunctionDefinition)) | 	if (_statement.type() == typeid(FunctionDefinition) && m_ignoreFunctions) | ||||||
| 		return; | 		return; | ||||||
| 	else if (!( | 	else if (!( | ||||||
| 		_statement.type() == typeid(Block) || | 		_statement.type() == typeid(Block) || | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ namespace yul | |||||||
| /**
 | /**
 | ||||||
|  * Metric for the size of code. |  * Metric for the size of code. | ||||||
|  * More specifically, the number of AST nodes. |  * 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. |  * 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: |  * 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(Statement const& _statement); | ||||||
| 	static size_t codeSize(Expression const& _expression); | 	static size_t codeSize(Expression const& _expression); | ||||||
| 	static size_t codeSize(Block const& _block); | 	static size_t codeSize(Block const& _block); | ||||||
|  | 	static size_t codeSizeIncludingFunctions(Block const& _block); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	CodeSize() {} | 	CodeSize(bool _ignoreFunctions = true): m_ignoreFunctions(_ignoreFunctions) {} | ||||||
| 
 | 
 | ||||||
| 	void visit(Statement const& _statement) override; | 	void visit(Statement const& _statement) override; | ||||||
| 	void visit(Expression const& _expression) override; | 	void visit(Expression const& _expression) override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | 	bool m_ignoreFunctions; | ||||||
| 	size_t m_size = 0; | 	size_t m_size = 0; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -41,6 +41,7 @@ | |||||||
| #include <libyul/optimiser/StructuralSimplifier.h> | #include <libyul/optimiser/StructuralSimplifier.h> | ||||||
| #include <libyul/optimiser/RedundantAssignEliminator.h> | #include <libyul/optimiser/RedundantAssignEliminator.h> | ||||||
| #include <libyul/optimiser/VarNameCleaner.h> | #include <libyul/optimiser/VarNameCleaner.h> | ||||||
|  | #include <libyul/optimiser/Metrics.h> | ||||||
| #include <libyul/AsmAnalysis.h> | #include <libyul/AsmAnalysis.h> | ||||||
| #include <libyul/AsmAnalysisInfo.h> | #include <libyul/AsmAnalysisInfo.h> | ||||||
| #include <libyul/AsmData.h> | #include <libyul/AsmData.h> | ||||||
| @ -80,8 +81,16 @@ void OptimiserSuite::run( | |||||||
| 
 | 
 | ||||||
| 	NameDispenser dispenser{*_dialect, ast}; | 	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
 | 			// Turn into SSA and simplify
 | ||||||
| 			ExpressionSplitter{*_dialect, dispenser}(ast); | 			ExpressionSplitter{*_dialect, dispenser}(ast); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user