public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "jakub at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c/102291] [9/10/11/12 Regression] wrong overflow warning for compound expression conversion and bit_and expressions
Date: Mon, 06 Dec 2021 16:03:33 +0000	[thread overview]
Message-ID: <bug-102291-4-j8BevJNA7Y@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-102291-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102291

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I have tried:
--- gcc/convert.c.jj    2021-01-04 10:25:38.977232194 +0100
+++ gcc/convert.c       2021-12-06 16:28:51.279775640 +0100
@@ -398,6 +398,9 @@ do_narrow (location_t loc,
         Exception: the LSHIFT_EXPR case above requires that
         we perform this operation unsigned lest we produce
         signed-overflow undefinedness.
+        Exception: for BIT_*_EXPR if type is unsigned, just
+        convert operands to that unsigned type, there is no
+        point converting to a singled type instead.
         And we may need to do it as unsigned
         if we truncate to the original size.  */
       if (TYPE_UNSIGNED (TREE_TYPE (expr))
@@ -424,7 +427,11 @@ do_narrow (location_t loc,
                      > outprec))
              && (ex_form == PLUS_EXPR
                  || ex_form == MINUS_EXPR
-                 || ex_form == MULT_EXPR)))
+                 || ex_form == MULT_EXPR))
+          || ((ex_form == BIT_AND_EXPR
+               || ex_form == BIT_IOR_EXPR
+               || ex_form == BIT_XOR_EXPR)
+              && TYPE_UNSIGNED (typex)))
        {
          if (!TYPE_UNSIGNED (typex))
            typex = unsigned_type_for (typex);
--- gcc/testsuite/gcc.dg/pr102291.c.jj  2021-12-06 16:35:36.600984273 +0100
+++ gcc/testsuite/gcc.dg/pr102291.c     2021-12-06 16:35:25.531143307 +0100
@@ -0,0 +1,33 @@
+/* PR c/102291 */
+/* { dg-do compile } */
+
+extern void __assert_fail (const char *, const char *,
+                          unsigned int, const char *)
+  __attribute__ ((__nothrow__ , __leaf__, __noreturn__));
+#define assert(expr)                                   \
+  ((void) sizeof ((expr) ? 1 : 0), __extension__ ({    \
+    if (expr)                                          \
+      ; /* empty */                                    \
+    else                                               \
+      __assert_fail (#expr, __FILE__, __LINE__,                \
+                    __ASSERT_FUNCTION);                \
+    }))
+#define __ASSERT_FUNCTION __extension__ __PRETTY_FUNCTION__
+
+#define A(c) assert (sizeof (c) == 1 || (((unsigned long) (c)) >> 8) == 0)
+#define B(c) (A (c), ((unsigned char) (c)))
+#define C(c) (((unsigned char) (c)))
+#define D(c) ((c) | 0)
+#define E(old, new) ((((unsigned long) (old)) << 6) | (((unsigned char) D
(new)) & 0x3f))
+
+unsigned long
+foo (unsigned long x)
+{
+  return E (x, B (0x80));
+}
+
+unsigned long
+bar (unsigned long x)
+{
+  return E (x, C (0x80));
+}
but it regressed:
FAIL: gcc.dg/overflow-warn-5.c  (test for warnings, line 6)
FAIL: gcc.dg/tree-ssa/pr94882-3.c scan-tree-dump-times optimized "_[0-9] \\^
_[0-9]" 4
FAIL: gcc.dg/tree-ssa/pr94882-3.c scan-tree-dump-times optimized "~_[0-9]+" 8
FAIL: gcc.dg/vect/vect-over-widen-3-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-3-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 9"
FAIL: gcc.dg/vect/vect-over-widen-3.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-3.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 9"
FAIL: gcc.dg/vect/vect-over-widen-1-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-1-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-4-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-4-big-array.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-1.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-1.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-4.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-4.c scan-tree-dump vect
"vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-1-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-1-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-4-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-4-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-1.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-1.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-4.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-4.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 8"
FAIL: gcc.dg/vect/vect-over-widen-3-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-3-big-array.c -flto -ffat-lto-objects 
scan-tree-dump vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 9"
FAIL: gcc.dg/vect/vect-over-widen-3.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 3"
FAIL: gcc.dg/vect/vect-over-widen-3.c -flto -ffat-lto-objects  scan-tree-dump
vect "vect_recog_over_widening_pattern: detected:[^\\n]* << 9"
The overflow-warn-5.c case is just weird, there is no overflow, the function
does return p & 512; where p and return type are unsigned char,
just briefly looked at vect-over-widen-1.c and we vectorize one loop before and
after, just the detected cases are different.

  parent reply	other threads:[~2021-12-06 16:03 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-11 15:43 [Bug c/102291] New: dubious overflow warning hv at crypt dot org
2021-09-11 19:33 ` [Bug c/102291] [9/10/11/12 Regression] wrong overflow warning for compound expression conversion and bit_and expressions pinskia at gcc dot gnu.org
2021-09-11 19:33 ` pinskia at gcc dot gnu.org
2021-09-11 19:36 ` pinskia at gcc dot gnu.org
2021-12-06 12:46 ` jakub at gcc dot gnu.org
2021-12-06 14:07 ` jakub at gcc dot gnu.org
2021-12-06 16:03 ` jakub at gcc dot gnu.org [this message]
2021-12-06 16:09 ` jakub at gcc dot gnu.org
2021-12-06 22:44 ` joseph at codesourcery dot com
2022-01-20 10:02 ` rguenth at gcc dot gnu.org
2022-05-27  9:46 ` [Bug c/102291] [10/11/12/13 " rguenth at gcc dot gnu.org
2022-06-28 10:46 ` jakub at gcc dot gnu.org
2023-07-07 10:40 ` [Bug c/102291] [11/12/13/14 " rguenth at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-102291-4-j8BevJNA7Y@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).