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

Zhang via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 2 22:29:05 PDT 2018


Hi John.
Thanks for the info. Currently I'm marking fooo() by hand by adding the always_inline attribute then run the always inline pass using the following code:


```
AnalysisManager<Module> AM;
AlwaysInlinerPass* InlinerPass=cast<AlwaysInlinerPass>(createAlwaysInlinerLegacyPass());
InlinerPass->run(M,AM);
delete InlinerPass;

```
However the CallSites are not inlined. 
Reading lib/Transforms/IPO/AlwaysInliner.cpp , it says `` if (CS.getCalledFunction() == &F)`` , since after linking the CallSites become indirect calls with Bitcast ConstantExpr as target I think that's why the inliner has no effect.
Any hints?

 
 
------------------ Original ------------------
From:  "John McCall"<rjmccall at apple.com>;
Date:  Tue, Jul 3, 2018 12:23 PM
To:  "Zhang"<admin at mayuyu.io>; 
Cc:  "cfe-dev"<cfe-dev at lists.llvm.org>; "llvm-dev"<llvm-dev at lists.llvm.org>; 
Subject:  Re: [cfe-dev] Why Clang is yielding different LLVM IR return type forthe same function

 
> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180703/ee07edc5/attachment.html>


More information about the llvm-dev mailing list