This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 0007-Add-open-ended-comments.patch


This patch adds several open-ended comments in gcse.c. I'll be happy if anyone can answer some of them, in which case I'll check in the answers, rather than questions :).

Thank you,

@@ -3431,7 +3431,9 @@ process_insert_insn (struct expr *expr)

    For PRE, we want to verify that the expr is either transparent
    or locally anticipatable in the target block.  This check makes
-   no sense for code hoisting.  */
+   no sense for code hoisting.
+   ??? We always call this function with (PRE == 0), which makes the checks
+   useless.  */
See pre_edge_insert and search for EDGE_ABNORMAL.

That code went through several iterations and may no longer be necessary. So we really should extend the existing comment before the call to insert_insn_end_basic_block from pre_edge_insert.

@@ -3535,6 +3537,9 @@ insert_insn_end_basic_block (struct expr *expr, basic_block bb, int pre)
else
new_insn = emit_insn_after_noloc (pat, insn, bb);


+  /* ??? It maybe useful to try set REG_EQUAL note on NEW_INSN here.
+     How can we do it?  */
+

Why do you think this is important? Have you run into cases where having the note showing an alternate form of the expression would have allowed further optimization?

So, when you find a hoistable expression that reaches from its new block to a dominated child block which also evaluates the expression, if the insn in the dominated child has a REG_EQUAL note, you might be able to copy it. So record it into a variable in the loop over the dominated blocks. At the end of that loop, copy the REG_EQUAL note to the new insn (which you'll need to record as well). You may have to verify the note is safe to copy/move. I haven't pondered that aspect at all.

/* Walk over each basic block looking for potentially hoistable
- expressions, nothing gets hoisted from the entry block. */
+ expressions, nothing gets hoisted from the entry block.
+
+ ??? It maybe worthwhile to walk CFG in DFS order over the dominator tree.
+ One can imagine a case when a dominated block B is linked before
+ its dominator A, so if expressions were hoisted from blocks C and D,
+ which B (and A) dominates, then it may occur that we miss
+ an optimization of moving these expressions all the way to A.
+ Alternatively, we may handle this case by updating expressions'
+ occurences to include instructions emitted by code hoisting, i.e.,
+ an expression emitted at the end of B will then be hoisted to A. */
Well, yea, I guess this is possible. I'm not sure if it happens much in practice. I think your best bet would be controlling the order of blocks visited. Trying to update the tables on the fly seems like it's going to get ugly quick.


Jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]