[Bug rtl-optimization/33828] Issues with the implementation of code hoisting in gcse.c

steven at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sat Oct 20 10:48:00 GMT 2007



------- Comment #2 from steven at gcc dot gnu dot org  2007-10-20 10:48 -------
A second issue with code hoisting in gcse.c is that it only looks at basic
blocks immediately dominated by the branch point to hoist to.  Quoting
gcse.c:hoist_code():

  /* Walk over each basic block looking for potentially hoistable
     expressions, nothing gets hoisted from the entry block.  */
  FOR_EACH_BB (bb)
    {
      int found = 0;
      int insn_inserted_p;

      domby = get_dominated_by (CDI_DOMINATORS, bb);
      ...

An expression can be very busy at some point in the CFG, and be computed in a
block that is not immediately dominated at that point, e.g.

BB1
if (...) goto BB2 else goto BB3
{ succ BB2, BB3 }

{ pred BB1 }
BB2
r1 <- exp1
goto BB6
{ succ BB6 }

{ pred BB1}
BB3
if (...) goto BB4 else goto BB5
{ succ BB4, BB5 }

{ pred BB3 }
BB4
r2 <- exp1
goto BB6
{ succ BB6 }

{ pred BB3 }
BB5
r3 <- exp1
goto BB6
{ succ BB6 }

{ pred BB2, BB4, BB5 }
BB6
// etc.

The expression exp1 is hoistable to BB1, but BB4 and BB5 are not immediately
dominated by BB1, so gcse.c's code hoisting implementation never optimizes
this.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33828



More information about the Gcc-bugs mailing list