Skip to content

[Refactor] "Nothing node" strip

Summary

This merge request makes an adjustment to the node parser so statement nodes with nothing nodes inside of them actually get stripped, thus aiding data-flow analysis.

System

  • Processor architecture: All

Additional Notes

  • When TBlockNode.pass_1 is called, it actually skipped calling pass_1 for the statement nodes and only called it for their children, thus the statement nods' pass_1 and simplify methods were never called.
  • The compiler may run slightly slower due to all of the statement nodes being directly processed rather than skipped.
  • Due to being processed, the statement nodes now receive a resultdef (usually $void - see below).
  • Extra compiler code ensures that if a block's first statement is removed, it does not leave a dangling pointer.
  • Actual generated code does not change.

Relevant logs and/or screenshots

Using the node dump of x86_64's aoptcpub - before:

        <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="255">
            <statementn pos="102,1">
               <nothingn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0" />
            </statementn>
            <statementn pos="102,1">
               <asmn resultdef="$void" pos="102,1" flags="nf_pass1_done,nf_get_asm_position" complexity="255">
               </asmn>
            </statementn>
            ...

After:

      <firstpass>
         <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="255">
            <statementn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="255">
               <asmn resultdef="$void" pos="102,1" flags="nf_pass1_done,nf_get_asm_position" complexity="255">
               </asmn>
            </statementn>
            ...

Later in the same file - before:

            ...
            <statementn pos="102,1">
               <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                  <statementn pos="102,1">
                     <nothingn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0" />
                  </statementn>
                  <statementn pos="102,1">
                     <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done,nf_usercode_entry" complexity="0">
                     </blockn>
                  </statementn>
                  <statementn pos="102,1">
                     <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                     </blockn>
                  </statementn>
               </blockn>
            </statementn>
            ...

After:

            ...
            <statementn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="255">
               <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                  <statementn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                     <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done,nf_usercode_entry" complexity="0">
                     </blockn>
                  </statementn>
                  <statementn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                     <blockn resultdef="$void" pos="102,1" flags="nf_pass1_done" complexity="0">
                     </blockn>
                  </statementn>
               </blockn>
            </statementn>
            ...

A future merge request should easily be able to strip out these empty blocks (they are functionally the same as nothing nodes), thus simplifying the node tree further.

Merge request reports