[LLVMdev] Deleting Instructions after Intrinsic Creation

Aditya Vishnubhotla Vijay aditya at iss.tu-darmstadt.de
Tue Mar 4 05:31:29 PST 2008

I tried creating  intrinsics which
are to be placeholders for a set of instructions which
should not be executed by the backend.

I want to retain only intrinsic,phi and terminator instructions in a basic 
I have taken care of the external dependencies of basic block.
How do I delete the rest of the instructions?

Thank You


Below is the section of LLVM IR after intrinsic creation (Instructions to be 
deleted  have only internal uses):

define i32 @main() nounwind  {
        %year.i = alloca i32            ; <i32*> [#uses=2]
        %tmp2.i = call i32 (i8*, ...)* @printf( i8* noalias  getelementptr 
([15 x i8]* @.str2, i32 0, i32 0) ) nounwind                 ; <i32> 
        %tmp4.i = call i32 (i8*, ...)* @scanf( i8* noalias  getelementptr ([3 
x i8]* @.str3, i32 0, i32 0), i32* %year.i ) nounwind             ; <i32> 
        %tmp5.i = load i32* %year.i, align 4            ; <i32> [#uses=3]
        %tmp12.i = sitofp i32 %tmp5.i to double         ; <double> [#uses=1]
        %tmp3.i = sub double %tmp12.i, 1.000000e+00             ; <double> 
        %tmp4.i1 = fdiv double %tmp3.i, 4.000000e+00            ; <double> 
        %tmp45.i = fptosi double %tmp4.i1 to i32                ; <i32> 
        %tmp9.i = fdiv double %tmp3.i, 1.000000e+02             ; <double> 
        %tmp910.i = fptosi double %tmp9.i to i32                ; <i32> 
        %tmp14.i = fdiv double %tmp3.i, 4.000000e+02            ; <double> 
        %tmp1415.i = fptosi double %tmp14.i to i32              ; <i32> 
        %tmp18.i = add i32 %tmp45.i, %tmp5.i            ; <i32> [#uses=1]
        %tmp20.i = sub i32 %tmp18.i, %tmp910.i          ; <i32> [#uses=1]
        %tmp22.i = add i32 %tmp20.i, %tmp1415.i         ; <i32> [#uses=1]
        %tmp23.i = srem i32 %tmp22.i, 7         ; <i32> [#uses=0]
        %tmp2.i2 = and i32 %tmp5.i, 3           ; <i32> [#uses=1]
        %tmp3.i3 = icmp eq i32 %tmp2.i2, 0              ; <i1> [#uses=0]
        %migrate_begin = call i32 (...)* @llvm.migrate_begin( )         ; 
<i32> [#uses=2]
        %migrate_end = call i32 @llvm.migrate_end_1.i32( 
i32 %migrate_begin )           ; <i32> [#uses=5]
        %migrate_end1 = call i1 @llvm.migrate_end_1.i1( 
i32 %migrate_begin )            ; <i1> [#uses=1]
        br i1 %migrate_end1, label %bb.i, label %bb10.i
Section of code used to delete instructions:

for(BasicBlock::iterator i= bbp->getFirstNonPHI(),ie=bbp->end();i!=ie;++i){ 
	if(!((i->isTerminator()) || (isa<CallInst>(i)))) {i->dropAllReferences();	}	
for(BasicBlock::iterator bi= bbp->getFirstNonPHI(),ie=bbp->end();bi!=ie;++bi){ 			
	if((*bi).getNumOperands()==0) {(*bi).eraseFromParent();}

(gdb) bt
#0  llvm::AssemblyWriter::printInstruction (this=0xbfa1a75c, I=@0x877b488) at 
#1  0x085b2ece in llvm::AssemblyWriter::write (this=0xbfa1a75c, I=0x877b488) 
at AsmWriter.cpp:741
#2  0x085adb0f in llvm::Instruction::print (this=0x877b488, o=@0x8794f48, 
AAW=0x0) at AsmWriter.cpp:1482
#3  0x085b5bf2 in llvm::Instruction::print (this=0x877b488, OS=@0x8794f48) 
at /work/aditya/llvm-2.2/include/llvm/Instruction.h:172
#4  0x08357c13 in llvm::operator<< (OS=@0x8794f48, V=@0x877b488) 
at /work/aditya/llvm-2.2/include/llvm/Value.h:221
#5  0x0863ceb5 in (anonymous namespace)::Verifier::WriteValue (this=0x8794f18, 
V=0x877b488) at Verifier.cpp:272
#6  0x0863d139 in (anonymous namespace)::Verifier::CheckFailed 
(this=0x8794f18, Message=@0xbfa1a878, V1=0x877b488, V2=0x0, V3=0x0, V4=0x0) 
at Verifier.cpp:292
#7  0x08636ba2 in (anonymous namespace)::Verifier::visitInstruction 
(this=0x8794f18, I=@0x877b488) at Verifier.cpp:1077
#8  0x08637807 in (anonymous namespace)::Verifier::visitAllocationInst 
(this=0x8794f18, AI=@0x877b488) at Verifier.cpp:1037
#9  0x0863d75e in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visitAllocaInst (this=0x8794f18, I=@0x877b488) 
at /work/aditya/llvm-2.2/include/llvm/Support/InstVisitor.h:173
#10 0x0863d778 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visitAlloca (this=0x8794f18, I=@0x877b488) 
at /work/aditya/llvm-2.2/include/llvm/Instruction.def:130
#11 0x0863df45 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visit (this=0x8794f18, I=@0x877b488) 
at /work/aditya/llvm-2.2/include/llvm/Instruction.def:130
#12 0x0863e1d1 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visit<llvm::ilist_iterator<llvm::Instruction> > (this=0x8794f18, 
      {<bidirectional_iterator<llvm::Instruction,int>> = {<> = {<No data 
fields>}, <No data fields>}, NodePtr = 0x877b4f8}, End=
      {<bidirectional_iterator<llvm::Instruction,int>> = {<> = {<No data 
fields>}, <No data fields>}, NodePtr = 0x877b4c8}) 
at /work/aditya/llvm-2.2/include/llvm/Support/InstVisitor.h:92
#13 0x0863e248 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visit (this=0x8794f18, BB=@0x8776e80) 
at /work/aditya/llvm-2.2/include/llvm/Support/InstVisitor.h:107
#14 0x0863e293 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visit<llvm::ilist_iterator<llvm::BasicBlock> > (this=0x8794f18, Start=
      {<bidirectional_iterator<llvm::BasicBlock,int>> = {<> = {<No data 
fields>}, <No data fields>}, NodePtr = 0x8776ee8}, End=
      {<bidirectional_iterator<llvm::BasicBlock,int>> = {<> = {<No data 
fields>}, <No data fields>}, NodePtr = 0x8776ea8}) 
at /work/aditya/llvm-2.2/include/llvm/Support/InstVisitor.h:92
#15 0x0863e4b0 in llvm::InstVisitor<(anonymous namespace)::Verifier, 
void>::visit (this=0x8794f18, F=@0x8777638) 
at /work/aditya/llvm-2.2/include/llvm/Support/InstVisitor.h:103
#16 0x0863e4ff in (anonymous namespace)::Verifier::runOnFunction 
(this=0x8794f18, F=@0x8777638) at Verifier.cpp:155
#17 0x0860e692 in llvm::FPPassManager::runOnFunction (this=0x8793ca8, 
F=@0x8777638) at PassManager.cpp:1171
#18 0x0860e83e in llvm::FPPassManager::runOnModule (this=0x8793ca8, 
M=@0x8773d10) at PassManager.cpp:1191
#19 0x0860e362 in llvm::MPPassManager::runOnModule (this=0x87731d8, 
M=@0x8773d10) at PassManager.cpp:1240
#20 0x0860e518 in llvm::PassManagerImpl::run (this=0x87766b8, M=@0x8773d10) at 
#21 0x0860e56a in llvm::PassManager::run (this=0xbfa1ac28, M=@0x8773d10) at 
#22 0x0836680d in main (argc=13, argv=0xbfa1ae14) at opt.cpp:426

More information about the llvm-dev mailing list