mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 04:42:44 +00:00 
			
		
		
		
	LibJS: Fix MergeBlocks emitting some blocks twice
This commit is contained in:
		
							parent
							
								
									28e2467b48
								
							
						
					
					
						commit
						c66284ab0b
					
				
					 1 changed files with 15 additions and 8 deletions
				
			
		|  | @ -109,14 +109,21 @@ void MergeBlocks::perform(PassPipelineExecutable& executable) | |||
|         } | ||||
| 
 | ||||
|         auto blocks_to_merge_copy = blocks_to_merge; | ||||
|         for (auto& last : blocks_to_merge) { | ||||
|             auto entry = cfg.find(last); | ||||
|             if (entry == cfg.end()) | ||||
|                 continue; | ||||
|             auto successor = *entry->value.begin(); | ||||
|             if (auto it = successors.find(successor); !it.is_end()) { | ||||
|                 successors.insert(it.index(), last); | ||||
|                 blocks_to_merge_copy.remove(last); | ||||
|         // We need to do the following multiple times, due to it not being
 | ||||
|         // guaranteed, that the blocks are in sequential order
 | ||||
|         bool did_prepend = true; | ||||
|         while (did_prepend) { | ||||
|             did_prepend = false; | ||||
|             for (auto const* last : blocks_to_merge) { | ||||
|                 auto entry = cfg.find(last); | ||||
|                 if (entry == cfg.end()) | ||||
|                     continue; | ||||
|                 auto const* successor = *entry->value.begin(); | ||||
|                 if (successor == successors.first()) { | ||||
|                     successors.prepend(last); | ||||
|                     blocks_to_merge_copy.remove(last); | ||||
|                     did_prepend = true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Hendiadyoin1
						Hendiadyoin1