2016-02-12 3 views
5

मैं एलएलवीएम में नया हूं और Value और Instruction कक्षाओं की जांच की है। मैं देखता हूं कि इन दोनों कक्षाओं में uses और user विधियां हैं। उनके बीच मतभेद क्या हैं? इसके अलावा, this post के संबंध में, क्या मैं यह निर्धारित करने के लिए इन विधियों का उपयोग कर सकता हूं कि कोई निर्देश मूल्य उत्पन्न करता है या नहीं?एलएलवीएम: निर्देश या मूल्य वर्गों में "उपयोग" और "उपयोगकर्ता" के बीच अंतर

tnx।

+0

ध्यान दें कि, प्रत्येक उपयोगकर्ता एक निर्देश नहीं है, यानी, उपयोगकर्ता भी एक अभिव्यक्ति हो सकता है। – benben

उत्तर

2

मुझे यह जवाब "एलएलवीएम कोर पुस्तकालयों के साथ प्रारंभ करना" पुस्तक में मिला है।

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

• मूल्य वर्ग use_begin() और use_end() पद्धतियों आप उपयोगकर्ता के माध्यम से पुनरावृति करने के लिए अनुमति देने के लिए, अपनी श्रृंखला डीईएफ़ उपयोग का उपयोग करने के लिए एक आसान तरीका की पेशकश को परिभाषित करता है । प्रत्येक वैल्यू क्लास के लिए, आप getName() विधि के माध्यम से अपना नाम भी एक्सेस कर सकते हैं। यह मॉडल इस तथ्य से है कि किसी भी एलएलवीएम मान के साथ एक अलग पहचानकर्ता हो सकता है। उदाहरण के लिए,% add1 एक निर्देश के परिणाम की पहचान कर सकता है, बीबी 1 मूल ब्लॉक की पहचान कर सकता है, और myfunc फ़ंक्शन की पहचान कर सकता है। वैल्यू में एक शक्तिशाली विधि भी है जिसे replaceAllUsesWith (Value *), कहा जाता है जो इस मान के सभी उपयोगकर्ताओं के माध्यम से नेविगेट करता है और इसे कुछ अन्य मान के साथ बदल देता है। यह एक अच्छा उदाहरण है कि एसएसए फॉर्म आपको आसानी से निर्देशों को प्रतिस्थापित करने और तेज़ अनुकूलन लिखने की अनुमति देता है। आप LLVM Value Class पर पूर्ण इंटरफ़ेस देख सकते हैं।

• उपयोगकर्ता श्रेणी में op_begin() और op_end() विधियां हैं जो को आपके द्वारा उपयोग किए जाने वाले सभी वैल्यू इंटरफेस को त्वरित रूप से एक्सेस करने की अनुमति देती हैं। ध्यान दें कि यह उपयोग-डीफ़ श्रृंखला का प्रतिनिधित्व करता है। आप नामक एक सहायक विधि का उपयोग भी कर सकते हैं जिसका उपयोग 0Uमानों को प्रतिस्थापित करने के लिए प्रतिस्थापित UsesOfWith (वैल्यू * से, वैल्यू * टू) है। आप LLVM User Class पर पूर्ण इंटरफ़ेस देख सकते हैं।

4

InstructionValue से लिया गया है, यह दोनों कार्यों को users और uses प्राप्त करता है। अंतर यह है कि Value के उपयोगकर्ता के पास Value है जो इसके संचालन में से एक है।

जब आप uses बुला रहे हैं आप सभी Use उदाहरणों विशेष Value के उपयोगकर्ताओं में से प्रत्येक के Value से एक संदर्भ पकड़े की एक सूची प्राप्त। कॉलिंग users आपको सीधे User की एक सूची देता है। निम्नलिखित कोड दिखाता है कि users और uses का उपयोग कैसे करें।

for(auto U : V->users()){ // U is of type User* 
    if (auto I = dyn_cast<Instruction>(U)){ 
     // an instruction uses V 
    } 
} 

आप एक शॉर्टकट के रूप users देख सकते हैं क्योंकि आप का उपयोग करता है के साथ भी ऐसा कर सकते हैं:

for(auto U : V->uses()){ // U is of type Use* 
    if (auto I = dyn_cast<Instruction>(U.getUser())){ 
     // an instruction uses V 
    } 
} 

आमतौर पर यह users उपयोग करने के लिए एक Value के सभी निर्भरता प्राप्त करने के लिए पर्याप्त है।

Value द्वारा उपयोग किए जाने वाले सभी मूल्य ऑपरेंड हैं। निर्भरता की यह दिशा Value की उपयोग सूची का हिस्सा नहीं है।

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

+0

तो, उपयोग उन सभी निर्देशों/मानों को देता है जिन पर विशेष मूल्य निर्भर करता है और उपयोगकर्ता उस विशेष मूल्य पर निर्भर सभी निर्देश/मान देते हैं, है ना? – Carlos

+0

मैंने अपना जवाब संपादित किया। उम्मीद है कि अब यह स्पष्ट है। –

+0

उपयोगकर्ता को निर्देश मिलते हैं, और उपयोग विशेष मान प्राप्त करते हैं। जब आप किसी दूसरे के साथ 'चर' (मान) को प्रतिस्थापित करना चाहते हैं, तो आपको प्रत्येक उपयोग को प्रतिस्थापित करना होगा। –

संबंधित मुद्दे