edA-qa mort-ora-y
2012-Nov-02 09:20 UTC
[LLVMdev] Instruction does not dominate all uses! <badref> ??
I'm having trouble figuring out what the error "Instruction does not dominate all uses!" means. I'm trying to construct a call to a function with two parameters. The printed IR, with error, looks like this: define i32 @add(i32, i32) { EntryBlock: %2 = add i32 %0, %1 ret i32 %2 } define i32 @eval_expr() { EntryBlock: ret i32 <badref> } Instruction does not dominate all uses! <badref> = call i32 @add(i32 2, i32 3) ret i32 <badref> And the approximate/simplified code I'm using to generate the call, which would appear at <badref> is: llvm::Value * func = module->getFunction( "add" ); std::vector<llvm::Value*> args; args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( *context ), 2 ) ); args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( *context ), 3 ) ); llvm::ArrayRef<llvm::Value*> ar_args( args ); return llvm::CallInst::Create( func, ar_args ); -- edA-qa mort-ora-y -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Sign: Please digitally sign your emails. Encrypt: I'm also happy to receive encrypted mail. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 259 bytes Desc: OpenPGP digital signature URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121102/a66ba22e/attachment.sig>
Duncan Sands
2012-Nov-02 10:55 UTC
[LLVMdev] Instruction does not dominate all uses! <badref> ??
Hi edA-qa mort-ora-y, On 02/11/12 10:20, edA-qa mort-ora-y wrote:> I'm having trouble figuring out what the error "Instruction does not > dominate all uses!" means. I'm trying to construct a call to a function > with two parameters. The printed IR, with error, looks like this: > > define i32 @add(i32, i32) { > EntryBlock: > %2 = add i32 %0, %1 > ret i32 %2 > } > > define i32 @eval_expr() { > EntryBlock: > ret i32 <badref> > } > > Instruction does not dominate all uses! > <badref> = call i32 @add(i32 2, i32 3) > ret i32 <badref>Looks like you forgot to add the call instruction to EntryBlock.> > > And the approximate/simplified code I'm using to generate the call, > which would appear at <badref> is: > > llvm::Value * func = module->getFunction( "add" ); > > std::vector<llvm::Value*> args; > args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( > *context ), 2 ) ); > args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( > *context ), 3 ) ); > > llvm::ArrayRef<llvm::Value*> ar_args( args ); > return llvm::CallInst::Create( func, ar_args );^ Didn't add it to a basic block. Ciao, Duncan.> > > > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
edA-qa mort-ora-y
2012-Nov-02 11:09 UTC
[LLVMdev] Instruction does not dominate all uses! <badref> ??
On 02/11/12 11:55, Duncan Sands wrote:> Looks like you forgot to add the call instruction to EntryBlock. > ^ Didn't add it to a basic block.I forget to past that part. This is how I add it to a block: auto f = llvm::cast<llvm::Function>( module->getOrInsertFunction( "eval_expr", llvm::Type::getInt32Ty( *context ), (llvm::Type*)0 ) ); auto bb = llvm::BasicBlock::Create( *context, "EntryBlock", f ); llvm::IRBuilder<true,llvm::NoFolder> builder( bb ); builder.CreateRet( expr_i_showed_before ); return f; Or do I have to create another block to do the calls? -- edA-qa mort-ora-y -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Sign: Please digitally sign your emails. Encrypt: I'm also happy to receive encrypted mail. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 259 bytes Desc: OpenPGP digital signature URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121102/e9ee54dd/attachment.sig>
Nick Lewycky
2012-Nov-02 11:16 UTC
[LLVMdev] Instruction does not dominate all uses! <badref> ??
edA-qa mort-ora-y wrote:> I'm having trouble figuring out what the error "Instruction does not > dominate all uses!" means. I'm trying to construct a call to a function > with two parameters. The printed IR, with error, looks like this: > > define i32 @add(i32, i32) { > EntryBlock: > %2 = add i32 %0, %1 > ret i32 %2 > } > > define i32 @eval_expr() { > EntryBlock: > ret i32<badref> > } > > Instruction does not dominate all uses! > <badref> = call i32 @add(i32 2, i32 3) > ret i32<badref>It's correct but not entirely helpful. You've got an instruction in function @eval_expr whose operand is an instruction in an entirely different function (or in no function at all).> And the approximate/simplified code I'm using to generate the call, > which would appear at<badref> is: > > llvm::Value * func = module->getFunction( "add" ); > > std::vector<llvm::Value*> args; > args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( > *context ), 2 ) ); > args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( > *context ), 3 ) ); > > llvm::ArrayRef<llvm::Value*> ar_args( args ); > return llvm::CallInst::Create( func, ar_args );This creates a CallInst but doesn't insert it into any basic block. Nick
edA-qa mort-ora-y
2012-Nov-02 11:51 UTC
[LLVMdev] Instruction does not dominate all uses! <badref> ??
Okay, I've think I understand now. By using a "Value" object (like a function call) in another instruction does nothing more than use a reference to that value. It is still my responsibility to ensure that value/reference is actually created prior to its use in the block. On 02/11/12 12:16, Nick Lewycky wrote:> edA-qa mort-ora-y wrote: >> I'm having trouble figuring out what the error "Instruction does not >> dominate all uses!" means. I'm trying to construct a call to a function >> with two parameters. The printed IR, with error, looks like this: >> >> define i32 @add(i32, i32) { >> EntryBlock: >> %2 = add i32 %0, %1 >> ret i32 %2 >> } >> >> define i32 @eval_expr() { >> EntryBlock: >> ret i32<badref> >> } >> >> Instruction does not dominate all uses! >> <badref> = call i32 @add(i32 2, i32 3) >> ret i32<badref> > > It's correct but not entirely helpful. You've got an instruction in > function @eval_expr whose operand is an instruction in an entirely > different function (or in no function at all). > >> And the approximate/simplified code I'm using to generate the call, >> which would appear at<badref> is: >> >> llvm::Value * func = module->getFunction( "add" ); >> >> std::vector<llvm::Value*> args; >> args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( >> *context ), 2 ) ); >> args.push_back( llvm::ConstantInt::get( llvm::Type::getInt32Ty( >> *context ), 3 ) ); >> >> llvm::ArrayRef<llvm::Value*> ar_args( args ); >> return llvm::CallInst::Create( func, ar_args ); > > This creates a CallInst but doesn't insert it into any basic block. > > Nick > >-- edA-qa mort-ora-y -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Sign: Please digitally sign your emails. Encrypt: I'm also happy to receive encrypted mail. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 259 bytes Desc: OpenPGP digital signature URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121102/cfd0bd21/attachment.sig>
Reasonably Related Threads
- [LLVMdev] Instruction does not dominate all uses! <badref> ??
- [LLVMdev] Instruction does not dominate all uses! <badref> ??
- [LLVMdev] Instruction does not dominate all uses! <badref> ??
- [LLVMdev] <badref> showed up when duplicating a list of dependent instructions
- [LLVMdev] <badref> showed up when duplicating a list of dependent instructions