compiler: eliminate created but never used maps
Этот коммит содержится в:
		
							родитель
							
								
									25e73a5439
								
							
						
					
					
						коммит
						52199f4a14
					
				
					 1 изменённых файлов: 39 добавлений и 0 удалений
				
			
		|  | @ -37,6 +37,7 @@ func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) { | ||||||
| 		goPasses.Run(c.mod) | 		goPasses.Run(c.mod) | ||||||
| 
 | 
 | ||||||
| 		// Run Go-specific optimization passes. | 		// Run Go-specific optimization passes. | ||||||
|  | 		c.OptimizeMaps() | ||||||
| 		c.OptimizeStringToBytes() | 		c.OptimizeStringToBytes() | ||||||
| 		c.OptimizeAllocs() | 		c.OptimizeAllocs() | ||||||
| 		c.Verify() | 		c.Verify() | ||||||
|  | @ -49,6 +50,44 @@ func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) { | ||||||
| 	modPasses.Run(c.mod) | 	modPasses.Run(c.mod) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Eliminate created but not used maps. | ||||||
|  | // | ||||||
|  | // In the future, this should statically allocate created but never modified | ||||||
|  | // maps. This has not yet been implemented, however. | ||||||
|  | func (c *Compiler) OptimizeMaps() { | ||||||
|  | 	hashmapMake := c.mod.NamedFunction("runtime.hashmapMake") | ||||||
|  | 	if hashmapMake.IsNil() { | ||||||
|  | 		// nothing to optimize | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	hashmapBinarySet := c.mod.NamedFunction("runtime.hashmapBinarySet") | ||||||
|  | 	hashmapStringSet := c.mod.NamedFunction("runtime.hashmapStringSet") | ||||||
|  | 
 | ||||||
|  | 	for _, makeInst := range getUses(hashmapMake) { | ||||||
|  | 		updateInsts := []llvm.Value{} | ||||||
|  | 		unknownUses := false // are there any uses other than setting a value? | ||||||
|  | 
 | ||||||
|  | 		for _, use := range getUses(makeInst) { | ||||||
|  | 			switch use.CalledValue() { | ||||||
|  | 			case hashmapBinarySet, hashmapStringSet: | ||||||
|  | 				updateInsts = append(updateInsts, use) | ||||||
|  | 			default: | ||||||
|  | 				unknownUses = true | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if !unknownUses { | ||||||
|  | 			// This map can be entirely removed, as it is only created but never | ||||||
|  | 			// used. | ||||||
|  | 			for _, inst := range updateInsts { | ||||||
|  | 				inst.EraseFromParentAsInstruction() | ||||||
|  | 			} | ||||||
|  | 			makeInst.EraseFromParentAsInstruction() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Transform runtime.stringToBytes(...) calls into const []byte slices whenever | // Transform runtime.stringToBytes(...) calls into const []byte slices whenever | ||||||
| // possible. This optimizes the following pattern: | // possible. This optimizes the following pattern: | ||||||
| //     w.Write([]byte("foo")) | //     w.Write([]byte("foo")) | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem