2012-03-14 19 views
5

Tôi có followint LLVM IR tập tinXóa hướng dẫn đầu tiên trong khối cơ bản từ LLVM IR?

%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 

Trong đó tôi đầu tiên tải vairable "i" trong% 1 và biến "j" trong% 2 sau đó tôi đang so sánh lớn hơn tình trạng đó là (i> j). Dựa trên đó có chi nhánh hoặc nhãn 4 hoặc nhãn 6. Vấn đề của tôi là có hai hướng dẫn tải cho biến "i" một trong khối cơ bản đầu tiên và khác trong khối cơ bản thứ 2. Ở đây tôi muốn loại bỏ hướng dẫn tải 2. Đối với nó tôi đang làm nó như khi tôi đạt đến hướng dẫn tải 2 cho biến "i" Tôi đang thay thế tất cả các sử dụng hướng dẫn thứ 2 bằng lệnh đầu tiên sau đó tôi xóa hướng dẫn hiện tại tức là thứ 2. Ở đây tôi không thể thiết lập con trỏ iterator hướng dẫn. Tôi không muốn đặt lệnh tiếp theo (lưu i32% 5, i32 *% k, căn chỉnh 4). Có cách nào khác không? Nếu bạn biết xin vui lòng cho tôi biết.

+0

Không chắc chắn tôi hiểu câu hỏi của bạn. Nhưng tôi khá chắc chắn rằng những lần vượt qua tiếp theo sẽ có thể dễ dàng loại bỏ tải trọng đó cho bạn, vì vậy tôi sẽ không thực sự bận tâm. Nếu bạn có lý do thuyết phục để xóa tải, vui lòng đặt lại câu hỏi của bạn, vì tôi không thể hiểu được vấn đề của bạn thực sự là gì. – CAFxX

+0

Vấn đề của tôi là sau khi xóa hướng dẫn tải thứ hai, tôi muốn đặt lệnh lặp như vậy trong lần lặp tiếp theo, nó sẽ đến (lưu i32% 5, i32 *% k, căn chỉnh 4) vì trong vòng lặp, tôi tăng trình chỉ lệnh . – damrudhard

+0

Tại sao không đơn giản lấy một trình lặp mới bằng cách gọi 'BB-> begin()' một lần nữa ngay sau 'inst-> eraseFromParent()'? – CAFxX

Trả lời

10

Nếu tôi hiểu chính xác bạn, tất cả những gì bạn muốn chỉ là xóa hướng dẫn và tiếp tục lặp lại mã. Nếu đúng vậy, hãy nhìn vào ví dụ này từ DeadInstElimintation qua (mà sống ở 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; 
} 

Điều thú vị cần lưu ý là cách iterator được tăng lên. Các DI++ không được thực hiện bên trong điều khoản cuối cùng của for, mà là riêng biệt, với DI hiện tại được gán cho Inst. Điều này đảm bảo rằng ngay cả khi bạn xóa Inst, DI đã trỏ đến lệnh tiếp theo để vòng lặp sẽ tiếp tục chạy trên các hướng dẫn tiếp theo.

+0

Tôi nhận được giải pháp từ CAFxX. Cảm ơn bạn cũng đã giúp đỡ của bạn. – damrudhard

+0

@damrudhard: đặt trình vòng lặp mới thành 'BB-> begin()' sẽ chỉ hoạt động nếu lệnh mới là lệnh đầu tiên trong khối cơ bản. Nếu không, bạn sẽ quay lại một vài hướng dẫn. Nếu điều này là ok với bạn, sau đó không có vấn đề. Tôi nghĩ rằng các giải pháp thể hiện trong câu trả lời của tôi là tổng quát hơn, mặc dù. –

+0

Trong trường hợp khác, tôi đang thiết lập trình hướng dẫn lặp lại hướng dẫn trước để trong lần lặp tiếp theo, nó sẽ trỏ đến hướng dẫn ngay sau lệnh đã xóa. – damrudhard

Các vấn đề liên quan