middle-end/104644 - recursion with bswap match.pd pattern
authorRichard Biener <rguenther@suse.de>
Wed, 23 Feb 2022 12:47:01 +0000 (13:47 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 23 Feb 2022 12:51:43 +0000 (13:51 +0100)
commitfdc46830f1b793dc791099acfadc3f0f8cc24c0e
treee258eabd0bfcca853c5e450e99b215becdbe18f5
parentf4ed267fa5b82d6dafbc8afc82baf45bfcae549c
middle-end/104644 - recursion with bswap match.pd pattern

The following patch avoids infinite recursion during generic folding.
The (cmp (bswap @0) INTEGER_CST@1) simplification relies on
(bswap @1) actually being simplified, if it is not simplified, we just
move the bswap from one operand to the other and if @0 is also INTEGER_CST,
we apply the same rule next.

The reason why bswap @1 isn't folded to INTEGER_CST is that the INTEGER_CST
has TREE_OVERFLOW set on it and fold-const-call.cc predicate punts in
such cases:
static inline bool
integer_cst_p (tree t)
{
  return TREE_CODE (t) == INTEGER_CST && !TREE_OVERFLOW (t);
}
The patch uses ! modifier to ensure the bswap is simplified and
extends support to GENERIC by means of requiring !EXPR_P which
is not perfect but a conservative approximation.

2022-02-22  Richard Biener  <rguenther@suse.de>

PR tree-optimization/104644
* doc/match-and-simplify.texi: Amend ! documentation.
* genmatch.cc (expr::gen_transform): Code-generate ! support
for GENERIC.
(parser::parse_expr): Allow ! for GENERIC.
* match.pd (cmp (bswap @0) INTEGER_CST@1): Use ! modifier on
bswap.

* gcc.dg/pr104644.c: New test.

Co-Authored-by: Jakub Jelinek <jakub@redhat.com>
gcc/doc/match-and-simplify.texi
gcc/genmatch.cc
gcc/match.pd
gcc/testsuite/gcc.dg/pr104644.c [new file with mode: 0644]