[gcc(refs/users/guojiufu/heads/guojiufu-branch)] c/95141 - fix bogus integer overflow warning

Jiu Fu Guo guojiufu@gcc.gnu.org
Wed Jun 10 02:58:28 GMT 2020


https://gcc.gnu.org/g:4a88caf21a0a85129f6c985ca13ba3eb54ff5366

commit 4a88caf21a0a85129f6c985ca13ba3eb54ff5366
Author: Richard Biener <rguenther@suse.de>
Date:   Tue May 19 07:58:33 2020 +0200

    c/95141 - fix bogus integer overflow warning
    
    This fixes an integer overflow warning that ultimatively happens because
    of TREE_OVERFLOW propagating through transforms and the existing guard
    against this,
    
    375           if (TREE_OVERFLOW_P (ret)
    376               && !TREE_OVERFLOW_P (op0)
    377               && !TREE_OVERFLOW_P (op1))
    378             overflow_warning (EXPR_LOC_OR_LOC (expr, input_location,
    
    being insufficient.  Rather than trying to use sth like walk_tree to
    exhaustively walk operands (with the possibility of introducing
    quadraticness when folding larger expressions recursively) the
    following amends the above with an ad-hoc test for a binary op0
    with a possibly constant op1.
    
    2020-05-30  Richard Biener  <rguenther@suse.de>
    
            PR c/95141
    gcc/c
            * c-fold.c (c_fully_fold_internal): Enhance guard on
            overflow_warning.
    
    gcc/testsuite
            * gcc.dg/pr95141.c: New testcase.

Diff:
---
 gcc/ChangeLog                  | 6 ++++++
 gcc/c/c-fold.c                 | 1 +
 gcc/testsuite/ChangeLog        | 5 +++++
 gcc/testsuite/gcc.dg/pr95141.c | 8 ++++++++
 4 files changed, 20 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fdaa94ae8b9..3133b3c4ef1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-30  Richard Biener  <rguenther@suse.de>
+
+	PR c/95141
+	* c-fold.c (c_fully_fold_internal): Enhance guard on
+	overflow_warning.
+
 2020-05-20  Kito Cheng  <kito.cheng@sifive.com>
 
 	PR target/90811
diff --git a/gcc/c/c-fold.c b/gcc/c/c-fold.c
index 63becfeaf2c..bd21d247051 100644
--- a/gcc/c/c-fold.c
+++ b/gcc/c/c-fold.c
@@ -374,6 +374,7 @@ c_fully_fold_internal (tree expr, bool in_init, bool *maybe_const_operands,
 	ret = fold (expr);
       if (TREE_OVERFLOW_P (ret)
 	  && !TREE_OVERFLOW_P (op0)
+	  && !(BINARY_CLASS_P (op0) && TREE_OVERFLOW_P (TREE_OPERAND (op0, 1)))
 	  && !TREE_OVERFLOW_P (op1))
 	overflow_warning (EXPR_LOC_OR_LOC (expr, input_location), ret, expr);
       if (code == LSHIFT_EXPR
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 48671f1105a..401025718ee 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-30  Richard Biener  <rguenther@suse.de>
+
+	PR c/95141
+	* gcc.dg/pr95141.c: New testcase.
+
 2020-05-19  Alex Coplan  <alex.coplan@arm.com>
 
 	PR target/94591
diff --git a/gcc/testsuite/gcc.dg/pr95141.c b/gcc/testsuite/gcc.dg/pr95141.c
new file mode 100644
index 00000000000..b6cbba2f908
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95141.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+#include <stdint.h>
+
+uint64_t test(uint8_t IA1)
+{
+  return (uint8_t)(IA1 & 158) & 1UL; /* { dg-bogus "integer overflow" } */
+}


More information about the Gcc-cvs mailing list