aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-04-26 09:57:34 +0200
committerJakub Jelinek <jakub@redhat.com>2022-04-26 09:57:34 +0200
commitd4836ac9acd0c991a4fe1dec9438773a2c4eb5ac (patch)
tree4c74da4417607abbd05b8ce961f90f27e7cfb440
parent1b45ae16fffc856b5d84aeea12040dd82452cd07 (diff)
downloadgcc-d4836ac9acd0c991a4fe1dec9438773a2c4eb5ac.zip
gcc-d4836ac9acd0c991a4fe1dec9438773a2c4eb5ac.tar.gz
gcc-d4836ac9acd0c991a4fe1dec9438773a2c4eb5ac.tar.bz2
reassoc: Don't call fold_convert if !fold_convertible_p [PR105374]
As mentioned in the PR, we ICE because maybe_fold_*_comparisons returns an expression with V4SImode type and we try to fold_convert it to V4BImode, which isn't allowed. IMHO no matter whether we change maybe_fold_*_comparisons we should play safe on the reassoc side and punt if we can't convert like we punt for many other reasons. This fixes the testcase on ARM. Testcase not included, not exactly sure where and what directives it should have in gcc.target/arm/ testsuite. Christophe, do you think you could handle that incrementally? 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/105374 * tree-ssa-reassoc.cc (eliminate_redundant_comparison): Punt if !fold_convertible_p rather than assuming fold_convert must succeed.
-rw-r--r--gcc/tree-ssa-reassoc.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index f41b3c9..43b2537 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -2254,7 +2254,11 @@ eliminate_redundant_comparison (enum tree_code opcode,
BIT_AND_EXPR or BIT_IOR_EXPR was of a wider integer type,
we need to convert. */
if (!useless_type_conversion_p (TREE_TYPE (curr->op), TREE_TYPE (t)))
- t = fold_convert (TREE_TYPE (curr->op), t);
+ {
+ if (!fold_convertible_p (TREE_TYPE (curr->op), t))
+ continue;
+ t = fold_convert (TREE_TYPE (curr->op), t);
+ }
if (TREE_CODE (t) != INTEGER_CST
&& !operand_equal_p (t, curr->op, 0))