]> git.ipfire.org Git - thirdparty/gcc.git/commit
tree: Improve skip_simple_arithmetic [PR119183]
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Mar 2025 10:01:55 +0000 (11:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Mar 2025 10:01:55 +0000 (11:01 +0100)
commit20e5aa9cc1519f871cce25dbfdc149d9d60da779
tree5fb6c83635de44ce9ae069f3fa88ed03e70fe93c
parente1da6283a1cbd5db474c0f7e5cca9b9876768199
tree: Improve skip_simple_arithmetic [PR119183]

The following testcase takes very long time to compile, because
skip_simple_arithmetic decides to first call tree_invariant_p on
the second argument (and indirectly recurse there).  I think before
canonicalization of operands for commutative binary expressions
(and for non-commutative ones always) it is pretty common that the
first operand is a constant, something which tree_invariant_p handles
immediately, so the following patch special cases that; I've added
there a tree_invariant_p call too after the checks, while it is not
really needed currently, tree_invariant_p has the same checks, I wanted
to be prepared in case tree_invariant_p changes.  But if you think
I should avoid it, I can drop it too.

This is just a partial fix, I think one can certainly construct a testcase
which will still have horrible compile time complexity (but I've tried and
haven't managed to do so), so perhaps we should just limit the recursion
depth through skip_simple_arithmetic/tree_invariant_p with some defaulted
argument.

2025-03-11  Jakub Jelinek  <jakub@redhat.com>

PR c/119183
* tree.cc (skip_simple_arithmetic): If first operand of binary
expr is TREE_CONSTANT or TREE_READONLY with no side-effects, call
tree_invariant_p on that operand first instead of on the second.

* gcc.dg/pr119183.c: New test.
gcc/testsuite/gcc.dg/pr119183.c [new file with mode: 0644]
gcc/tree.cc