aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-02-18 12:56:15 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-02-18 12:56:15 +0000
commitc41491973b05547236fe0bb82ae2419607c6f3ef (patch)
tree3628650112627d97bfe1a979978983c6ac2c71fe
parent022049403b80be13a495d8411aac2d0aacdf1a27 (diff)
downloadgcc-c41491973b05547236fe0bb82ae2419607c6f3ef.zip
gcc-c41491973b05547236fe0bb82ae2419607c6f3ef.tar.gz
gcc-c41491973b05547236fe0bb82ae2419607c6f3ef.tar.bz2
re PR tree-optimization/89296 (tree copy-header masking uninitialized warning)
2019-02-18 Richard Biener <rguenther@suse.de> PR tree-optimization/89296 * tree-ssa-loop-ch.c (ch_base::copy_headers): Restrict setting of no-warning flag to cases that might emit the bogus warning. * gcc.dg/uninit-pr89296.c: New testcase. From-SVN: r268986
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr89296.c13
-rw-r--r--gcc/tree-ssa-loop-ch.c16
4 files changed, 38 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 553f018..bf74a0a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-02-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89296
+ * tree-ssa-loop-ch.c (ch_base::copy_headers): Restrict setting
+ of no-warning flag to cases that might emit the bogus warning.
+
2019-02-18 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/88714
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2ca40b0..2a68cf2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89296
+ * gcc.dg/uninit-pr89296.c: New testcase.
+
2019-02-18 Jakub Jelinek <jakub@redhat.com>
PR target/89369
diff --git a/gcc/testsuite/gcc.dg/uninit-pr89296.c b/gcc/testsuite/gcc.dg/uninit-pr89296.c
new file mode 100644
index 0000000..9d81b32
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/uninit-pr89296.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+int get_a_value ();
+void printk(const char *);
+void test_func()
+{
+ int loop;
+ while (!loop) { /* { dg-warning "is used uninitialized" } */
+ loop = get_a_value();
+ printk("...");
+ }
+}
diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c
index 1b8cb82..f65e2b5 100644
--- a/gcc/tree-ssa-loop-ch.c
+++ b/gcc/tree-ssa-loop-ch.c
@@ -452,11 +452,23 @@ ch_base::copy_headers (function *fun)
{
gimple *stmt = gsi_stmt (bsi);
if (gimple_code (stmt) == GIMPLE_COND)
- gimple_set_no_warning (stmt, true);
+ {
+ tree lhs = gimple_cond_lhs (stmt);
+ if (gimple_cond_code (stmt) != EQ_EXPR
+ && gimple_cond_code (stmt) != NE_EXPR
+ && INTEGRAL_TYPE_P (TREE_TYPE (lhs))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs)))
+ gimple_set_no_warning (stmt, true);
+ }
else if (is_gimple_assign (stmt))
{
enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
- if (TREE_CODE_CLASS (rhs_code) == tcc_comparison)
+ tree rhs1 = gimple_assign_rhs1 (stmt);
+ if (TREE_CODE_CLASS (rhs_code) == tcc_comparison
+ && rhs_code != EQ_EXPR
+ && rhs_code != NE_EXPR
+ && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (rhs1)))
gimple_set_no_warning (stmt, true);
}
}