From ed80b385418f97ef087f3f2bbe1abecffb5c9775 Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Thu, 9 Apr 2020 16:42:48 +0800 Subject: [PATCH] Add unsigned type iv_cand for iv_use with non mode-precision type Precisely, for iv_use if it's not integer/pointer type, or non-mode precision type, add candidate for the corresponding scev in unsigned type with the same precision, rather than its original type. gcc/ PR tree-optimization/93674 * tree-ssa-loop-ivopts.c (langhooks.h): New include. (add_iv_candidate_for_use): For iv_use of non integer or pointer type, or non-mode precision type, add candidate in unsigned type with the same precision. gcc/testsuite/ PR tree-optimization/93674 * g++.dg/pr93674.C: New test. --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/pr93674.C | 16 ++++++++++++++++ gcc/tree-ssa-loop-ivopts.c | 18 +++++++++++++++++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/pr93674.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d1819da91d8..d45d272704c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2020-04-09 Bin Cheng + Richard Biener + + PR tree-optimization/93674 + * tree-ssa-loop-ivopts.c (langhooks.h): New include. + (add_iv_candidate_for_use): For iv_use of non integer or pointer type, + or non-mode precision type, add candidate in unsigned type with the + same precision. + 2020-04-08 Clement Chigot * config/rs6000/aix61.h (LIB_SPEC): Add -lc128 with -mlong-double-128. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 45e7005da49..960eae47308 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-09 Bin Cheng + + PR tree-optimization/93674 + * g++.dg/pr93674.C: New test. + 2020-04-08 Sandra Loosemore * g++.dg/tree-ssa/pr93940.C: Require pthread target. diff --git a/gcc/testsuite/g++.dg/pr93674.C b/gcc/testsuite/g++.dg/pr93674.C new file mode 100644 index 00000000000..8c59f1b0079 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr93674.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-O3 -std=c++14 -fstrict-enums -pedantic -fdump-tree-optimized" } +enum some_enum { x = 1000 }; +void sink(some_enum); + +int __attribute__((noinline)) func() { + int sum = 0; + for (int i = 0; i < 3; ++i) { + for (int j = 3; j >= 0; --j) { + sink((some_enum)(i + j)); + } + } + return sum; +} + +// { dg-final { scan-tree-dump-not "some_enum ivtmp" "optimized" } } diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 1ce6d8b372b..1d2697ae1ba 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -132,6 +132,9 @@ along with GCC; see the file COPYING3. If not see #include "tree-vectorizer.h" #include "dbgcnt.h" +/* For lang_hooks.types.type_for_mode. */ +#include "langhooks.h" + /* FIXME: Expressions are expanded to RTL in this pass to determine the cost of different addressing modes. This should be moved to a TBD interface between the GIMPLE and RTL worlds. */ @@ -3479,8 +3482,21 @@ add_iv_candidate_for_use (struct ivopts_data *data, struct iv_use *use) { poly_uint64 offset; tree base; - tree basetype; struct iv *iv = use->iv; + tree basetype = TREE_TYPE (iv->base); + + /* Don't add candidate for iv_use with non integer, pointer or non-mode + precision types, instead, add candidate for the corresponding scev in + unsigned type with the same precision. See PR93674 for more info. */ + if ((TREE_CODE (basetype) != INTEGER_TYPE && !POINTER_TYPE_P (basetype)) + || !type_has_mode_precision_p (basetype)) + { + basetype = lang_hooks.types.type_for_mode (TYPE_MODE (basetype), + TYPE_UNSIGNED (basetype)); + add_candidate (data, fold_convert (basetype, iv->base), + fold_convert (basetype, iv->step), false, NULL); + return; + } add_candidate (data, iv->base, iv->step, false, use); -- 2.30.2