2012-03-14 13 views
5

मैं मैं पहली बार लोड हो रहा हूँ vairable "मैं"% 1 और% 2 तब में चर 'जे' में मैं शर्त से अधिक होता है कि (की तुलना कर रहा हूँ इसे में followint LLVM आईआर फ़ाइलएलएलवीएम आईआर से मूल ब्लॉक में पहला निर्देश मिटाना?

%1 = load i32* %i, align 4 
    %2 = load i32* %j, align 4 
    %3 = icmp sgt i32 %1, %2 
    br i1 %3, label %4, label %6 

; <label>:4          ; preds = %0 
    %5 = load i32* %i, align 4 
    store i32 %5, i32* %k, align 4 
    br label %6 

; <label>:6          ; preds = %5, %0 
    ret i32 0 

है i> जे)। उस पर आधारित शाखा या तो लेबल 4 या लेबल 6 है। मेरी समस्या यह है कि चरम "i" के लिए पहले मूल ब्लॉक में और दूसरा मूलभूत ब्लॉक में दो लोड निर्देश हैं। यहां मैं दूसरे लोड निर्देश को हटाना चाहता हूं। इसके लिए मैं इसे तब कर रहा हूं जब मैं परिवर्तनीय "i" के लिए दूसरे लोड निर्देश तक पहुंचता हूं, मैं पहले निर्देश द्वारा दूसरे निर्देश के सभी उपयोगों को प्रतिस्थापित कर रहा हूं, फिर मैं वर्तमान निर्देश को मिटा रहा हूं। यहां मैं निर्देश इटरेटर सूचक सेट करने में असमर्थ हूं। मैं अगले निर्देश के लिए सेट नहीं करना चाहता (स्टोर i32% 5, i32 *% k, संरेखित 4)। क्या कोई दूसरा रास्ता है? यदि आप जानते हैं तो कृपया मुझे बताएं।

+0

सुनिश्चित नहीं है कि मैं आपका प्रश्न समझता हूं। लेकिन मुझे पूरा यकीन है कि बाद के पास आपके लिए उस भार को आसानी से हटाने में सक्षम होना चाहिए, इसलिए मैं वास्तव में परेशान नहीं होता। यदि आपके पास लोड को हटाने के लिए एक अनिवार्य कारण है, तो कृपया अपना प्रश्न दोबारा शुरू करें, क्योंकि मैं समझ नहीं पा रहा हूं कि आपकी समस्या वास्तव में क्या है। – CAFxX

+0

मेरी समस्या यह है कि दूसरे लोड निर्देश को हटाने के बाद मैं निर्देश इटरेटर सेट करना चाहता हूं जैसे कि अगले पुनरावृत्ति में इसे (i32% 5, i32 *% k, 4 संरेखित करें) तक पहुंच जाना चाहिए क्योंकि लूप के लिए मैं निर्देश इटरेटर को बढ़ा रहा हूं । – damrudhard

+0

'inst-> eraseFromParent() 'के बाद तुरंत' बीबी-> प्रारंभ() 'को कॉल करके एक नया इटरेटर प्राप्त क्यों न करें? – CAFxX

उत्तर

10

यदि मैं आपको सही ढंग से समझता हूं, तो आप बस एक निर्देश मिटाना और कोड पर पुनरावृत्ति करना चाहते हैं। अगर यह सही है, DeadInstElimintation पास (जो lib/Transforms/Scalar/DCE.cpp में रहती है) से इस उदाहरण पर एक नज़र डालें:

virtual bool runOnBasicBlock(BasicBlock &BB) { 
    bool Changed = false; 
    for (BasicBlock::iterator DI = BB.begin(); DI != BB.end();) { 
    Instruction *Inst = DI++; 
    if (isInstructionTriviallyDead(Inst)) { 
     Inst->eraseFromParent(); 
     Changed = true; 
     ++DIEEliminated; 
    } 
    } 
    return Changed; 
} 

नोट करने के लिए दिलचस्प बात यह है कि कैसे इटरेटर वृद्धि की जाती है है। DI++for के अंतिम खंड के अंदर नहीं किया गया है, बल्कि अलग-अलग DIInst को असाइन किया गया है। यह सुनिश्चित करता है कि भले ही आप Inst हटाएं, DI पहले से ही अगले निर्देश को इंगित करता है ताकि लूप अगले निर्देशों पर चल रहा रहे।

+0

मुझे सीएएफएक्सएक्स से समाधान मिला। आपकी मदद के लिए भी धन्यवाद। – damrudhard

+0

@damrudhard: नए पुनरावर्तक को 'बीबी-> शुरू करें()' पर सेट करना केवल तभी काम करेगा जब नया निर्देश मूल ब्लॉक में पहला है। अन्यथा आप कुछ निर्देश वापस जायेंगे। यदि यह आपके साथ ठीक है, तो कोई समस्या नहीं है। मुझे लगता है कि मेरे जवाब में दिखाया गया समाधान अधिक सामान्य है, हालांकि। –

+0

अन्य मामले में मैं निर्देश निर्देशक को पिछले निर्देश में सेट कर रहा हूं ताकि अगले पुनरावृत्ति में यह हटाए गए एक के बाद निर्देश पर इंगित करेगा। – damrudhard

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