public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-3365] match.pd: Fix up __builtin_*_overflow arg demotion [PR102207]
@ 2021-09-06  8:09 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2021-09-06  8:09 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8a4602c2e0f81895415ba7ee23bf81dc795d1103

commit r12-3365-g8a4602c2e0f81895415ba7ee23bf81dc795d1103
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Sep 6 10:08:16 2021 +0200

    match.pd: Fix up __builtin_*_overflow arg demotion [PR102207]
    
    My earlier patch to demote arguments of __builtin_*_overflow unfortunately
    caused a wrong-code regression.  The builtins operate on infinite precision
    arguments, outer_prec > inner_prec signed -> signed, unsigned -> unsigned
    promotions there are just repeating the sign or 0s and can be demoted,
    similarly unsigned -> signed which also is repeating 0s, but as the
    testcase shows, signed -> unsigned promotions need to be preserved (unless
    we'd know the inner arguments can't be negative), because for negative
    numbers such promotion sets the outer_prec -> inner_prec bits to 1 bit the
    bits above that to 0 in the infinite precision.
    
    So, the following patch avoids the demotions for the signed -> unsigned
    promotions.
    
    2021-09-06  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/102207
            * match.pd: Don't demote operands of IFN_{ADD,SUB,MUL}_OVERFLOW if they
            were promoted from signed to wider unsigned type.
    
            * gcc.dg/pr102207.c: New test.

Diff:
---
 gcc/match.pd                    |  6 ++++--
 gcc/testsuite/gcc.dg/pr102207.c | 24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index cc7809dfe0f..008f7758c96 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5608,13 +5608,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (ovf (convert@2 @0) @1)
   (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
        && INTEGRAL_TYPE_P (TREE_TYPE (@2))
-       && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0)))
+       && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0))
+       && (!TYPE_UNSIGNED (TREE_TYPE (@2)) || TYPE_UNSIGNED (TREE_TYPE (@0))))
    (ovf @0 @1)))
  (simplify
   (ovf @1 (convert@2 @0))
   (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
        && INTEGRAL_TYPE_P (TREE_TYPE (@2))
-       && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0)))
+       && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0))
+       && (!TYPE_UNSIGNED (TREE_TYPE (@2)) || TYPE_UNSIGNED (TREE_TYPE (@0))))
    (ovf @1 @0))))
 
 /* Simplification of math builtins.  These rules must all be optimizations
diff --git a/gcc/testsuite/gcc.dg/pr102207.c b/gcc/testsuite/gcc.dg/pr102207.c
new file mode 100644
index 00000000000..08540d0c180
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr102207.c
@@ -0,0 +1,24 @@
+/* PR tree-optimization/102207 */
+/* { dg-do run { target int128 } } */
+/* { dg-options "-O2" } */
+
+typedef unsigned __int128 u128;
+
+u128
+foo (unsigned short a)
+{
+  u128 g;
+  __builtin_sub_overflow ((unsigned long long) -a, 1, &g);
+  return g;
+}
+
+int
+main ()
+{
+  if (__SIZEOF_LONG_LONG__ * __CHAR_BIT__ != 64
+      || __SIZEOF_SHORT__ * __CHAR_BIT__ != 16)
+    return 0;
+  if (foo (1) != 0xfffffffffffffffeULL)
+    __builtin_abort ();
+  return 0;
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-06  8:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-06  8:09 [gcc r12-3365] match.pd: Fix up __builtin_*_overflow arg demotion [PR102207] Jakub Jelinek

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).