aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-match-head.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-11-09 18:09:44 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-11-09 18:09:44 +0100
commitc47bee97fa9927563a5015b28e24a5505ba557a3 (patch)
tree25d71a8d63b489e51267aa227f35fdd7caf84c5d /gcc/gimple-match-head.c
parentb03932cb99afb634786a8000e447fb21fad115d0 (diff)
downloadgcc-c47bee97fa9927563a5015b28e24a5505ba557a3.zip
gcc-c47bee97fa9927563a5015b28e24a5505ba557a3.tar.gz
gcc-c47bee97fa9927563a5015b28e24a5505ba557a3.tar.bz2
re PR tree-optimization/92401 (ICE in fold_ternary_loc, at fold-const.c:11698)
PR tree-optimization/92401 * gimple-match-head.c (gimple_resimplify1): Call const_unop only if res_op->code is an expression with code length 1. * gimple-match-head.c (gimple_resimplify2): Call const_binop only if res_op->code is an expression with code length 2. * gimple-match-head.c (gimple_resimplify3): Call fold_ternary only if res_op->code is an expression with code length 3. * g++.dg/opt/pr92401.C: New test. From-SVN: r278004
Diffstat (limited to 'gcc/gimple-match-head.c')
-rw-r--r--gcc/gimple-match-head.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c
index d7c74a1..2996bad 100644
--- a/gcc/gimple-match-head.c
+++ b/gcc/gimple-match-head.c
@@ -191,7 +191,12 @@ gimple_resimplify1 (gimple_seq *seq, gimple_match_op *res_op,
{
tree tem = NULL_TREE;
if (res_op->code.is_tree_code ())
- tem = const_unop (res_op->code, res_op->type, res_op->ops[0]);
+ {
+ tree_code code = res_op->code;
+ if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
+ && TREE_CODE_LENGTH (code) == 1)
+ tem = const_unop (res_op->code, res_op->type, res_op->ops[0]);
+ }
else
tem = fold_const_call (combined_fn (res_op->code), res_op->type,
res_op->ops[0]);
@@ -252,8 +257,13 @@ gimple_resimplify2 (gimple_seq *seq, gimple_match_op *res_op,
{
tree tem = NULL_TREE;
if (res_op->code.is_tree_code ())
- tem = const_binop (res_op->code, res_op->type,
- res_op->ops[0], res_op->ops[1]);
+ {
+ tree_code code = res_op->code;
+ if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
+ && TREE_CODE_LENGTH (code) == 2)
+ tem = const_binop (res_op->code, res_op->type,
+ res_op->ops[0], res_op->ops[1]);
+ }
else
tem = fold_const_call (combined_fn (res_op->code), res_op->type,
res_op->ops[0], res_op->ops[1]);
@@ -325,9 +335,14 @@ gimple_resimplify3 (gimple_seq *seq, gimple_match_op *res_op,
{
tree tem = NULL_TREE;
if (res_op->code.is_tree_code ())
- tem = fold_ternary/*_to_constant*/ (res_op->code, res_op->type,
- res_op->ops[0], res_op->ops[1],
- res_op->ops[2]);
+ {
+ tree_code code = res_op->code;
+ if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
+ && TREE_CODE_LENGTH (code) == 3)
+ tem = fold_ternary/*_to_constant*/ (res_op->code, res_op->type,
+ res_op->ops[0], res_op->ops[1],
+ res_op->ops[2]);
+ }
else
tem = fold_const_call (combined_fn (res_op->code), res_op->type,
res_op->ops[0], res_op->ops[1], res_op->ops[2]);