आवंटन पंजीकृत करें

संकलक अनुकूलन में, रजिस्टर आवंटन सीमित संख्या में प्रोसेसर रजिस्टरों के लिए स्थानीय स्वचालित चर और अभिव्यक्ति (कंप्यूटर विज्ञान) परिणाम निर्दिष्ट करने की प्रक्रिया है।

रजिस्टर आवंटन एक मूल ब्लॉक (स्थानीय रजिस्टर आवंटन), पूरे फ़ंक्शन/सबरूटीन (वैश्विक रजिस्टर आवंटन), या कॉल-ग्राफ़ (इंटरप्रोसेड्यूरल रजिस्टर आवंटन) के माध्यम से पार की गई फ़ंक्शन सीमाओं पर हो सकता है। जब सम्मलेन बुलाना  को प्रत्येक फ़ंक्शन/प्रक्रिया के अनुसार पूरा किया जाता है, तो प्रत्येक कॉल साइट|कॉल-साइट के आसपास सेव/रिस्टोर की प्रविष्टि की आवश्यकता हो सकती है।

सिद्धांत
कई प्रोग्रामिंग भाषाओं में, प्रोग्रामर किसी भी संख्या में वेरिएबल (कंप्यूटर विज्ञान) का उपयोग कर सकता है। कंप्यूटर सेंट्रल प्रोसेसिंग यूनिट में प्रोसेसर रजिस्टर को जल्दी से पढ़ और लिख सकता है, इसलिए सीपीयू के रजिस्टर में अधिक वेरिएबल होने पर कंप्यूटर प्रोग्राम तेजी से चलता है। इसके अलावा, कभी-कभी रजिस्टरों तक पहुंचने वाला कोड अधिक कॉम्पैक्ट होता है, इसलिए कोड छोटा होता है, और यदि यह मेमोरी के बजाय रजिस्टरों का उपयोग करता है तो इसे तेजी से प्राप्त किया जा सकता है। हालाँकि, रजिस्टरों की संख्या सीमित है। इसलिए, जब कंपाइलर (कंप्यूटिंग) कोड को मशीन-भाषा में अनुवाद कर रहा है, तो उसे यह तय करना होगा कि सीपीयू में सीमित संख्या में रजिस्टरों के लिए वेरिएबल कैसे आवंटित किया जाए।

सभी वेरिएबल एक ही समय में लाइवनेस विश्लेषण (या लाइव) नहीं होते हैं, इसलिए, एक प्रोग्राम के जीवनकाल में, एक दिए गए रजिस्टर का उपयोग विभिन्न वेरिएबल्स को रखने के लिए किया जा सकता है। हालाँकि, एक ही समय में उपयोग में आने वाले दो वेरिएबल्स को किसी एक वेरिएबल को दूषित किए बिना एक ही रजिस्टर में असाइन नहीं किया जा सकता है। यदि सभी वेरिएबल्स को रखने के लिए पर्याप्त रजिस्टर नहीं हैं, तो कुछ वेरिएबल्स को रैंडम एक्सेस मेमोरी से ले जाया जा सकता है। इस प्रक्रिया को रजिस्टरों को फैलाना कहा जाता है। एक प्रोग्राम के जीवनकाल में, एक वेरिएबल को रजिस्टरों में डाला और संग्रहीत किया जा सकता है: इस वेरिएबल को तब विभाजित माना जाता है। रैम तक पहुंच रजिस्टरों तक पहुंचने की तुलना में काफी धीमी है और इसलिए एक संकलित प्रोग्राम धीमी गति से चलता है। इसलिए, एक अनुकूलन कंपाइलर का लक्ष्य रजिस्टरों को यथासंभव अधिक से अधिक वेरिएबल निर्दिष्ट करना है। उच्च रजिस्टर दबाव एक तकनीकी शब्द है जिसका अर्थ है कि अधिक स्पिल और पुनः लोड की आवश्यकता है; इसे ब्रौन एट अल द्वारा परिभाषित किया गया है। एक निर्देश पर एक साथ लाइव चर की संख्या के रूप में।

इसके अलावा, कुछ कंप्यूटर अक्सर एक्सेस किए जाने वाले रजिस्टरों को कैश (कंप्यूटिंग) डिज़ाइन करते हैं। इसलिए, किसी स्रोत और गंतव्य के लिए समान रजिस्टर निर्दिष्ट करके कार्यक्रमों को और अधिक अनुकूलित किया जा सकता है  जब भी संभव हो अनुदेश. यह विशेष रूप से महत्वपूर्ण है यदि कंपाइलर स्टेटिक सिंगल असाइनमेंट फॉर्म | स्टेटिक सिंगल-असाइनमेंट फॉर्म (एसएसए) जैसे मध्यवर्ती प्रतिनिधित्व का उपयोग कर रहा है। विशेष रूप से, जब एसएसए पूरी तरह से अनुकूलित नहीं होता है तो यह कृत्रिम रूप से अतिरिक्त उत्पन्न कर सकता है  निर्देश।

रजिस्टर आवंटन के घटक
इसलिए रजिस्टर आवंटन में यह चुनना शामिल है कि रनटाइम पर वेरिएबल्स को कहां संग्रहीत किया जाए, यानी रजिस्टरों के अंदर या बाहर। यदि वेरिएबल को रजिस्टरों में संग्रहीत किया जाना है, तो आवंटनकर्ता को यह निर्धारित करने की आवश्यकता है कि यह वेरिएबल किस रजिस्टर में संग्रहीत किया जाएगा। अंततः, एक और चुनौती उस अवधि को निर्धारित करना है जिसके लिए एक चर को एक ही स्थान पर रहना चाहिए।

एक रजिस्टर आवंटनकर्ता, चुनी गई आवंटन रणनीति की उपेक्षा करते हुए, इन चुनौतियों का समाधान करने के लिए मुख्य कार्यों के एक सेट पर भरोसा कर सकता है। इन कार्रवाइयों को कई अलग-अलग श्रेणियों में एकत्रित किया जा सकता है: कई रजिस्टर आवंटन दृष्टिकोण कार्यों की एक या अधिक विशिष्ट श्रेणियों के लिए अनुकूलन करते हैं।
 * मूव इंसर्शन: इस क्रिया में रजिस्टरों के बीच मूव निर्देशों की संख्या बढ़ाना शामिल है, यानी एक वैरिएबल को एक के बजाय उसके जीवनकाल के दौरान विभिन्न रजिस्टरों में लाइव करना। यह स्प्लिट लाइव रेंज दृष्टिकोण में होता है।
 * स्पिलिंग: इस क्रिया में एक वेरिएबल को रजिस्टरों के बजाय मेमोरी में संग्रहीत करना शामिल है।
 * असाइनमेंट: इस क्रिया में एक वेरिएबल के लिए एक रजिस्टर असाइन करना शामिल है।
 * कोलेसिंग: इस क्रिया में रजिस्टरों के बीच चालों की संख्या को सीमित करना शामिल है, इस प्रकार निर्देशों की कुल संख्या को सीमित करना शामिल है। उदाहरण के लिए, विभिन्न तरीकों से एक वेरिएबल लाइव की पहचान करके, और इसे अपने पूरे जीवनकाल के दौरान एक रजिस्टर में संग्रहीत करना।

रजिस्टर आवंटन में उठाई गई सामान्य समस्याएं
रजिस्टर आवंटन कई समस्याओं को जन्म देता है जिन्हें विभिन्न रजिस्टर आवंटन दृष्टिकोणों से निपटाया जा सकता है (या टाला जा सकता है)। सबसे आम समस्याओं में से तीन की पहचान इस प्रकार की गई है:


 * अलियासिंग: कुछ आर्किटेक्चर में, एक रजिस्टर को मान निर्दिष्ट करने से दूसरे रजिस्टर का मूल्य प्रभावित हो सकता है: इसे अलियासिंग कहा जाता है। उदाहरण के लिए, x86 आर्किटेक्चर में चार सामान्य प्रयोजन 32-बिट रजिस्टर हैं जिनका उपयोग 16-बिट या 8-बिट रजिस्टर के रूप में भी किया जा सकता है। इस मामले में, ईएक्स रजिस्टर को 32-बिट मान निर्दिष्ट करने से एएल रजिस्टर का मूल्य प्रभावित होगा।


 * प्री-कलरिंग: यह समस्या कुछ वेरिएबल्स को विशेष रजिस्टरों को निर्दिष्ट करने के लिए मजबूर करने का एक कार्य है। उदाहरण के लिए, पावरपीसी कॉलिंग कन्वेंशन में, पैरामीटर आमतौर पर R3-R10 में पारित किए जाते हैं और रिटर्न मान R3 में पारित किया जाता है।
 * एनपी-समस्या: चैतीन एट अल। पता चला कि रजिस्टर आवंटन एक एनपी-पूर्णता|एनपी-पूर्ण समस्या है। वे ग्राफ़ रंग की समस्या को रजिस्टर आवंटन समस्या में यह दिखा कर कम कर देते हैं कि एक मनमाना ग्राफ़ के लिए, एक प्रोग्राम का निर्माण इस तरह किया जा सकता है कि प्रोग्राम के लिए रजिस्टर आवंटन (नोड्स का प्रतिनिधित्व करने वाले रजिस्टर और उपलब्ध रंगों का प्रतिनिधित्व करने वाले मशीन रजिस्टरों के साथ) मूल ग्राफ़ के लिए एक रंग होगा। चूँकि ग्राफ़ कलरिंग एक एनपी-हार्ड समस्या है और रजिस्टर आवंटन एनपी में है, यह समस्या की एनपी-पूर्णता को साबित करता है।

आवंटन तकनीक पंजीकृत करें
रजिस्टर आवंटन कोड के मूल ब्लॉक पर हो सकता है: इसे स्थानीय कहा जाता है, और इसका उल्लेख सबसे पहले होर्विट्ज़ एट अल द्वारा किया गया था। चूँकि बुनियादी ब्लॉकों में शाखाएँ नहीं होती हैं, इसलिए आवंटन प्रक्रिया को तेज़ माना जाता है, क्योंकि रजिस्टर आवंटन में नियंत्रण-प्रवाह ग्राफ़ मर्ज बिंदुओं के प्रबंधन से स्वयं पता चलता है एक समय लेने वाला ऑपरेशन। हालाँकि, ऐसा माना जाता है कि यह दृष्टिकोण वैश्विक दृष्टिकोण के रूप में अनुकूलित कोड का उत्पादन नहीं करता है, जो संपूर्ण संकलन इकाई (उदाहरण के लिए एक विधि या प्रक्रिया) पर काम करता है।

ग्राफ-रंग आवंटन
रजिस्टर आवंटन को हल करने के लिए ग्राफ़-रंग आवंटन प्रमुख दृष्टिकोण है।यह सबसे पहले चैतीन एट अल द्वारा प्रस्तावित किया गया था। इस दृष्टिकोण में, ग्राफ़ (अलग-अलग गणित) में नोड्स लाइव रेंज (वेरिएबल (कंप्यूटर विज्ञान), अस्थायी चर, वर्चुअल/प्रतीकात्मक रजिस्टर) का प्रतिनिधित्व करते हैं जो रजिस्टर आवंटन के लिए उम्मीदवार हैं। किनारे उन लाइव रेंजों को जोड़ते हैं जो हस्तक्षेप करती हैं, यानी, लाइव रेंज जो एक साथ कम से कम एक प्रोग्राम बिंदु पर लाइव होती हैं। रजिस्टर आवंटन तब ग्राफ़ रंग की समस्या को कम कर देता है जिसमें रंग (रजिस्टर) नोड्स को निर्दिष्ट किए जाते हैं जैसे कि एक किनारे से जुड़े दो नोड्स को एक ही रंग प्राप्त नहीं होता है।

लाइव वैरिएबल विश्लेषण का उपयोग करके, एक हस्तक्षेप ग्राफ बनाया जा सकता है। हस्तक्षेप ग्राफ़, जो एक ग्राफ़ (असतत गणित) # अप्रत्यक्ष ग्राफ़ है जहां नोड्स प्रोग्राम के चर हैं, का उपयोग यह मॉडल करने के लिए किया जाता है कि कौन से चर को एक ही रजिस्टर में आवंटित नहीं किया जा सकता है।

सिद्धांत
चैतिन-शैली ग्राफ़-रंग रजिस्टर आवंटनकर्ता में मुख्य चरण हैं: # रेनंबर: स्रोत कार्यक्रम में लाइव रेंज जानकारी खोजें।
 * 1) बिल्ड: इंटरफेरेंस ग्राफ़ बनाएं.
 * 2) कोलेसेस: कॉपी निर्देशों से संबंधित गैर-हस्तक्षेप करने वाले चर की लाइव श्रेणियों को मर्ज करें।
 * 3) स्पिल लागत: प्रत्येक चर की स्पिल लागत की गणना करें। यह अंतिम कार्यक्रम की गति पर एक चर को मेमोरी में मैप करने के प्रभाव का आकलन करता है।
 * 4) सरल बनाएं: अनुमान ग्राफ़ में नोड्स का क्रम बनाएं
 * 5) स्पिल कोड: स्पिल निर्देश डालें, यानी रजिस्टरों और मेमोरी के बीच मूल्यों को कम्यूट करने के लिए लोड और स्टोर करें।
 * 6) चुनें: प्रत्येक वेरिएबल के लिए एक रजिस्टर निर्दिष्ट करें।

कमियाँ और आगे सुधार
ग्राफ़-रंग आवंटन में तीन प्रमुख कमियाँ हैं। सबसे पहले, यह ग्राफ़-रंग पर निर्भर करता है, जो एक एनपी-पूर्णता | एनपी-पूर्ण समस्या है, यह तय करने के लिए कि कौन से चर बिखरे हुए हैं। न्यूनतम रंग ग्राफ ढूँढना वास्तव में एक एनपी-पूर्ण समस्या है। दूसरा, जब तक लाइव-रेंज विभाजन का उपयोग नहीं किया जाता है, बेदखल किए गए चर हर जगह फैल जाते हैं: स्टोर (क्रमशः लोड) निर्देश यथासंभव जल्दी (क्रमशः देर से) डाले जाते हैं, यानी, परिवर्तनीय परिभाषाओं के ठीक बाद (क्रमशः पहले) (क्रमशः उपयोग)। तीसरा, एक वेरिएबल जो फैलाया नहीं जाता है उसे पूरे जीवनकाल में एक ही रजिस्टर में रखा जाता है।

दूसरी ओर, एक एकल रजिस्टर नाम कई रजिस्टर वर्गों में दिखाई दे सकता है, जहां एक वर्ग रजिस्टर नामों का एक सेट है जो एक विशेष भूमिका में विनिमेय हैं। फिर, एकाधिक रजिस्टर नाम एकल हार्डवेयर रजिस्टर के लिए उपनाम हो सकते हैं। अंत में, ग्राफ़ रंगाई रजिस्टरों को आवंटित करने के लिए एक आक्रामक तकनीक है, लेकिन हस्तक्षेप ग्राफ़ के उपयोग के कारण कम्प्यूटेशनल रूप से महंगी है, जिसमें सबसे खराब स्थिति का आकार हो सकता है जो कि समय जटिलता # लाइव रेंज की संख्या में सामान्य समय जटिलताओं की तालिका है। ग्राफ-रंग रजिस्टर आवंटन का पारंपरिक सूत्रीकरण अप्रत्यक्ष रूप से गैर-अतिव्यापी सामान्य प्रयोजन रजिस्टरों के एक एकल बैंक को मानता है और ओवरलैपिंग रजिस्टर जोड़े, विशेष प्रयोजन रजिस्टर और एकाधिक रजिस्टर बैंकों जैसी अनियमित वास्तुशिल्प सुविधाओं को संभाल नहीं करता है।

चैतिन-शैली ग्राफ-रंग दृष्टिकोण का एक बाद का सुधार ब्रिग्स एट अल द्वारा पाया गया: इसे रूढ़िवादी सहसंयोजन कहा जाता है। यह सुधार यह तय करने के लिए एक मानदंड जोड़ता है कि दो लाइव रेंज को कब मर्ज किया जा सकता है। मुख्य रूप से, गैर-हस्तक्षेप आवश्यकताओं के अलावा, दो चर को केवल तभी संयोजित किया जा सकता है यदि उनके विलय से आगे फैलाव नहीं होगा। ब्रिग्स एट अल. चैतिन के कार्यों में दूसरा सुधार प्रस्तुत किया गया है जो कि पक्षपातपूर्ण रंग-रोगन है। बायस्ड कलरिंग ग्राफ़-कलरिंग में उसी रंग को लाइव रेंज में निर्दिष्ट करने का प्रयास करता है जो कॉपी से संबंधित है।

रेखीय स्कैन
लीनियर स्कैन एक अन्य वैश्विक रजिस्टर आवंटन दृष्टिकोण है। यह सबसे पहले पोलेटो एट अल द्वारा प्रस्तावित किया गया था। 1999 में। इस दृष्टिकोण में, कोड को ग्राफ़ में नहीं बदला जाता है। इसके बजाय, सभी चरों को उनकी लाइव रेंज निर्धारित करने के लिए रैखिक रूप से स्कैन किया जाता है, जिसे अंतराल के रूप में दर्शाया जाता है। एक बार जब सभी चरों की लाइव रेंज का पता लगा लिया जाता है, तो अंतरालों को कालानुक्रमिक रूप से पार किया जाता है। हालाँकि यह ट्रैवर्सल उन वेरिएबल्स की पहचान करने में मदद कर सकता है जिनकी लाइव रेंज हस्तक्षेप करती है, कोई हस्तक्षेप ग्राफ़ नहीं बनाया जा रहा है और वेरिएबल्स को लालची तरीके से आवंटित किया गया है।

इस दृष्टिकोण की प्रेरणा गति है; उत्पन्न कोड के निष्पादन समय के संदर्भ में नहीं, बल्कि कोड निर्माण में बिताए गए समय के संदर्भ में। आमतौर पर, मानक ग्राफ़ रंगाई दृष्टिकोण गुणवत्ता कोड उत्पन्न करते हैं, लेकिन इसमें एक महत्वपूर्ण ओवरहेड (कंप्यूटिंग) होता है, द्विघात लागत वाला प्रयुक्त ग्राफ़ रंग एल्गोरिथ्म। इस सुविधा के कारण, रैखिक स्कैन वर्तमान में हॉटस्पॉट (वर्चुअल मशीन), क्रोम V8, जिक्स आरवीएम जैसे कई जेआईटी कंपाइलरों में उपयोग किया जाने वाला दृष्टिकोण है। और एंड्रॉइड रनटाइम (एआरटी)। हॉटस्पॉट (वर्चुअल मशीन) अपने बेहतर कोड के लिए ग्राफ़ कलरिंग का उपयोग करता है।

स्यूडोकोड
यह पोलेटो एट अल द्वारा पहली बार प्रस्तावित एल्गोरिदम का वर्णन करता है। कहाँ:
 * आर उपलब्ध रजिस्टरों की संख्या है।
 * सक्रिय वह सूची है, जो वर्तमान बिंदु को ओवरलैप करने वाले लाइव अंतरालों के बढ़ते अंत बिंदु के क्रम में क्रमबद्ध होती है और रजिस्टरों में रखी जाती है।

लीनियरस्कैनरजिस्टरआवंटन सक्रिय ← {} प्रत्येक लाइव अंतराल i के लिए, प्रारंभ बिंदु को बढ़ाने के क्रम में करें समाप्तिपुरानाअंतराल(i) यदि लंबाई (सक्रिय) = आर तो स्पिलएटइंटरवल(i) अन्य रजिस्टर[i] ← मुफ़्त रजिस्टरों के पूल से हटाया गया एक रजिस्टर i को सक्रिय में जोड़ें, अंतिम बिंदु को बढ़ाकर क्रमबद्ध करें समाप्तिपुरानाअंतराल(i) प्रत्येक अंतराल के लिए j सक्रिय में, अंत बिंदु को बढ़ाने के क्रम में करें यदि समापन बिंदु[j] ≥ प्रारंभबिंदु[i] तो वापस करना j को सक्रिय से हटा दें मुफ़्त रजिस्टरों के पूल में रजिस्टर[जे] जोड़ें स्पिलएटइंटरवल(i) स्पिल ← सक्रिय में अंतिम अंतराल यदि समापन बिंदु[स्पिल] > समापन बिंदु[i] तो रजिस्टर[i] ← रजिस्टर[स्पिल] स्थान[स्पिल] ← नया स्टैक स्थान सक्रिय से स्पिल हटाएँ i को सक्रिय में जोड़ें, अंतिम बिंदु को बढ़ाकर क्रमबद्ध करें अन्य स्थान[i] ← नया स्टैक स्थान

कमियाँ और आगे सुधार
हालाँकि, रैखिक स्कैन दो प्रमुख कमियाँ प्रस्तुत करता है। सबसे पहले, इसके लालची पहलू के कारण, यह जीवनकाल के छिद्रों को ध्यान में नहीं रखता है, अर्थात वे सीमाएँ जहाँ चर के मूल्य की आवश्यकता नहीं है। इसके अलावा, एक स्पिल्ड वैरिएबल अपने पूरे जीवनकाल तक स्पिल्ड रहेगा। पोलेटो के रैखिक स्कैन एल्गोरिदम पर कई अन्य शोध कार्य किए गए। उदाहरण के लिए, ट्रब एट अल ने बेहतर गुणवत्ता का कोड तैयार करने के उद्देश्य से सेकंड-चांस बिनपैकिंग नामक एक एल्गोरिदम प्रस्तावित किया। इस दृष्टिकोण में, स्पिल्ड वेरिएबल्स को मानक रैखिक स्कैन एल्गोरिदम में उपयोग किए गए एक से अलग ह्यूरिस्टिक (कंप्यूटर विज्ञान) का उपयोग करके बाद में एक रजिस्टर में संग्रहीत करने का अवसर मिलता है। लाइव अंतराल का उपयोग करने के बजाय, एल्गोरिदम लाइव रेंज पर निर्भर करता है, जिसका अर्थ है कि यदि किसी रेंज को फैलाने की आवश्यकता है, तो इस चर के अनुरूप अन्य सभी रेंज को फैलाना आवश्यक नहीं है।

स्टेटिक सिंगल असाइनमेंट फॉर्म से लाभ लेने के लिए रैखिक स्कैन आवंटन को भी अनुकूलित किया गया था: इस मध्यवर्ती प्रतिनिधित्व के गुण आवंटन एल्गोरिदम को सरल बनाते हैं और जीवनकाल छेद की सीधे गणना करने की अनुमति देते हैं। सबसे पहले, डेटा-प्रवाह ग्राफ़ विश्लेषण में बिताया गया समय, जिसका उद्देश्य जीवनकाल अंतराल बनाना है, कम हो जाता है, क्योंकि चर अद्वितीय होते हैं। इसके परिणामस्वरूप छोटे लाइव अंतराल उत्पन्न होते हैं, क्योंकि प्रत्येक नया असाइनमेंट एक नए लाइव अंतराल से मेल खाता है। मॉडलिंग अंतराल और जीवंतता छिद्रों से बचने के लिए, रोजर्स ने भविष्य-सक्रिय सेट नामक एक सरलीकरण दिखाया, जिसने 80% निर्देशों के लिए अंतराल को सफलतापूर्वक हटा दिया।

रीमटेरियलाइजेशन
इष्टतम रजिस्टर आवंटन की समस्या एनपी-पूर्ण है। परिणामस्वरूप, कंपाइलर इसके समाधान का अनुमान लगाने के लिए अनुमानी तकनीकों का उपयोग करते हैं।

चैतिन एट अल. स्पिल कोड की गुणवत्ता में सुधार के लिए कई विचारों पर चर्चा करें। वे बताते हैं कि कुछ मानों की एक ही निर्देश में पुनः गणना की जा सकती है और गणना के लिए आवश्यक ऑपरेंड हमेशा उपलब्ध रहेगा। वे इन असाधारण मूल्यों को कभी नष्ट न होने वाला कहते हैं और ध्यान देते हैं कि ऐसे मूल्यों को बिखरने और पुनः लोड करने के बजाय पुनर्गणना की जानी चाहिए। वे आगे ध्यान देते हैं कि कभी न खत्म किए गए मूल्य की एक असंबद्ध प्रतिलिपि को सीधे वांछित रजिस्टर में पुन: गणना करके समाप्त किया जा सकता है।

इन तकनीकों को रीमटेरियलाइजेशन कहा जाता है। व्यवहार में, पुनर्भौतिकीकरण के अवसरों में शामिल हैं:
 * पूर्णांक स्थिरांक का तत्काल भार और, कुछ मशीनों पर, फ़्लोटिंग-पॉइंट स्थिरांक,
 * फ़्रेम पॉइंटर या स्थिर डेटा क्षेत्र से निरंतर ऑफसेट की गणना करना, और
 * डिस्प्ले से गैर-स्थानीय फ़्रेम पॉइंटर्स लोड करना।

ब्रिग्स एट अल. जटिल, बहु-मूल्यवान लाइव रेंज के लिए पुनर्भौतिकीकरण के अवसरों का लाभ उठाने के लिए चैतिन के काम का विस्तार करें। उन्होंने पाया कि प्रत्येक मान को पर्याप्त जानकारी के साथ टैग करने की आवश्यकता है ताकि आवंटनकर्ता इसे सही ढंग से संभाल सके। ब्रिग्स का दृष्टिकोण निम्नलिखित है: सबसे पहले, प्रत्येक लाइव रेंज को उसके घटक मूल्यों में विभाजित करें, फिर प्रत्येक मूल्य पर रीमटेरियलाइजेशन टैग का प्रचार करें, और समान टैग वाले कनेक्टेड मानों से नई लाइव रेंज बनाएं।

एकजुट होना
रजिस्टर आवंटन के संदर्भ में, कोलेसिंग उन दो वेरिएबल्स को एक ही स्थान पर आवंटित करके वेरिएबल-टू-वेरिएबल मूव ऑपरेशंस को मर्ज करने का कार्य है। हस्तक्षेप ग्राफ़ बनने के बाद सहसंयोजन क्रिया होती है। एक बार जब दो नोड्स एकजुट हो जाते हैं, तो उन्हें एक ही रंग मिलना चाहिए और एक ही रजिस्टर में आवंटित किया जाना चाहिए, एक बार कॉपी ऑपरेशन अनावश्यक हो जाता है।

सहसंयोजन करने से हस्तक्षेप ग्राफ़ की रंग क्षमता पर सकारात्मक और नकारात्मक दोनों प्रभाव पड़ सकते हैं। उदाहरण के लिए, एक नकारात्मक प्रभाव जो सह-संयोजन का ग्राफ़ अनुमान की रंगक्षमता पर हो सकता है, वह है जब दो नोड्स एक साथ जुड़ते हैं, क्योंकि परिणाम नोड में उन नोड्स के किनारों का एक संघ होगा जिन्हें जोड़ा जा रहा है। उदाहरण के लिए, अनुमान ग्राफ़ की रंग योग्यता पर एकत्रित होने का एक सकारात्मक प्रभाव यह है कि, जब एक नोड दोनों नोड्स के एकत्रित होने में हस्तक्षेप करता है, तो नोड की डिग्री एक से कम हो जाती है, जिससे हस्तक्षेप ग्राफ़ की समग्र रंग क्षमता में सुधार होता है।

कई समेकित अनुमान उपलब्ध हैं:


 * आक्रामक सहसंयोजन: इसे पहली बार चैतिन मूल रजिस्टर आवंटनकर्ता द्वारा पेश किया गया था। इस अनुमान का उद्देश्य किसी भी गैर-हस्तक्षेप करने वाले, प्रतिलिपि-संबंधित नोड्स को एकजुट करना है। प्रतिलिपि उन्मूलन के दृष्टिकोण से, इस अनुमान के सर्वोत्तम परिणाम हैं। दूसरी ओर, आक्रामक सहसंयोजन अनुमान ग्राफ की रंग क्षमता को प्रभावित कर सकता है।
 * कंजर्वेटिव कोलेसिंग: यह मुख्य रूप से आक्रामक कोलेसिंग के समान अनुमान का उपयोग करता है लेकिन यह चालों को मर्ज करता है यदि, और केवल तभी, यह हस्तक्षेप ग्राफ की रंग क्षमता से समझौता नहीं करता है।
 * पुनरावृत्त सहसंयोजन: यह ग्राफ़ की रंगक्षमता को बनाए रखते हुए, उस समय एक विशेष चाल को हटा देता है।
 * आशावादी सहसंयोजन: यह आक्रामक सहसंयोजन पर आधारित है, लेकिन यदि अनुमान ग्राफ़ रंग योग्यता से समझौता किया जाता है, तो यह यथासंभव कम चालें छोड़ देता है।

हाइब्रिड आवंटन
कुछ अन्य रजिस्टर आवंटन दृष्टिकोण रजिस्टर के उपयोग को अनुकूलित करने के लिए एक तकनीक तक सीमित नहीं हैं। उदाहरण के लिए, कैवाज़ोस एट अल ने एक समाधान प्रस्तावित किया, जहां रैखिक स्कैन और ग्राफ़ रंग एल्गोरिदम दोनों का उपयोग करना संभव है। इस दृष्टिकोण में, एक या दूसरे समाधान के बीच का चुनाव गतिशील रूप से निर्धारित किया जाता है: सबसे पहले, एक यंत्र अधिगम  एल्गोरिदम का उपयोग ऑफ़लाइन किया जाता है, यानी रनटाइम पर नहीं, एक अनुमानी फ़ंक्शन बनाने के लिए जो यह निर्धारित करता है कि किस आवंटन एल्गोरिदम का उपयोग करने की आवश्यकता है। फिर अनुमानी फ़ंक्शन का उपयोग रनटाइम पर किया जाता है; कोड व्यवहार के आलोक में, आवंटनकर्ता दो उपलब्ध एल्गोरिदम में से एक को चुन सकता है।

ट्रेस रजिस्टर आवंटन ईआईएसएल एट अल द्वारा विकसित एक हालिया दृष्टिकोण है। यह तकनीक स्थानीय रूप से आवंटन को संभालती है: यह यह निर्धारित करने के लिए गतिशील प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग) डेटा पर निर्भर करती है कि किसी दिए गए नियंत्रण प्रवाह ग्राफ में कौन सी शाखाएं सबसे अधिक बार उपयोग की जाएंगी। इसके बाद यह निशानों के एक सेट (यानी कोड खंड) का अनुमान लगाता है जिसमें सबसे अधिक उपयोग की जाने वाली शाखा के पक्ष में मर्ज बिंदु को नजरअंदाज कर दिया जाता है। फिर प्रत्येक ट्रेस को आवंटनकर्ता द्वारा स्वतंत्र रूप से संसाधित किया जाता है। इस दृष्टिकोण को हाइब्रिड माना जा सकता है क्योंकि विभिन्न ट्रेस के बीच विभिन्न रजिस्टर आवंटन एल्गोरिदम का उपयोग करना संभव है।

विभाजित आवंटन
स्प्लिट आवंटन एक अन्य रजिस्टर आवंटन तकनीक है जो विभिन्न दृष्टिकोणों को जोड़ती है, जिन्हें आमतौर पर विपरीत माना जाता है। उदाहरण के लिए, हाइब्रिड आवंटन तकनीक को विभाजित माना जा सकता है क्योंकि पहला अनुमानी निर्माण चरण ऑफ़लाइन किया जाता है, और अनुमानी उपयोग ऑनलाइन किया जाता है। इसी तरह, बी. डियॉफ़ एट अल। ऑफ़लाइन और ऑनलाइन दोनों व्यवहारों, अर्थात् स्थिर और गतिशील संकलन, पर निर्भर एक आवंटन तकनीक का प्रस्ताव रखा। ऑफ़लाइन चरण के दौरान, सबसे पहले पूर्णांक प्रोग्रामिंग  का उपयोग करके एक इष्टतम स्पिल सेट इकट्ठा किया जाता है। फिर, लाइव रेंज का उपयोग करके एनोटेट किया जाता है   एल्गोरिदम जो पहले से पहचाने गए इष्टतम स्पिल सेट पर निर्भर करता है। ऑफ़लाइन चरण में एकत्र किए गए डेटा के आधार पर, बाद में ऑनलाइन चरण के दौरान रजिस्टर आवंटन किया जाता है। 2007 में, बाउचेज़ एट अल। रजिस्टर आवंटन को अलग-अलग चरणों में विभाजित करने का भी सुझाव दिया गया, जिसमें एक चरण स्पिलिंग के लिए समर्पित है, और एक रंग और संयोजन के लिए समर्पित है।

विभिन्न तकनीकों के बीच तुलना
एक रजिस्टर आवंटन तकनीक के दूसरे के मुकाबले प्रदर्शन का आकलन करने के लिए कई मैट्रिक्स का उपयोग किया गया है। रजिस्टर आवंटन में आम तौर पर कोड की गुणवत्ता, यानी कोड जो तेजी से निष्पादित होता है, और विश्लेषण ओवरहेड, यानी अनुकूलित रजिस्टर आवंटन के साथ कोड उत्पन्न करने के लिए स्रोत कोड का विश्लेषण करने में लगने वाला समय, के बीच एक व्यापार-बंद से निपटना होता है। इस दृष्टिकोण से, उत्पन्न कोड का निष्पादन समय और जीवंतता विश्लेषण में बिताया गया समय विभिन्न तकनीकों की तुलना करने के लिए प्रासंगिक मीट्रिक हैं।

एक बार प्रासंगिक मेट्रिक्स चुने जाने के बाद, जिस कोड पर मेट्रिक्स लागू किया जाएगा वह उपलब्ध होना चाहिए और समस्या के लिए प्रासंगिक होना चाहिए, या तो वास्तविक दुनिया के अनुप्रयोग के व्यवहार को प्रतिबिंबित करके, या उस विशेष समस्या के लिए प्रासंगिक होना चाहिए जिसे एल्गोरिदम संबोधित करना चाहता है। रजिस्टर आवंटन के बारे में हालिया लेख विशेष रूप से डैकापो बेंचमार्क सूट का उपयोग करते हैं।

यह भी देखें

 * स्ट्राहलर संख्या, एक अभिव्यक्ति वृक्ष का मूल्यांकन करने के लिए आवश्यक रजिस्टरों की न्यूनतम संख्या।
 * रजिस्टर (कीवर्ड), एक रजिस्टर में रखे जाने वाले वेरिएबल के लिए C और C++ में संकेत।

बाहरी संबंध

 * A Tutorial on Integer Programming
 * Conference Integer Programming and Combinatorial Optimization, IPCO
 * The Aussois Combinatorial Optimization Workshop
 * Bosscher, Steven; and Novillo, Diego. GCC gets a new Optimizer Framework. An article about GCC's use of SSA and how it improves over older IRs.
 * The SSA Bibliography. Extensive catalogue of SSA research papers.
 * Zadeck, F. Kenneth. "The Development of Static Single Assignment Form", December 2007 talk on the origins of SSA.
 * VV.AA. "SSA-based Compiler Design" (2014)
 * Citations from CiteSeer
 * Optimization manuals by Agner Fog - documentation about x86 processor architecture and low-level code optimization