(original) (raw)

Hey all!

I'm new to LLVM and advance C++.

I came across this piece of code and found it difficult to understand.

Can anyone please explain how is it working ? I want to get loop count, sub loop count etc printed as output.
Thanks.

//Iteration on loops
for (LoopInfo::iterator i = LI.begin(), e = LI.end(); i != e; ++i)
{
Loop \*L = \*i;
int subloop = 1;
countLoop++;

static LLVMContext Context;
BasicBlock \*parentLoopPred = L->getLoopPredecessor();
BasicBlock \*parentLoopHead = L->getHeader();
std::vector subLoopAll = L->getSubLoops();

Loop::iterator j, f;
//Parent Loop Calculation
//Counter = 0 instruction insertion
// You must declare a constant Int like so instead of using it directly in a AllocaInst instantiation.
ConstantInt \*IntVal4 = ConstantInt::get(Type::getInt32Ty(Context), 4); // counter = 4
Value \*one1 = ConstantInt::get(Type::getInt32Ty(Context), -1, true);
Instruction \*ACounter1 = new AllocaInst(Type::getInt32Ty(Context), 0, IntVal4, "counter"); //(IntegerType::get(mContext, 32), one, "counter", loopPredecessor); //(IntegerType::get(mContext, 32), IR.getInt32(0), "counter");
parentLoopPred->getInstList().insert(parentLoopPred->getFirstInsertionPt(), ACounter1);

Instruction \*SCounter1 = new StoreInst(one1, ACounter1);
SCounter1->insertAfter(ACounter1);
//Counter++ instruction insertion
Value \*IValue1 = ConstantInt::get(Type::getInt32Ty(Context), 1, true);
Instruction \*CValue1 = new LoadInst(ACounter1, "midCount");
parentLoopHead->getInstList().insert(parentLoopHead->getFirstInsertionPt(), CValue1);
Instruction \*NValue1 = BinaryOperator::CreateNSWAdd(CValue1, IValue1, "incremented");// Instruction::Add, CValue, IValue, "");
NValue1->insertAfter(CValue1);
Instruction \*SNValue1 = new StoreInst(NValue1, ACounter1);
SNValue1->insertAfter(NValue1);
Value \*PValue1 = SNValue1->getOperand(0);
std::vector printArrayRef1;
Value \*PValue12 = ConstantInt::get(Type::getInt32Ty(Context), subLoopAll.size(), true);
std::vector printArrayRef12;