aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-11-26 16:13:08 +0100
committerRichard Biener <rguenther@suse.de>2020-11-26 16:18:07 +0100
commitc76b3f9e83353a4cd437ca137c1fb835c9b5c21f (patch)
tree307b34cd670b366a27dfb9eded7bc6c87902715f
parent5c197b83e12b634b65a449d8a7375a18f350708e (diff)
downloadgcc-c76b3f9e83353a4cd437ca137c1fb835c9b5c21f.zip
gcc-c76b3f9e83353a4cd437ca137c1fb835c9b5c21f.tar.gz
gcc-c76b3f9e83353a4cd437ca137c1fb835c9b5c21f.tar.bz2
tree-optimization/97953 - fix bougs range recorded by EVRP
EVRP records some ranges from asserts into SSA_NAME_RANGE_INFO but fails to assert that the condition the range is derived from is always true after the SSA names definition. The patch implements the simplest post-dominance check, basic-block equality. 2020-11-26 Richard Biener <rguenther@suse.de> PR tree-optimization/97953 * gimple-ssa-evrp-analyze.c (evrp_range_analyzer::record_ranges_from_incoming_edge): Make sure the condition post-dominates the SSA definition before recording into SSA_NAME_RANGE_INFO. * gcc.dg/pr97953.c: New testcase.
-rw-r--r--gcc/gimple-ssa-evrp-analyze.c6
-rw-r--r--gcc/testsuite/gcc.dg/pr97953.c24
2 files changed, 29 insertions, 1 deletions
diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c
index 485774d..b998e0b 100644
--- a/gcc/gimple-ssa-evrp-analyze.c
+++ b/gcc/gimple-ssa-evrp-analyze.c
@@ -218,7 +218,11 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb)
push_value_range (vrs[i].first, vrs[i].second);
if (is_fallthru
&& m_update_global_ranges
- && all_uses_feed_or_dominated_by_stmt (vrs[i].first, stmt))
+ && all_uses_feed_or_dominated_by_stmt (vrs[i].first, stmt)
+ /* The condition must post-dominate the definition point. */
+ && (SSA_NAME_IS_DEFAULT_DEF (vrs[i].first)
+ || (gimple_bb (SSA_NAME_DEF_STMT (vrs[i].first))
+ == pred_e->src)))
{
set_ssa_range_info (vrs[i].first, vrs[i].second);
maybe_set_nonzero_bits (pred_e, vrs[i].first);
diff --git a/gcc/testsuite/gcc.dg/pr97953.c b/gcc/testsuite/gcc.dg/pr97953.c
new file mode 100644
index 0000000..6219619
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr97953.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-tree-fre" } */
+
+int __attribute__((noipa))
+foo (int flag, int *p)
+{
+ int val = *p;
+ if (flag)
+ {
+ if (val != 1)
+ __builtin_unreachable ();
+ return 0;
+ }
+ int val2 = *p;
+ return val2 == 2;
+}
+
+int main()
+{
+ int i = 2;
+ if (foo (0, &i) != 1)
+ __builtin_abort ();
+ return 0;
+}