[LLVMdev] Q: When is a boolean not a boolean?

Nick Lewycky nicholas at mxc.ca
Mon May 13 12:23:16 PDT 2013


Jeremy Lakeman wrote:
> A: When the types are created in different contexts.
>
> I've been running into a module validation error related to phi nodes
> produced by the GVN pass, where the types of the incoming values aren't
> the same instance of IntegerType i1.
>
> I'm not certain I've found the root cause of the problem yet, it's
> probably due to my handling of LLVMContext & Module life cycles, and
> this is my first real look at llvm's source.
>
> This patch at least makes my problem go away;
>
> @@ -2195,11 +2200,11 @@ bool GVN::processInstruction(Instruction *I) {
>       BasicBlock *Parent = BI->getParent();
>       bool Changed = false;
>
> -    Value *TrueVal = ConstantInt::getTrue(TrueSucc->getContext());
> +    Value *TrueVal = ConstantInt::getTrue(BranchCond->getContext());
>       BasicBlockEdge TrueE(Parent, TrueSucc);
>       Changed |= propagateEquality(BranchCond, TrueVal, TrueE);
>
> -    Value *FalseVal = ConstantInt::getFalse(FalseSucc->getContext());
> +    Value *FalseVal = ConstantInt::getFalse(BranchCond->getContext());
>       BasicBlockEdge FalseE(Parent, FalseSucc);
>       Changed |= propagateEquality(BranchCond, FalseVal, FalseE);
>
> Any other ideas about where I should look for the root problem? Is there
> any better documentation on how to deal with multiple LLVMContext instances?
>
> I'm primarily creating multiple contexts to make sure my named
> structures aren't renamed during linking.

The purpose of LLVM contexts is to keep two separate users of LLVM 
entirely separate within the process space. Consider a program that uses 
an OpenGL library which uses LLVM under the hood, and also uses a sound 
library which uses LLVM under the hood. Those two libraries should each 
have their own LLVMContext in order to ensure that they don't interfere 
with each other.

If you've created IR with two different contexts, they are not allowed 
to comingle in any way whatsoever.

Could you elaborate on the named structures problem? If you link two 
modules containing identified structures, they shouldn't get renamed 
unless their contents are different (where inner identified structs with 
the same name are again considered equal).

Nick



More information about the llvm-dev mailing list