[LLVMdev] [Proposal] Parallelize post-IPO stage.

Shuxin Yang shuxin.llvm at gmail.com
Wed Jul 17 17:03:23 PDT 2013

On 7/17/13 4:53 PM, Nick Kledzik wrote:
> On Jul 17, 2013, at 4:29 PM, Shuxin Yang <shuxin.llvm at gmail.com 
> <mailto:shuxin.llvm at gmail.com>> wrote:
>> On 7/17/13 4:12 PM, Nick Kledzik wrote:
>>> On Jul 14, 2013, at 7:07 PM, Andrew Trick <atrick at apple.com 
>>> <mailto:atrick at apple.com>> wrote:
>>>> The partitioning should be deterministic. It’s just that the linker 
>>>> output now depends on the partitioning heuristics. As long that 
>>>> decision is based on the input (not the host system), then it still 
>>>> meets Eric’s requirements. I just think it’s unfortunate that 
>>>> post-IPO partitioning (or more generally, parallel codegen) affects 
>>>> the output, but may be hard to avoid. It would be nice to be able 
>>>> to tune the partitioning for compile time without worrying about 
>>>> code quality.
>>> I also want to chime in on the importance of stable binary outputs. 
>>>  And not just same compiler and same sources produces same binary, 
>>> but that minor changes to either should cause minor changes to the 
>>> output binary.   For software updates, Apple updater tries to 
>>> download only the delta to the binaries, so we want those to be as 
>>> small as possible.  In addition, it often happens late in an OS 
>>> release cycle that some critical bug is found and the fix is in the 
>>> compiler.  To qualify it, we rebuild the whole OS with the new 
>>> compiler, then compare all the binaries in the OS, making sure only 
>>> things related to the bug are changed.
>> We can view partitioning as a "transformation".  Unless the 
>> transformation is absolutely no-op,
>> it will change something.   If we care the consistency in binaries, 
>> we either consistently use partition
>> or consistently not use partition.
> But doesn’t "consistently not use partition” mean “don’t use the 
> optimization you are working on”?

>   Isn’t there someone to get the same output no matter how it is 
> partitioned?
No.  Just like "cc --without-inline" and "cc --with-inline" yields diff 

>>>>  The compiler used to generate a single object file from the merged
>>>> IR, now it will generate multiple of them, one for each partition.
>>> I have not studied the MC interface, but why does each partition 
>>> need to generate a separate object file?  Why can’t the first 
>>> partition done create an object file, and as other partitions 
>>> finish, they just append to that object file?
>> We could append the object files as an alternative.
>> However, how do we know the /path/to/ld from the existing interface ABIs?
>> How do we know the flags feed to the ld (more often than not, "-r" 
>> alone is enough,
>> but some linkers may need more).
>> In my rudimentary implement, I hack by hardcoding to /usr/bin/ld.
>> I think adding object one by one back to the linker is better as the 
>> linker already have
>> enough information.
> I think you missed my point, or you are really thinking from the 
> multi-process point of view.   In LLVM there is an MCWriter used to 
> produce object files.   Your model is that if there are three 
> partitions, then there will be three MCWriter objects, each producing 
> an object file.  What I am saying is to have only one MCWriter object 
> and have all three partitions stream their content out through the one 
> MCWriter, producing one object file.
No, I don't want to sync all threads at this point. It make things all 
the more complex.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130717/c8834b57/attachment.html>

More information about the llvm-dev mailing list