Creating/Deleting a new instruction from LLVM IR

Hi,

I was trying to create a new Store instruction and inserting it to LLVM IR (.ll) file. I found the following constructor in LLVM Manual:

StoreInst::StoreInst ( Value * Val,
Value * Ptr,
Instruction * InsertBefore
)

I thought of using this. I don’t know the meaning of the constructors arguments. What all values should be passed for creating a new Store Instruction (with an example) ?

How to insert this to LLVM IR? ( I saw the code snippet in LLVM Programming manual, I couldn’t understand it. Any examples on doing the same? )

I tried to delete an instruction using:

i->eraseFromParent();

But it throws the following error/exception:

opt -load /home/mtech2/Documents/llvm/build/Debug+Asserts/lib/CSE.so -CSE <test.ll> /dev/null
opt: /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:81: static bool llvm::isa_impl_cl<To, From*>::doit(const From*) [with To = llvm::Instruction; >From = llvm::Instruction]: Assertion `Val && “isa<> used on a null pointer”’ failed.
#0 0x29635a5 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/mtech2/Documents/llvm/llvm/lib/Support/Unix/Signals.inc:405:0
#1 0x29638ba PrintStackTraceSignalHandler(void*) /home/mtech2/Documents/llvm/llvm/lib/Support/Unix/Signals.inc:463:0
#2 0x2961eb9 llvm::sys::RunSignalHandlers() /home/mtech2/Documents/llvm/llvm/lib/Support/Signals.cpp:34:0
#3 0x29623b1 SignalHandler(int) /home/mtech2/Documents/llvm/llvm/lib/Support/Unix/Signals.inc:211:0
#4 0x7f190977a340 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x10340)
#5 0x7f1908715cc9 gsignal /build/buildd/eglibc-2.19/signal/…/nptl/sysdeps/unix/sysv/linux/raise.c:56:0
#6 0x7f19087190d8 abort /build/buildd/eglibc-2.19/stdlib/abort.c:91:0
#7 0x7f190870eb86 __assert_fail_base /build/buildd/eglibc-2.19/assert/assert.c:92:0
#8 0x7f190870ec32 (/lib/x86_64-linux-gnu/libc.so.6+0x2fc32)
#9 0x7f19084d9970 llvm::isa_impl_cl<llvm::Instruction, llvm::Instruction*>::doit(llvm::Instruction const*) /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:82:0
#10 0x7f19084d9450 llvm::isa_impl_wrap<llvm::Instruction, llvm::Instruction*, llvm::Instruction*>::doit(llvm::Instruction* const&) /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:123:0
#11 0x7f19084d89e2 llvm::isa_impl_wrap<llvm::Instruction, llvm::ilist_iteratorllvm::Instruction const, llvm::Instruction*>::doit(llvm::ilist_iteratorllvm::Instruction const&) /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:115:0
#12 0x7f19084d8371 bool llvm::isa<llvm::Instruction, llvm::ilist_iteratorllvm::Instruction >(llvm::ilist_iteratorllvm::Instruction const&) /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:135:0
#13 0x7f19084d7ba1 llvm::cast_retty<llvm::Instruction, llvm::ilist_iteratorllvm::Instruction >::ret_type llvm::cast<llvm::Instruction, llvm::ilist_iteratorllvm::Instruction >(llvm::ilist_iteratorllvm::Instruction&) /home/mtech2/Documents/llvm/llvm/include/llvm/Support/Casting.h:230:0
#14 0x7f19084d73fd (anonymous namespace)::CSE::runOnFunction(llvm::Function&) /home/mtech2/Documents/llvm/llvm/lib/Transforms/CSE/CSE.cpp:48:0
#15 0x288fd1c llvm::FPPassManager::runOnFunction(llvm::Function&) /home/mtech2/Documents/llvm/llvm/lib/IR/LegacyPassManager.cpp:1528:0
#16 0x288feaf llvm::FPPassManager::runOnModule(llvm::Module&) /home/mtech2/Documents/llvm/llvm/lib/IR/LegacyPassManager.cpp:1549:0
#17 0x289024a (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/mtech2/Documents/llvm/llvm/lib/IR/LegacyPassManager.cpp:1605:0
#18 0x28909bb llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/mtech2/Documents/llvm/llvm/lib/IR/LegacyPassManager.cpp:1708:0
#19 0x2890bfb llvm::legacy::PassManager::run(llvm::Module&) /home/mtech2/Documents/llvm/llvm/lib/IR/LegacyPassManager.cpp:1740:0
#20 0xee3bd2 main /home/mtech2/Documents/llvm/llvm/tools/opt/opt.cpp:602:0
#21 0x7f1908700ec5 __libc_start_main /build/buildd/eglibc-2.19/csu/libc-start.c:321:0
#22 0xec1739 _start (/home/mtech2/Documents/llvm/build/Debug+Asserts/bin/opt+0xec1739)
Stack dump:
0. Program arguments: opt -load /home/mtech2/Documents/llvm/build/Debug+Asserts/lib/CSE.so -CSE
1. Running pass ‘Function Pass Manager’ on module ‘’.
2. Running pass ‘Print Instructions’ on function ‘@main
Aborted (core dumped)

Any help will be appreciated.

  • Ansar K.A.

Hi,

Hi,

I was trying to create a new Store instruction and inserting it to LLVM IR (.ll) file. I found the following constructor in LLVM Manual:

StoreInst::StoreInst ( Value * Val,
Value * Ptr,
Instruction * InsertBefore
)

I thought of using this. I don’t know the meaning of the constructors arguments. What all values should be passed for creating a new Store Instruction (with an example) ?

How to insert this to LLVM IR? ( I saw the code snippet in LLVM Programming manual, I couldn’t understand it. Any examples on doing the same? )

  • Val is the value you want to store.
  • Ptr is the location where you want to store the value Val.
  • InsertBefore is an optional pointer to an existing instruction, if it is provided the newly created instruction will be just before the provided one.

Also you may want to use the IRBuilder in general to create IR, you may want to follow the Kaleidoscope tutorial at least once (Creating a Store is done chapter 7: http://llvm.org/docs/tutorial/LangImpl7.html )

I tried to delete an instruction using:

i->eraseFromParent();

From the trace it does not seem that this call is leading to the assert. You’re not giving enough information about what you’re doing here. It could be some iterator invalidation for example.

Hi,

What I am trying to do is to check duplicate arithmetic instructions, if found any, I want to delete that duplicate instruction and needed to add a Store Instruction.

Code:
Instruction* temp_Ins;
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
for (BasicBlock::iterator i = b->begin(), ie = b->end(); i != ie; ++i) {

switch(curr_Ins->getOpcode()){

case Instruction::Add: {
// Here i am keeping expression and its address to a Map. Eg: mymap[a+b]=i
// If ‘a+b’ is already in the list then i am trying to delete that new duplicate instruction from LLVM IR.
// following is the code i wrote for deleting duplicate add instruction:
temp_Ins = cast(i);
temp_Ins->eraseFromParent();
}
}
}
}

What I am doing wrong here ?

This is what I suggested in my previous email: this is an iterator invalidation issue.
You are iterating over a linked-list and you are removing the current node from the list and trying to increment the iterator afterward, but it is no longer part of the list at this point.
This is more a C++ question and not LLVM related at this point: you need to move the increment of the iterator at the beginning of the loop body, just after getting the current instruction.

I got it.

Thank you.