Hi Erik,

Thanks for your advice!

> On Sep 7, 2016, at 12:53 PM, Erik Eckstein <eeckst...@apple.com> wrote:
> 
> Hi Vedant,
> 
> nice work!
> 
>> On Sep 6, 2016, at 12:36 PM, Vedant Kumar via swift-dev 
>> <swift-dev@swift.org> wrote:
>> 
>> Hi swift-dev,
>> 
>> I've been working on some patches which add basic support for PGO to swift 
>> [1].
>> What I have so far is just a proof-of-concept. I'd like to get some feedback 
>> on
>> the approach I've taken.
>> 
>> I've added support for loading profile data, matching up execution counts to
>> the right parts of the AST, and attaching those execution counts to 
>> conditional
>> branches. I added two fields to CondBranchInst (in SIL):
>> 
>> /// The number of times the True branch was executed.
>> Optional<uint64_t> TrueBBCount;
>> 
>> /// The number of times the False branch was executed.
>> Optional<uint64_t> FalseBBCount;
>> 
>> I fixed up the SILCloner and a few other sites where conditional branches are
>> created to propagate the branch taken counts. I have a patch to propagate
>> branch taken counts through the SILOptimizer, but I didn't include it in [1]
>> because I don't know how to write tests for it.
>> 
>> In IRGen, I added some logic to scale execution counts and create llvm
>> branch_weight metadata.
>> 
>> Some questions:
>> 
>> 1. Is it acceptable to make some SIL objects larger in order to store
>>    execution counts (e.g CondBranchInst)?
> 
> Yes, I don’t see a problem with that.
> But for saving some space, you might want to store the counts as a plain 
> uint64_t instead of an Optional and use a special value (e.g. ~0) for the 
> none-case.

Right, this makes sense. Reserving that value should be fine, since it looks
like llvm expects weights to be scaled below UINT32_MAX.


>> If not, what's the best way to make
>>    this information visible to SILOptimizer and IRGen?
>> 
>> 2. Is it better to associate counts with SIL instructions, or with
>>    SILSuccessor?
> 
> I think storing the counts in SILSuccessor makes sense, because counts are 
> needed for all kind of terminator instructions (like switch_enum), except for 
> the unconditional br, but IMO we can live with wasting some bytes for this 
> instructions.

Storing counts in SILSuccessor has pros and cons, like you mentioned. It may
lead to wasted space in some cases, but would require fewer invasive API
changes to implement.


> Another thing to consider is that the count information should be 
> printed/parsed/serialized when writing and reading SIL.

Yes! I jotted these down as "TODO's" in my commit messages.


>> 3. Does anyone have tips on modifying swift/benchmark? I'd like to add a
>>    benchmark driver which generates profile data, and another driver which
>>    uses that data to turn on PGO.

I still need to work out how to configure swift/benchmark.

At any rate, I'm going to start gradually cleaning up these patches and
submitting PR's. I expect swift to support frontend-based PGO in the future,
but if it doesn't, some of these patches will still be useful. I'd rather have
them in-tree than let them bitrot.

Here's the first one:

    https://github.com/apple/swift/pull/4675

Reviews appreciated :).

best,
vedant


>> 
>> thanks,
>> vedant
>> 
>> [1] https://github.com/vedantk/swift/tree/profile_use
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev
> 

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to