[LLVMdev] noob IR builder question
Sanjoy Das
sanjoy at playingwithpointers.com
Tue Mar 10 15:40:03 PDT 2015
The IRBuilder class does some basic constant folding. Look at the
`Folder` member variable in the class definition.
On Tue, Mar 10, 2015 at 3:15 PM, Alan Nilsson <alan.n at mac.com> wrote:
> I am trying to get a handle on IR builder, at least some basics. I ran
> through a tutorial here: Create a working compiler with the LLVM framework,
> Part 1, and it worked well enough. I have some simple code that creates a
> hello world IR. I am trying to now bring in some concepts from the
> Kaleidoscope tutorial, namely adding expressions the the IR that is dumped
> out.
>
> I’ve added the following snippets:
>
> Value *c1 = ConstantFP::get(context, APFloat(1.0));
> Value *c2 = ConstantFP::get(context, APFloat(3.0));
> builder.CreateFAdd(c1, c2, "addtmp”);
>
> expecting to see an add instruction in the dump, but nothing is added. This
> seems to be pretty strait from the kaleidoscope examples but I am missing
> something here I am sure. Here is the full program:
>
> 1 using namespace llvm;
> 2
> 3 llvm::Module *module;
> 4 llvm::IRBuilder<> builder(getGlobalContext());
> 5
> 6 int main(int argc, const char * argv[]) {
> 7 llvm::LLVMContext & context = llvm::getGlobalContext();
> 8 module = new llvm::Module("calc", context);
> 9
> 10
> 11 llvm::FunctionType *funcType =
> llvm::FunctionType::get(builder.getVoidTy(), false);
> 12 llvm::Function *mainFunc =
> 13 llvm::Function::Create(funcType, llvm::Function::ExternalLinkage,
> "main", module);
> 14 llvm::BasicBlock *entry = llvm::BasicBlock::Create(context,
> "entrypoint", mainFunc);
> 15 builder.SetInsertPoint(entry);
> 16
> 17 llvm::Value *helloWorld = builder.CreateGlobalStringPtr("hello
> world!\n");
> 18
> 19 std::vector<llvm::Type *> putsArgs;
> 20 putsArgs.push_back(builder.getInt8Ty()->getPointerTo());
> 21 llvm::ArrayRef<llvm::Type*> argsRef(putsArgs);
> 22
> 23 llvm::FunctionType *putsType =
> 24 llvm::FunctionType::get(builder.getInt32Ty(), argsRef, false);
> 25 llvm::Constant *putsFunc = module->getOrInsertFunction("puts",
> putsType);
> 26
> 27 Value *a;
> 28 builder.CreateAlloca(builder.getDoubleTy(), a, "a");
> 29
> 30 Value *c1 = ConstantFP::get(context, APFloat(1.0));
> 31 Value *c2 = ConstantFP::get(context, APFloat(3.0));
> 32 builder.CreateFAdd(c1, c2, "addtmp");
> 33
> 34 builder.CreateCall(putsFunc, helloWorld);
> 35 builder.CreateRetVoid();
> 36 module->dump();
> 37 return 0;
> 38 }
>
> Produces:
>
> ; ModuleID = 'calc'
>
> @0 = private unnamed_addr constant [14 x i8] c"hello world!\0A\00"
>
> define void @main() {
> entrypoint:
> %a = alloca double
> %0 = call i32 @puts(i8* getelementptr inbounds ([14 x i8]* @0, i32 0, i32
> 0))
> ret void
> }
>
> declare i32 @puts(i8*)
>
> Lines 27-32 are the code I have added beyond the demo at the mentioned
> website. As shown, the alloca shows up but no fadd instruction. I would
> appreciate if someone could help me understand this and point out what I am
> missing. Open to reading if someone can point me to more documentation as
> well.
>
> (llvm 3.5 downloaded from llvm.org on OSX)
>
> thanks
> alan
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
More information about the llvm-dev
mailing list