From 89789ec91d14bf5aca8a0a60dcbf7ee6e0bed5c5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 26 Nov 2019 09:43:27 +0100 Subject: [PATCH] re PR tree-optimization/92644 (ICE in wide_int_to_tree_1, at tree.c:1530) PR tree-optimization/92644 * tree-ssa-phiopt.c (minmax_replacement): Add INTEGRAL_TYPE_P check next to INTEGER_CST checks. * g++.dg/opt/pr92644.C: New test. From-SVN: r278720 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr92644.C | 6 ++++++ gcc/tree-ssa-phiopt.c | 9 ++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr92644.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ea6e5b592f..633836f410d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-26 Jakub Jelinek + + PR tree-optimization/92644 + * tree-ssa-phiopt.c (minmax_replacement): Add INTEGRAL_TYPE_P check + next to INTEGER_CST checks. + 2019-11-26 Richard Biener PR tree-optimization/92645 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d105b609c84..325572b5f7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-11-26 Jakub Jelinek + + PR tree-optimization/92644 + * g++.dg/opt/pr92644.C: New test. + 2019-11-26 Richard Biener PR tree-optimization/92645 diff --git a/gcc/testsuite/g++.dg/opt/pr92644.C b/gcc/testsuite/g++.dg/opt/pr92644.C new file mode 100644 index 00000000000..2f8a86f1fdb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr92644.C @@ -0,0 +1,6 @@ +// PR tree-optimization/92644 +// { dg-do compile { target c++14 } } +// { dg-options "-O2 -fno-early-inlining" } + +inline auto foo () { return nullptr; } +int bar () { return foo () ? 1 : 0; } diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 90583096c94..1ae925dc570 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -1381,7 +1381,8 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb, /* Turn EQ/NE of extreme values to order comparisons. */ if ((cmp == NE_EXPR || cmp == EQ_EXPR) - && TREE_CODE (rhs) == INTEGER_CST) + && TREE_CODE (rhs) == INTEGER_CST + && INTEGRAL_TYPE_P (TREE_TYPE (rhs))) { if (wi::eq_p (wi::to_wide (rhs), wi::min_value (TREE_TYPE (rhs)))) { @@ -1407,7 +1408,8 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb, larger = rhs; /* If we have smaller < CST it is equivalent to smaller <= CST-1. Likewise smaller <= CST is equivalent to smaller < CST+1. */ - if (TREE_CODE (larger) == INTEGER_CST) + if (TREE_CODE (larger) == INTEGER_CST + && INTEGRAL_TYPE_P (TREE_TYPE (larger))) { if (cmp == LT_EXPR) { @@ -1435,7 +1437,8 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb, larger = gimple_cond_lhs (cond); /* If we have larger > CST it is equivalent to larger >= CST+1. Likewise larger >= CST is equivalent to larger > CST-1. */ - if (TREE_CODE (smaller) == INTEGER_CST) + if (TREE_CODE (smaller) == INTEGER_CST + && INTEGRAL_TYPE_P (TREE_TYPE (smaller))) { wi::overflow_type overflow; if (cmp == GT_EXPR) -- 2.30.2