[LLVMdev] a question of the simple constant propagation pass
Jianzhou Zhao
jianzhou at seas.upenn.edu
Fri Feb 26 06:56:55 PST 2010
Hi,
I copied the code from LLVM2.6 below.
line 81 removes 'I' from the worklist. But 'I' is already
removed from the list at line 67 when it is popped from the list.
Could the loop (line 73-75) insert this I into the worklist again?
In the case where 'I' can be constant-folding, Line 80 says 'I' is
a dead instruction. Can 'I' appears in its def-use chain?
But I was probably confused.
Jianzhou
57 bool ConstantPropagation::runOnFunction(Function &F) {
58 // Initialize the worklist to all of the instructions ready to process...
59 std::set<Instruction*> WorkList;
60 for(inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) {
61 WorkList.insert(&*i);
62 }
63 bool Changed = false;
64
65 while (!WorkList.empty()) {
66 Instruction *I = *WorkList.begin();
67 WorkList.erase(WorkList.begin()); // Get an element from
the worklist...
68
69 if (!I->use_empty()) // Don't muck with dead
instructions...
70 if (Constant *C = ConstantFoldInstruction(I, F.getContext())) {
71 // Add all of the users of this instruction to the
worklist, they might
72 // be constant propagatable now...
73 for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
74 UI != UE; ++UI)
75 WorkList.insert(cast<Instruction>(*UI));
76
77 // Replace all of the uses of a variable with uses of the constant.
78 I->replaceAllUsesWith(C);
79
80 // Remove the dead instruction.
81 WorkList.erase(I);
82 I->eraseFromParent();
83
84 // We made a change to the function...
85 Changed = true;
86 ++NumInstKilled;
87 }
88 }
89 return Changed;
90 }
More information about the llvm-dev
mailing list