[llvm-dev] Commit module to Git after each Pass

Fedor Sergeev via llvm-dev llvm-dev at lists.llvm.org
Wed Mar 21 03:08:03 PDT 2018


On 03/16/2018 01:21 AM, Fedor Sergeev via llvm-dev wrote:
 > git-commit-after-all solution has one serious issue - it has a 
hardcoded git handling which
 > makes it look problematic from many angles (picking a proper git,
 > selecting exact way of storing information, creating repository, 
replacing the file etc etc).
 >
 > Just dumping information in a way that allows easy subsequent machine 
processing
 > seems to be a more flexible, less cluttered and overall clean 
solution that allows to avoid
 > making any of "user interface" decisions mentioned above.
 >
 > We need to understand why git-commit-after-all works faster than 
print-after-all.
Made an interesting experiment today and extended your 
git-commit-after-all to avoid issuing
any git commands if git-repo starts with "/dev/".

With git-repo=/dev/stderr it becomes functionally equivalent to 
print-after-all+print-module-scope,
dumping module into stderr after each pass.

On my testcase:

# first normal git-commit-after-all execution
] rm -rf test-git; time $RR/bin/opt -O1 some-ir.ll -disable-output 
-git-commit-after-all -git-repo=./test-git

real    0m7.172s
user    0m6.303s
sys     0m0.902s
# then "printing" git-commit-after-all execution
] time $RR/bin/opt -O1 some-ir.ll -disable-output -git-commit-after-all 
-git-repo=/dev/stderr 2>&1 | grep -c '^; ModuleID'
615

real    0m2.893s
user    0m2.859s
sys     0m0.356s
# and finally print-after-all
] time $RR/bin/opt -O1 some-ir.ll -disable-output -print-after-all 
-print-module-scope 2>&1 | grep -c "^; ModuleID"
526

real    2m8.024s
user    0m55.933s
sys     3m19.253s
]
Ugh... 60x???
Now, I'm set to analyze this astonishing difference that threatens my 
sanity (while I'm still sane ... hopefully).

regards,
   Fedor.
PS btw, I checked /dev/null - and it works faster than /dev/stderr as 
expected :)

 > I dont believe in magic... yet :)
 >
 > And, btw, thanks for both the idea and the patch.
 >
 > regards,
 >   Fedor.
 >
 > On 03/16/2018 12:03 AM, Alexandre Isoard wrote:
 >> If this is faster than -print-after-all we may actually consider 
pushing that in the code base then? (after diligent code review of course)
 >>
 >> Note that it uses the same printing method as -print-after-all:
 >> - create a pass of the same pass kind as the pass we just ran
 >> - use Module::print(raw_ostream) to print (except -print-after-all 
only print the concerned part and into stdout)
 >>
 >> If there is improvement to be done to print-after-all it might also 
improve git-commit-after-all. (unless that only improve speed when 
printing constructs smaller than module)
 >>
 >> In any case, it is, to me, much more usable (and extensible) than 
-print-after-all. But requires git to be in PATH (I'm curious if that 
works on Windows).
 >>
 >> On Thu, Mar 15, 2018 at 1:35 PM, Daniel Sanders 
<daniel_l_sanders at apple.com> wrote:
 >>
 >>     Does https://reviews.llvm.org/D44132 help at all?
 >>
 >>
 >>>     On 15 Mar 2018, at 09:16, Philip Reames via llvm-dev 
<llvm-dev at lists.llvm.org> wrote:
 >>>
 >>>     The most likely answer is that the printer used by 
print-after-all is slow.  I know there were some changes made around 
passing in some form of state cache (metadata related?) and that running 
printers without doing so work, but are dog slow.  I suspect the 
print-after-all support was never updated.  Look at what we do for the 
normal IR emission "-S" and see if print-after-all is out of sync.
 >>>
 >>>     Philip
 >>>
 >>>     On 03/15/2018 08:45 AM, Alexandre Isoard via llvm-dev wrote:
 >>>>     Huh. Great! 😁
 >>>>
 >>>>     I don't believe my poor excuse from earlier (else we should 
map all pipes into files!), but I'm curious why we spend less time in 
system mode when going through file than pipe. Maybe /dev/null is not as 
efficient as we might think? I can't believe I'm saying that...
 >>>>
 >>>>     On Thu, Mar 15, 2018, 08:25 Fedor Sergeev 
<fedor.sergeev at azul.com> wrote:
 >>>>
 >>>>         Well, git by itself is so focused on performance, so its 
not surprising
 >>>>         to me that even using git add/git commit does not cause
 >>>>         performance penalties.
 >>>>
 >>>>
 >>>>     Sure, but still, I write more stuff (entire module) into a 
slower destination (file). Even ignoring git execution time it's counter 
intuitive.
 >>>>
 >>>>     The only difference is that while I write more, it overwrite 
itself continuously, instead of being a long linear steam. I was 
thinking of mmap the file instead of going through our raw_stream, but 
maybe that's unnecessary then...
 >>>>
 >>>>
 >>>>
 >>>>     _______________________________________________
 >>>>     LLVM Developers mailing list
 >>>>     llvm-dev at lists.llvm.org
 >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
 >>>
 >>>     _______________________________________________
 >>>     LLVM Developers mailing list
 >>>     llvm-dev at lists.llvm.org
 >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
 >>
 >>
 >>
 >>
 >> --
 >> Alexandre Isoard
 >
 >
 >
 > _______________________________________________
 > LLVM Developers mailing list
 > llvm-dev at lists.llvm.org
 > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev




More information about the llvm-dev mailing list