From: Aldy Hernandez Date: Thu, 5 Nov 2020 11:40:51 +0000 (+0100) Subject: Drop overflow from constants while building ranges in ranger. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4ef0f1e90f1795b1f2d5bba05ed299e8c7635fd4;p=gcc.git Drop overflow from constants while building ranges in ranger. Sometimes the overflow flag will leak into the IL. Drop it while creating ranges. There are various places we could plug this. This patch just plugs things at get_tree_range which is the entry point for ranges from tree expressions. It fixes the PR, and probably fixes the ranger entirely, but we may need to revisit this. For example, I looked to see if there were other places that created ranges with TREE_OVERFLOW set, and there are various. For example, the following code pattern appears multiple times in vr-values.c: else if (is_gimple_min_invariant (op0)) vr0.set (op0); This can pick up TREE_OVERFLOW from the IL if present. However, the ranger won't see them so we're good. At some point we should audit all this. Or perhaps just nuke all TREE_OVERFLOW's at irange::set. For now, this will do. gcc/ChangeLog: PR tree-optimization/97721 * gimple-range.cc (get_tree_range): Drop overflow from constants. gcc/testsuite/ChangeLog: * gcc.dg/pr97721.c: New test. --- diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index ef65e00cc1d..0c8ec40448f 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -165,6 +165,8 @@ get_tree_range (irange &r, tree expr) switch (TREE_CODE (expr)) { case INTEGER_CST: + if (TREE_OVERFLOW_P (expr)) + expr = drop_tree_overflow (expr); r.set (expr, expr); return true; diff --git a/gcc/testsuite/gcc.dg/pr97721.c b/gcc/testsuite/gcc.dg/pr97721.c new file mode 100644 index 00000000000..c2a2848ba13 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97721.c @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-O -fno-tree-dominator-opts" } + +int ot; + +void +z6 (char *tw) +{ + while (ot >= 0) + --ot; + + __builtin_strcpy (&tw[ot], tw); +}