[PATCH] D29854: WholeProgramDevirt: Implement importing for uniform ret val opt.

Teresa Johnson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 8 17:13:40 PST 2017


tejohnson accepted this revision.
tejohnson added a comment.
This revision is now accepted and ready to land.

LGTM, with comment added on test as suggested below.



================
Comment at: llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp:1078
+    auto &ResByArg = I->second;
+    // FIXME: We should figure out what to do about the "function name" argument
+    // to the apply* functions, as the function names are unavailable during the
----------------
pcc wrote:
> tejohnson wrote:
> > pcc wrote:
> > > tejohnson wrote:
> > > > The function name should be available for each CallSite in each VirtualCallSite on the CSInfo.CallSites. But would the call sites be from more than one function?
> > > These are not the names of the functions containing the call sites but rather the names of the virtual functions being called.
> > > 
> > > I think we'll probably want to somehow move these remarks into the exporting phase as well.
> > Actually, looking at the code I don't understand why we wouldn't be emitting a remark during the exporting phase. DevirtModule::tryUniformRetValOpt will set WasDevirt to true for each Target. That in turn is invoked from tryVirtualConstProp in run() in the part executed on the Export & regular LTO paths, which should cause the function to be added to DevirtTargets for which remarks are emitted.
> > 
> > What's the difference between the remarks emitted for this case in run(), and the ones issued from within applyUniformRetValOpt?
> I believe that there are two separate kinds of remarks.
> 1. http://llvm-cs.pcc.me.uk/lib/Transforms/IPO/WholeProgramDevirt.cpp#280
> 2. http://llvm-cs.pcc.me.uk/lib/Transforms/IPO/WholeProgramDevirt.cpp#1221
> The first is per call site and mentions the name of one possible target of the virtual call (arbitrarily chosen), and the other is per virtual function and mentions whether any calls to that function have been devirtualized. With this code we will emit the second type of remark during the exporting phase, and the first (with the arbitrary target name missing) during the importing phase.
> 
> (@krasin was the original author of the remark code.)
Yes looks like it. We probably couldn't move the per call site remarks to the exporting side then, but would need more info here to get the name of a targets emitted. Looks like we also emit both remark kinds for applySingleImplDevirt, but there we already have the function name on the importing side.


================
Comment at: llvm/test/Transforms/WholeProgramDevirt/import.ll:37
   ; SINGLE-IMPL: call i1 bitcast (void ()* @singleimpl2 to i1 (i8*, i32)*)
+  ; UNIFORM-RET-VAL: call i1 %
   %result = call i1 %fptr_casted(i8* %obj, i32 undef)
----------------
Comment on why we can't do the optimization here (I see UniformRetVal listed for typeid2 in the yaml file, but I'm probably misunderstanding how that is applied).


https://reviews.llvm.org/D29854





More information about the llvm-commits mailing list