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: [PATCH, tree-dce]: DCE enh to handle dead calls (not pure)


Hi Steven,

thanks for your comments. See my reply inlined below.

Steven Bosscher wrote:
xf. http://gcc.gnu.org/ml/gcc-patches/2008-05/msg01011.html


Hi David,


It sounds like an interesting transformation -- but could you show an
example (in pseudo code, or a gimple dump) of what this transformation
does, exactly?

// This is an trivial example #include <math.h>

void foo(double x)
{

double y;

y = log(x);

   return;
 }



// Gimple dump after dce

;; Function foo (foo)

foo (double x)
{
  _Bool DCE_COND_TEST.26;
  double DCE_COND.25;

<bb 2>:
  DCE_COND.25_2 = x_1(D);
  DCE_COND_TEST.26_3 = DCE_COND.25_2 <= 0.0;
  if (DCE_COND_TEST.26_3)
    goto <bb 3> (<L2>);
  else
    goto <bb 4> (<L1>);

<L2>:;
  log (x_1(D));

<L1>:;
  return;

}




There are some issues with your patch. First of all, why all the random whitespace changes?! There are a lot of them at the end of your patch in the hunks for tree-ssa-dce.c, and some places where you turned tabs into spaces for some reason. Please clean up your patch (and your source tree) next time before submitting a patch. Also, please fix all the lines longer than 80 characters.

Not sure about the white space. Will watch out next time.




Second, the patch assumes there is such a thing as errno, and the builtin functions behave POSIX-like. Is this guaranteed? I think not (e.g. -ffreestanding, -fno-math-errno?).

No really. With those options turned on, the function call will be eliminated completely by regular DCE if return val is not used.



Third, at least for my taste you have *way* too many gcc_asserts. They are not free, you know, and you are asserting trivial things and things that you have already asserted before. For example, in the gen_conditions_for* functions you re-assert everything you already asserted in the check* functions. Please reconsider whether you really need all of them. gcc_assert is not free and also doesn't improve the readability of the code...


Maybe we need to introduce a gcc_dbg_assert. Is it there already?




Then, the patch:


ChangeLog:

2008-05-17 Xinliang David Li   davidxl@google.com
gcc/tree-ssa-dce.c : conditional dead call elimination
gcc/opts.c         : enable the optimization at >=O2
gcc/common.opt      : new flag for control the optimization
gcc/doc/invoke.texi : documentation change
gcc/testsuite/gcc.dg/cdce1.c : new test case
gcc/testsuite/gcc.dg/cdce2.c : new test case
MAINTAINERS  : Add myself (write after approval)

That doesn't even look like a GCC ChangeLog entry. Please look at ChangeLog (the file) to see what it should look like.

Right. Changed in actual changeLog.




@@ -5157,6 +5157,7 @@ compilation time.
 -ftree-ch @gol
 -ftree-copyrename @gol
 -ftree-dce @gol
+-ftree-builtin-dce @gol
-ftree-dominator-opts @gol
 -ftree-dse @gol
 -ftree-fre @gol

... and ...


+@item -ftree-builtin-dce
+@opindex ftree-builtin-dce
+Perform conditional dead code elimination (DCE) on builtin calls that
+may set errno but are otherwise side-effect free.  This flag is enabled by
+default at @option{-O} and higher.

So what is it: At -O and higher as indicated in this invoke.texi hunk, or at -O2 and higher, like you say in your changelog? Further, I suggest you change this to say something about "DCE for calls to builtin functions" instead of "DCE on builtin calls". The calls are not builtin, after all ;-) This is user documentation, and I think Joe Average User will find this entry confusing...

My mistake. Should be -O2. In my previous compiler, -O == -O2, thus the confusion. Will change.






+  if (dump_file && (dump_flags & TDF_DETAILS))
+   {
+     location_t loc;
+     loc = EXPR_LOCATION (bi_call);
+     inform (
+         "%Hfunction call is shrink-wrapped into error conditions.",
+         &loc);
+   }

You don't want to inform here. You want to write out something to the dump_file. This also means your test cases should not be using dg-message. They should scan in the DCE dump file instead.

Ah, this is something I like to change systematially in gcc in the future -- all high level transformations will emit info messages -- for performance tuning/triaging reason. I was planning to do this under a new option -fopt-info, but only heard someone else is working on the infrastructure, so temporally under the dump option.


I will correct the little silly coding style issues you mentioned in a next patch.

Thanks,


David



+
+static bool
+check_pow (tree pow_call)
+{

Missing comment before the function.



+     def = SSA_NAME_DEF_STMT (base);
+     if (TREE_CODE (def) != GIMPLE_MODIFY_STMT)
+       return false;
+
+     nm = GIMPLE_STMT_OPERAND (def,0);
+     gcc_assert (TREE_CODE (nm) == SSA_NAME);
+     if (nm != base)
+       return false;

The second block here looks redundant to me. If operand 0 of the the SSA_NAME_DEF_STMT for base is not base, something is seriously wrong. So nm == base always, you can rely on this, and the "nm = ..." block should go away.

In fact, I don't understand the entire block after "+  else if (bc ==
SSA_NAME)".  What are you trying to check for here?  What does
INT_TYPE_SIZE matter for this transformation?  Since you add virtually
no comment in your functions, it is hard to tell...

(Hmm, I see you explain it a bit further down in a different function.
 Might I suggest grouping the check* and gen_conditions_for* function
by buitlin? I think that would make it easier to follow what is going
on.)

+
+static bool
+check_log (tree log_call)
+{

Missing comment before the function.



+/* A helper function to determine if a builtin function
Should have only one space before "A".


+  switch (fnc)
+   {
+     CASE_FLT_FN (BUILT_IN_POW):
+         if (check_pow (call))
+           is_unnecessary_except_errno = true;
+     break;
+
+     CASE_FLT_FN (BUILT_IN_LOG):
+         if (check_log (call))
+           is_unnecessary_except_errno = true;
+     break;
+     default :
+       is_unnecessary_except_errno = false;
+     break;
+   }

Wrong indentation, for the whole switch block.



+  if (!is_unnecessary_except_errno)
+    return false;
+
+  return is_unnecessary_except_errno;
+}

This is one for the daily-wtf :-) Remove the if, please.



+/* The method to generate error condition guard code for log(x)
Should have only one space before "The". Same for the leading comments
before some other new functions.


+/*  Method to generate conditional statements for guarding condionally
+    dead calls to pow. One or more statements can be generated for
+    each logical condition. Statement groups of different conditions
+    are separated by a NULL tree.  */
+static void
+gen_conditions_for_pow (tree pow_call, enum built_in_function fnc,
+                        VEC (tree, heap)* conds, unsigned * nconds)
+{

The comment before this function is not really complete, is it? Separated by a NULL where? In VEC conds I suppose? But you did not say anything about the arguments in the comment (which you should have done) so it's hard to tell without reading the function. Sort of defeats the purpose of documenting an interface ;-)


+#define ERR_PROB 0.01
Add a comment before this. Randomly appearing defines are confusing.


+  /* Now it is time to insert the first condtional expression
+     into bi_call_bb and split this bb so that bi_call is
+     shrink-wrapped*/
Not a GCC-style comment.

+ /* now the label*/
Not a GCC-style1 comment.

+ /* code generation for the rest of the conditions */
Not a GCC-style comment.

+ /* code generation for the rest of the conditions */
Not a GCC-style comment.

+ for (; nconds > 0; )
And the lord cried "while"!


+     nconds --;
+     ci ++;
Not GCC code style.

+ bi_call_in_edge->probability = REG_BR_PROB_BASE*ERR_PROB;
Not GCC code style (spaces around "*").



The idea is of this patch is really nice. But please try to avoid
submitting patches with so many silly little issues!

Gr.
Steven


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