<div dir="ltr">Hi Nick,<br><br>What you said makes sense, but it's not called a call graph. :)<br>You're essentially referring to what LoopInfo does which makes sense, but as I mentioned earlier, this is already done<br>in the LoopInfo. Now, how much one will be able to use it in a LoopNestPass is another issue, which is certainly<br>something that mentors could help you with.<br><br>Best,<br>Stefanos</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Στις Τρί, 17 Μαρ 2020 στις 3:35 μ.μ., ο/η Nicholas Krause <<a href="mailto:xerofoify@gmail.com">xerofoify@gmail.com</a>> έγραψε:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div>
    <br>
    <br>
    <div>On 3/17/20 9:23 AM, Stefanos Baziotis
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">> Yes that's correct.<br>
        Well, now that I saw the LoopNestAnalysis* files, they try to do
        sth similar. So, I hope it helped.<br>
        <br>
        > My idea was similar but using the call graph directly<br>
        <br>
        Personally I don't see how the call graph can help you, since
        well... it's a call graph. :)<br>
      </div>
    </blockquote>
    Not directly but you can could implement a call graph for the loops
    internal to a function and walk up <br>
    it backwards. In addition you could make it possible to implement
    this call graph to know the number<br>
    of loops nested and pop out to the outermost as a function.
    Basically SCC for loops themselves rather<br>
    than functions.<br>
    <br>
    That's probably beyond the scope of the project so your right it
    doesn't matter for this,<br>
    Nick<br>
    <blockquote type="cite">
      <div dir="ltr">You care about loops in a specific function. What
        can help you is the Control-Flow graph, which is basically what
        LoopInfo uses to identify loops in a function.<br>
        But because of that, loop identification is not your problem,
        loop traversing is, if I understand it correctly.<br>
        Although you have to do things similar to loop identification
        (i.e. what LoopInfo does) when trying to<br>
        decide for perfect nestings etc.<br>
        <br>
        Best,<br>
        Stefanos<br>
        <br>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">Στις Τρί, 17 Μαρ 2020 στις
          3:08 μ.μ., ο/η Nicholas Krause <<a href="mailto:xerofoify@gmail.com" target="_blank">xerofoify@gmail.com</a>>
          έγραψε:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div> <br>
            <br>
            <div>On 3/16/20 11:41 PM, Stefanos Baziotis wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">Hi everyone,<br>
                <br>
                >  I probably do not have the time to get a patch
                through.<br>
                IMHO, you do. :)<br>
                <br>
                First of all, @Benson sorry but I'm not at all familiar
                with LLDB so I can't help there.<br>
                <br>
                Other than that, I'll also disappoint you both probably
                because I'm not that familiar with the creation of
                passes and the problem at hand. I'll try to help as I
                can.<br>
                <br>
                > <span style="color:rgb(0,0,0);font-family:Arial;font-size:14.6667px;white-space:pre-wrap">Is there a specific section of the dragon book that I should read so that I can at least understand theoretically what it means to create a LoopNestPass?
As I can understand, no because it's more of a structural, LLVM-specific problem than a generic, compiler optimization problem.

> </span>Stefanos can speak to this more but in order to create a
                LoopNestPass after reading what they are talking about
                requires information from the call graph<br>
                > for a function or the loop hierarchy in LLVM IR.
                I'm not sure of the internal classes for this so
                Stefanos is there a way currently to get the info in IR
                about<br>
                > the outer loop or from the call graph? That seems
                to be the biggest problem getting the outer loop in the
                IR or the call graph. After that you would<br>
                > basically check if the loop is the outer loop and
                if so you can add dynamically to the pipeline.<br>
                <br>
                I'm not sure I followed you here. First of all, if you
                create a regular LoopPass, you'll visit loops from the
                innermost to the outermost. In the loop nest pass<br>
                you want the outermost though, so you'll have to visit
                them all until you there. Now if you do it in a function
                pass, you lose the ability to put loops<br>
                back into the pipeline, as this is how the function pass
                works. So, the way I understand it, to solve that
                problem, one would create something like a function<br>
                pass, figure out the loops there (i.e. with LoopInfo),
                then convert it to LoopPass so that you can run loop
                passes over the loops.<br>
                I think this can happen already, but right now, loops
                are going in reverse order: <a href="https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h#L230" target="_blank">https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h#L230</a><br>
                So, maybe if you could modify that to something like
                FunctionToLestNestPassAdaptor, it would work? I don't
                know that's just an idea, let me not confuse you more.<br>
                <br>
                Best,<br>
                Stefanos</div>
            </blockquote>
            Yes that's correct. My idea was similar but using the call
            graph directly. The other problem is how to keep LCSSA form
            for all the loops as well and I'm<br>
            aware that function passes don't care about that.  So you
            can't really convert to a function pass itself but something
            similar.<br>
            <br>
            Nick<br>
            <blockquote type="cite">
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">Στις Δευ, 16 Μαρ 2020
                  στις 5:53 π.μ., ο/η Nicholas Krause <<a href="mailto:xerofoify@gmail.com" target="_blank">xerofoify@gmail.com</a>>
                  έγραψε:<br>
                </div>
                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                  <div> <br>
                    <br>
                    <div>On 3/15/20 11:12 PM, Benson Bin Bin Li via
                      llvm-dev wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">
                        <div>Hi Stefanos,</div>
                        <div><br>
                        </div>
                        <div>First, thanks a lot for the very detailed
                          response! I watched both of the videos, and I
                          seem to have a rough idea now of how each of
                          the different pieces of software maps onto the
                          compilation process. Though I found blogs such
                          as these two: <a href="https://jonasdevlieghere.com/understanding-the-clang-ast/" target="_blank">https://jonasdevlieghere.com/understanding-the-clang-ast/</a>,
                          <a href="https://releases.llvm.org/2.6/docs/tutorial/JITTutorial1.html" target="_blank">https://releases.llvm.org/2.6/docs/tutorial/JITTutorial1.html</a>
                          to be better for a more in-depth
                          understanding. Anyways, in response to your
                          answers:</div>
                        <div><br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div>The latter can even be problematic if you
                            start applying C++ craziness while the first
                            is pretty much always needed when working in
                            a team project.</div>
                        </blockquote>
                        <div>Ok, that makes sense as you would want the
                          style to be consistent throughout. <br>
                        </div>
                        <div><br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div>running the LLVM suite is super easy</div>
                        </blockquote>
                        <div>Yeah, everything went fine from following
                          your instructions. I do have a question
                          though: How do I diagnose failed tests? I
                          found the files that correspond to them, and
                          they seem to be 1 line scripts rather than
                          "code" per say.  <br>
                        </div>
                        <div><br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div> But I think every good GSoC proposal
                            includes a biography-like section</div>
                        </blockquote>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div>Then, try to study it, understand the
                            context and the problem. <br>
                          </div>
                        </blockquote>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div>But because submitting good patches is
                            one of the best indicators  <br>
                          </div>
                        </blockquote>
                        <div>Ok, so for the application process,
                          basically try to get more info on the projects
                          I am interested in and from there submit a
                          proposal? Given the whole coronavirus
                          situation and the time remaining for the
                          application, I probably do not have the time
                          to get a patch through. Regarding the projects
                          I am interested in, I have narrowed it down to
                          two(mostly because I don't think I have the
                          ability to tackle PostDominatorTree project as
                          of now), and have the following questions
                          about them:</div>
                        <div><br>
                        </div>
                        <div>
                          <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt" id="gmail-m_-760413992732672551gmail-m_-1000483654617762840gmail-m_8480675998277982117gmail-docs-internal-guid-48482a0b-7fff-e7f0-4627-fb046bcc2e7f"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap">LLVM Pass</span></p>
                          <ol style="margin-top:0px;margin-bottom:0px">
                            <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">I am following the guide to create a LLVM pass following this guide(<a href="https://llvm.org/docs/WritingAnLLVMPass.html" target="_blank">https://llvm.org/docs/WritingAnLLVMPass.html</a>), but it appears “add_llvm_library” is a macro and not a built-in command. So I have two questions. 1) In comparing the online repo I found this macro in and my local, it appears I don’t have the file. Do I need to build it then? 2) How do I tell CMake to look for this macro?</span></p></li>
                            <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Is there a specific section of the dragon book that I should read so that I can at least understand theoretically what it means to create a LoopNestPass?</span></p></li>
                          </ol>
                        </div>
                      </div>
                    </blockquote>
                    Stefanos can speak to this more but in order to
                    create a LoopNestPass after reading what they are
                    talking about requires information from the call
                    graph<br>
                    for a function or the loop hierarchy in LLVM IR. I'm
                    not sure of the internal classes for this so
                    Stefanos is there a way currently to get the info in
                    IR about<br>
                    the outer loop or from the call graph? That seems to
                    be the biggest problem getting the outer loop in the
                    IR or the call graph. After that you would<br>
                    basically check if the loop is the outer loop and if
                    so you can add dynamically to the pipeline. <br>
                    <br>
                    Sorry if I'm not much help as I'm not sure if the
                    call graph API supports this but I'm pretty sure
                    LLVM IR doesn't make this easy,<br>
                    Nick<br>
                    <blockquote type="cite">
                      <div dir="ltr">
                        <div><br>
                          <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap">LLDB Tab Completion</span></p>
                          <ol style="margin-top:0px;margin-bottom:0px">
                            <li style="list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><p style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Is there any resource I can read that explains how lldb is able to “pause” the executable and map it to a certain line in the source file/in general how lldb represents the state of the executable?</span></p></li>
                            <li style="list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><p style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Where in the source code can I go to see how existing tab completions are implemented?</span></p></li>
                            <li style="list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">I built lldb and check-lldb, but it seems that the call path to clang got messed up, as it is trying to call "Example=Code/llvm-project" rather than my actual name for the directory "Example-Code/llvm-project". Should I just clone the repo into a parent directory that doesn't use hyphen?
</span></li>
                          </ol>
                        </div>
                        <div><br>
                        </div>
                        <div>(Would it be better if I posted this on the
                          forum?)</div>
                        <div><br>
                        </div>
                        <div>Best regards,</div>
                        <div>Benson<br>
                        </div>
                        <div><br>
                        </div>
                      </div>
                      <br>
                      <div class="gmail_quote">
                        <div dir="ltr" class="gmail_attr">On Sat, Mar
                          14, 2020 at 11:10 AM Stefanos Baziotis <<a href="mailto:stefanos.baziotis@gmail.com" target="_blank">stefanos.baziotis@gmail.com</a>>
                          wrote:<br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div dir="ltr">Hi Benson,<br>
                            <br>
                            You're welcome to the LLVM community!<br>
                            <br>
                            I'll try to help but note that I'm no formal
                            position to talk about how LLVM decides
                            about GSoC (I'm a LLVM newcomer anyway).<br>
                            With that said, the rest is _my_ opinion
                            which is partially formed from my experience
                            as a GSoC student.<br>
                            <br>
                            > <span style="color:rgb(0,0,0);font-family:Arial;font-size:14.6667px;white-space:pre-wrap">But to be up front about this, I have not done any full scale C++ project
</span><br>
                            Depending on how you define "full-scale", a
                            lot of amazing LLVM contributors have not
                            done a full-scale C++. So, I think no
                            problem there, it's just good to have a
                            relatively good knowledge of C++.<br>
                            Talking about C++ skills, I think they're
                            more important if you want to contribute to
                            Clang than say LLVM middle or back-end.
                            Because for Clang, you have to know a lot of
                            details of the language<br>
                            in order to parse it, type-check it and
                            generate LLVM IR. In most other parts of
                            LLVM, you're only using the language.<br>
                            As a matter of fact, if you have a good
                            knowledge of C++, I believe it's more
                            important to be able to understand and adapt
                            to "nearby" code, than to be an expert in
                            C++.<br>
                            The latter can even be problematic if you
                            start applying C++ craziness while the first
                            is pretty much always needed when working in
                            a team project.<br>
                            <br>
                            > <span style="color:rgb(0,0,0);font-family:Arial;font-size:14.6667px;white-space:pre-wrap">1. Do I need to submit a resume/screening/patches? 
</span><br>
                            As far as the resume, in the way that you
                            may usually apply to jobs, no. But I think
                            every good GSoC proposal includes a
                            biography-like section<br>
                            where you basically tell your story in
                            programming and how you fit into the project
                            (in our case, LLVM).<br>
                            <br>
                            I'm not sure what you mean by screening.<br>
                            <br>
                            As for patches, I don't think they're
                            required but they're super useful. Not
                            because they're some part of unrelated
                            logistics (like "you have to have X patches
                            to be considered").<br>
                            But because submitting good patches is one
                            of the best indicators (if not the best)
                            that you are able to do useful work in this
                            project. :)<br>
                            And they don't only show your technical
                            skills. But also communication skills,
                            independence etc.<br>
                            <br>
                            > 2. <span style="color:rgb(0,0,0);font-family:Arial;font-size:14.6667px;white-space:pre-wrap">Although I do have interests in certain projects posted on you website(Implement missing tab completion, createLoopPass, and PostDominatorTree), I am uncertain if I have enough expertise to decide what would be an appropriate project to contribute to given my current knowledge and experience.
</span><br>
                            This is kind of a generic sentence.<br>
                            I'd say, start with finding a project that
                            you're truly interested in. Then, try to
                            study it, understand the context and the
                            problem.<br>
                            You don't need to get very far, that's
                            totally ok. You can then do a post (either
                            here or on Discourse: <a href="https://llvm.discourse.group/c/community/gsoc/32" target="_blank">https://llvm.discourse.group/c/community/gsoc/32</a>)<br>
                            for this specific project (you can do posts
                            for multiple projects).<br>
                            Hopefully, by discussing with people (and
                            mentors) and understanding what the project
                            is asking better,<br>
                            you can find if you want to do it or not.
                            Certainly, the mentors of the project can
                            guide you through.<br>
                            <br>
                            <span style="color:rgb(0,0,0);font-family:Arial;font-size:14.6667px;white-space:pre-wrap">3. The GCC GSoC website suggested checking out their source code, compiling and running their test suite. Can I do something similar for LLVM?
</span><br>
                            Yes, totally. I'm not familiar with GCC
                            internals but running the LLVM suite is
                            super easy (so easy that you don't really
                            learn anything by doing it :P )<br>
                            So, the LLVM project has moved to a common
                            repository: <a href="https://github.com/llvm/llvm-project" target="_blank">https://github.com/llvm/llvm-project</a><br>
                            You can clone the project and then use CMake
                            to build it. The cmake configuration for
                            LLVM has a bunch of flags: <a href="https://llvm.org/docs/CMake.html" target="_blank">https://llvm.org/docs/CMake.html</a><br>
                            and you may get lost. So, I'll say start
                            simple:<br>
                            Go to the llvm-project dir (the one you
                            cloned) and do:<br>
                            cmake ./llvm -DLLVM_ENABLE_PROJECTS="clang"
                            -DCMAKE_BUILD_TYPE=Release
                            -DLLVM_ENABLE_ASSERTIONS=ON
                            -DLLVM_TARGETS_TO_BUILD="X86"<br>
                            <br>
                            In the link above you can read what the
                            flags do. llvm middle / back-end (i.e. opt /
                            llc, ask if you don't know what these mean)
                            is always built. But to build clang<br>
                            we have to enable it explicitly. We set
                            build type to release because doing a debug
                            build will take a lot of time and a lot of
                            space. Also, when starting out,<br>
                            you probably don't need it. We enable
                            assertions mostly because you can use the
                            -debug option say in opt and see debug
                            prints.<br>
                            Finally, we only build for x86 arch because
                            that's probably what you have and you don't
                            need any other for now.<br>
                            <br>
                            Hit enter and once the configuration is
                            complete you can do:<br>
                            make<br>
                            or<br>
                            make -j<number of threads>    <--
                            this is faster but limit it depending on
                            your systemS<br>
                            <br>
                            When that's finished, the llvm-project/bin/
                            dir will have executables like clang,
                            clang++, opt, llc etc.<br>
                            Which you can run (also ask if you don't
                            know what to do with them. With clang you
                            probably will know, it's like invoking<br>
                            most compilers like gcc to compile .c / .cpp
                            files).<br>
                            <br>
                            To run the test suite, you can go to
                            llvm-project/llvm/test and do:<br>
                            <dir of llvm-project>/bin/llvm-lit .<br>
                            That will run only llvm's test suite but
                            you'll get an idea.<br>
                            <br>
                            Also, you can watch these videos:<br>
                            <a href="https://www.youtube.com/watch?v=J5xExRGaIIY" target="_blank">https://www.youtube.com/watch?v=J5xExRGaIIY</a><br>
                            <a href="https://www.youtube.com/watch?v=5kkMpJpIGYU" target="_blank">https://www.youtube.com/watch?v=5kkMpJpIGYU</a><br>
                            <br>
                            Hope this helped!<br>
                            <br>
                            Kind regards,<br>
                            Stefanos Baziotis</div>
                          <br>
                          <div class="gmail_quote">
                            <div dir="ltr" class="gmail_attr">Στις Σάβ,
                              14 Μαρ 2020 στις 2:04 π.μ., ο/η Benson Bin
                              Bin Li via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>
                              έγραψε:<br>
                            </div>
                            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                              <div dir="ltr">
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt" id="gmail-m_-760413992732672551gmail-m_-1000483654617762840gmail-m_8480675998277982117gmail-m_-4313643294865233574gmail-m_-8466928840379538763gmail-docs-internal-guid-2a0d31dc-7fff-9297-e699-ad2df8792b10"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Dear LLVM Team,</span></p>
                                <br>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">I would like to contribute to/participate in LLVM’s GSOC, because I would very much like to combine my knowledge of graph theory/algorithms and my interest in C++ together. Contributing to the LLVM code seems like a fantastic challenge and learning experience for these two interests of mine, as well as computer science in general (For example, the use of a new syntactic category to disambiguate a grammar demonstrates 1) indirection 2) the power of naming things).</span></p>
                                <br>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">But to be up front about this, I have not done any full scale C++ project(Although we had to modify the Linux kernel in my OS class, that was in C). However, I do believe my C++ skills are at an intermediate level, as C++, like Python, is a language in which I will spend my free time learning more about. Like vim, there is always more to learn in C++, and to that end I will watch CppCon Videos or peruse blogs such as Fluent C++(which is a treasure trove of material to nerd out on) in my free time. I also have a layman’s knowledge of CMake, from using it to configure ccls to lint C++ code with specific flags, and am aware of Google’s Test framework. Finally, I am currently taking Professor Stroustrap’s C++ class, and the compilers course here at Columbia.</span></p>
                                <br>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Regarding the logistics:</span></p>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1. Do I need to submit a resume/screening/patches? </span></p>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">2. Although I do have interests in certain projects posted on you website(Implement missing tab completion, createLoopPass, and PostDominatorTree), I am uncertain if I have enough expertise to decide what would be an appropriate project to contribute to given my current knowledge and experience. </span></p>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">3. The GCC GSoC website suggested checking out their source code, compiling and running their test suite. Can I do something similar for LLVM?</span></p>
                                <br>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Anyways, thank you for taking the time to read this email, and I hope to hear back!</span></p>
                                <br>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Best regards,</span></p>
                                <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Benson Li</span></p>
                              </div>
_______________________________________________<br>
                              LLVM Developers mailing list<br>
                              <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
                              <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
                            </blockquote>
                          </div>
                        </blockquote>
                      </div>
                      <br>
                      <fieldset></fieldset>
                      <pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
                    </blockquote>
                    <br>
                  </div>
                </blockquote>
              </div>
            </blockquote>
            <br>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </div>

</blockquote></div>