[cfe-dev] Why Clang is yielding different LLVM IR return type for the same function

John McCall via cfe-dev cfe-dev at lists.llvm.org
Mon Jul 2 21:23:01 PDT 2018


> On Jul 2, 2018, at 11:48 PM, Zhang via cfe-dev <cfe-dev at lists.llvm.org> wrote:
> Hi:
> So I have a library function called fooo() in a source file B.c and an external A.c file that is referencing a function fooo() in it.
> foo is returning a pointer to a structure
> 
> A.ll:
> %struct._bar= type { %struct._foo, i32, i32 (%struct.doo*, %struct.doo*, %struct.doo*)* }
> declare i8* @fooo() #2
> 
> B.ll:
> %struct._bar= type { %struct._foo, i32, i32 (%struct.doo*, %struct.doo*, %struct.doo*)* }
> define noalias %struct._bar* @fooo() #2{
>    ..........
> }
> 
> 
> I am implementing a transform pass that operates on the merged version of A.ll and B.ll , since they have different implementations llvm-link is inserting extra bitcasts and thus various passes failed to operate, for example the Inliner pass.
> Is there anything else I could do to achieve what I need? Cheers

I wouldn't expect a bitcast to block inlining.  It's hard to say why Clang is generating different code here.

John.



More information about the cfe-dev mailing list