En informática , la selección de instrucciones es la etapa del backend de un compilador que transforma su representación intermedia (IR) de nivel medio en una IR de bajo nivel. En un compilador típico, la selección de instrucciones precede tanto a la planificación de instrucciones como a la asignación de registros ; por lo tanto, su IR de salida tiene un conjunto infinito de pseudoregistros (a menudo conocidos como temporales ) y puede estar —y normalmente lo está— sujeto a optimización de peephole . Por lo demás, se asemeja mucho al código máquina , bytecode o lenguaje ensamblador de destino .
Por ejemplo, para la siguiente secuencia de código IR de nivel medio
t1 = a t2 = b t3 = t1 + t2 a = t3 b = t1
Una buena secuencia de instrucciones para la arquitectura x86 es
MOVER EAX , a CAMBIAR EAX , b AÑADIR a , EAXPara un análisis exhaustivo sobre la selección de instrucción, consulte [ 1 ] [ 2 ] .
Expansión macro
El enfoque más simple para la selección de instrucciones se conoce como expansión de macros [ 3 ] o generación de código interpretativo . [ 4 ] [ 5 ] [ 6 ] Un selector de instrucciones de expansión de macros opera haciendo coincidir plantillas sobre el IR de nivel medio. Al encontrar una coincidencia, se ejecuta la macro correspondiente , utilizando la porción coincidente del IR como entrada, que emite las instrucciones objetivo apropiadas. La expansión de macros puede hacerse directamente sobre la representación textual del IR de nivel medio, [ 7 ] [ 8 ] o el IR puede transformarse primero en una representación gráfica que luego se recorre en profundidad. [ 9 ] En este último caso, una plantilla coincide con uno o más nodos adyacentes en el grafo.
A menos que la máquina de destino sea muy simple, la expansión de macros aislada suele generar código ineficiente. Para mitigar esta limitación, los compiladores que aplican este enfoque suelen combinarlo con la optimización de peephole para reemplazar combinaciones de instrucciones simples con equivalentes más complejos que aumentan el rendimiento y reducen el tamaño del código. Esto se conoce como el enfoque de Davidson-Fraser y actualmente se aplica en GCC . [ 10 ]
Recubrimiento de gráficos
Otro enfoque consiste en transformar primero el IR de nivel intermedio en un grafo y luego cubrirlo mediante patrones . Un patrón es una plantilla que coincide con una parte del grafo y puede implementarse con una sola instrucción proporcionada por la máquina de destino. El objetivo es cubrir el grafo de manera que se minimice el coste total de los patrones seleccionados, donde el coste suele representar el número de ciclos necesarios para ejecutar la instrucción. Para grafos con forma de árbol, la cobertura de menor coste puede encontrarse en tiempo lineal mediante programación dinámica [ 11 ] , pero para DAG y grafos completos el problema se vuelve NP-completo y, por lo tanto, se suele resolver mediante algoritmos voraces o métodos de optimización combinatoria [ 12 ] [ 13 ] [ 14 ] .
Referencias
- ↑ Blindell, Gabriel S. Hjort (2013). Encuesta sobre la selección de instrucción: una revisión bibliográfica extensa y moderna (Informe). arXiv : 1306.4898 . ISBN 978-91-7501-898-0.
- ↑ Blindell, Gabriel S. Hjort (2016). Selección de instrucciones: principios, métodos y aplicaciones . Springer. doi : 10.1007/978-3-319-34019-7 . ISBN 978-3-319-34017-3. S2CID 13390131 .
- ↑ Brown, P. (1969). "Un estudio de los macroprocesadores". Annual Review in Automatic Programming . 6 (2): 37– 88. doi : 10.1016/0066-4138(69)90001-9 . ISSN 0066-4138 .
- ↑ Cattell, RGG (1979). «Análisis y crítica de algunos modelos de generación de código» (PDF) . Escuela de Informática, Universidad Carnegie Mellon (Informe técnico). Archivado (PDF) del original el 23 de mayo de 2019.
- ↑ Ganapathi, M.; Fischer, CN; Hennessy, JL (1982). "Generación de código de compilador reorientable". Computing Surveys . 14 (4): 573– 592. doi : 10.1145/356893.356897 . ISSN 0360-0300 . S2CID 2361347 .
- ↑ Lunell, H. (1983). Sistemas de escritura de generadores de código (tesis doctoral). Linköping, Suecia: Universidad de Linköping.
- ^ Ammann, U.; Nori, KV; Jensen, K.; Nägeli, H. (1974). "Notas de implementación del compilador PASCAL (P)". Instituts für Informatik (Informe técnico).
- ↑ Orgass, RJ; Waite, WM (1969). "Una base para un sistema de programación móvil" . Communications of the ACM . 12 (9): 507– 510. doi : 10.1145/363219.363226 . S2CID 8164996 .
- ↑ Wilcox, TR (1971). Generación de código máquina para lenguajes de programación de alto nivel (tesis doctoral). Ithaca, Nueva York, EE. UU.: Universidad de Cornell.
- ↑ Davidson, JW; Fraser, CW (1984). "Code Selection Through Object Code Optimization". ACM Transactions on Programming Languages and Systems . 6 (4): 505– 526. CiteSeerX 10.1.1.76.3796 . doi : 10.1145/1780.1783 . ISSN 0164-0925 . S2CID 10315537 .
- ↑ Aho, AV; Ganapathi, M.; Tjiang, SWK (1989). "Generación de código mediante coincidencia de árboles y programación dinámica". ACM Transactions on Programming Languages and Systems . 11 (4): 491– 516. CiteSeerX 10.1.1.456.9102 . doi : 10.1145/69558.75700 . S2CID 1165995 .
- ↑ Wilson, T.; Grewal, G.; Halley, B.; Banerji, D. (1994). "Un enfoque integrado para la generación de código reorientable". Actas del 7.º Simposio Internacional sobre Síntesis de Alto Nivel . págs. 70–75 . CiteSeerX 10.1.1.521.8288 . doi : 10.1109/ISHLS.1994.302339 . ISBN 978-0-8186-5785-6. S2CID 14384424 .
- ↑ Bashford, Steven; Leupers, Rainer (1999). "Selección de código basada en restricciones para DSPS de punto fijo". Actas de la 36.ª conferencia ACM/IEEE sobre automatización del diseño - DAC '99 . págs. 817–822 . CiteSeerX 10.1.1.331.390 . doi : 10.1145/309847.310076 . ISBN 978-1581331097. S2CID 5513238 .
- ↑ Floch, A.; Wolinski, C.; Kuchcinski, K. (2010). "Planificación combinada y selección de instrucciones para procesadores con estructura de celdas reconfigurable". Actas de la 21.ª Conferencia Internacional sobre Arquitecturas y Procesadores Específicos para Aplicaciones (ASAP'10) : 167–174 .
Enlaces externos
- Formas alternativas de dar soporte a diferentes generaciones de ordenadores
- Optimizaciones del compilador