On Thu, 13 Jul 2017, Alexander Monakov wrote:

On Thu, 13 Jul 2017, Marc Glisse wrote:
I notice that we do not turn (X*10)*10 into X*100 in GIMPLE.

Sorry, could you clarify what you mean here?  I think we certainly do that,
just not via match.pd, but in 'associate:' case of fold_binary_loc.

fold_binary_loc is for GENERIC, so mostly for front-end time optimization of expressions.

int f(int a){
  int b=a*10;
  return b*10;
}

$ gcc-snapshot -O3 -S -fdump-tree-optimized a.c
$ cat a.c.228t.optimized
[...]
  b_2 = a_1(D) * 10;
  _3 = b_2 * 10;
  return _3;

Relying on inner expressions being folded can be slightly dangerous,
especially for generic IIRC. It seems easy enough to check that @1 is neither
0 nor -1 for safety.

I wanted to add a gcc_checking_assert to that effect, but it's not used in
match.pd anywhere.  Is there a nice way to do that?

You can use (with { arbitrary C++ code } ... ) to add an assertion (you can use @0 in the block of C++ code).

I was more thinking of an "if" than an assertion though.

--
Marc Glisse

Reply via email to