From: "H.J. Lu" <hongjiu.lu@intel.com>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH] PR c++/69399: Add HAVE_WORKING_CXX_BUILTIN_CONSTANT_P
Date: Fri, 22 Jan 2016 18:55:00 -0000 [thread overview]
Message-ID: <20160122185533.GA3430@intel.com> (raw)
Without the fix for PR 65656, g++ miscompiles __builtin_constant_p in
wi::lrshift in wide-int.h. Add a check with PR 65656 testcase to verify
that C++ __builtin_constant_p works properly.
Tested on x86-64 with working GCC:
gcc/auto-host.h:/* #undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P */
prev-gcc/auto-host.h:/* #undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P */
stage1-gcc/auto-host.h:#define HAVE_WORKING_CXX_BUILTIN_CONSTANT_P 1
and broken GCC:
gcc/auto-host.h:/* #undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P */
prev-gcc/auto-host.h:/* #undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P */
stage1-gcc/auto-host.h:/* #undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P */
Ok for trunk?
Thanks.
H.J.
---
gcc/
PR c++/69399
* configure.ac: Check if C++ __builtin_constant_p works
properly.
(HAVE_WORKING_CXX_BUILTIN_CONSTANT_P): AC_DEFINE.
* system.h (STATIC_CONSTANT_P): Use __builtin_constant_p only
if HAVE_WORKING_CXX_BUILTIN_CONSTANT_P is defined.
* config.in: Regenerated.
* configure: Likewise.
gcc/testsuite/
PR c++/69399
* gcc.dg/torture/pr69399.c: New test.
---
gcc/config.in | 10 ++++++++-
gcc/configure | 41 ++++++++++++++++++++++++++++++++--
gcc/configure.ac | 27 ++++++++++++++++++++++
gcc/system.h | 2 +-
gcc/testsuite/gcc.dg/torture/pr69399.c | 21 +++++++++++++++++
5 files changed, 97 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/torture/pr69399.c
diff --git a/gcc/config.in b/gcc/config.in
index 1796e1d..11ebf5c 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1846,6 +1846,13 @@
#endif
+/* Define this macro if C++ __builtin_constant_p with constexpr does not crash
+ with a variable. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_WORKING_CXX_BUILTIN_CONSTANT_P
+#endif
+
+
/* Define to 1 if `fork' works. */
#ifndef USED_FOR_TARGET
#undef HAVE_WORKING_FORK
@@ -1865,7 +1872,8 @@
#endif
-/* Define if your assembler supports .dwsect 0xB0000 */
+/* Define if your assembler supports AIX debug frame section label reference.
+ */
#ifndef USED_FOR_TARGET
#undef HAVE_XCOFF_DWARF_EXTRAS
#endif
diff --git a/gcc/configure b/gcc/configure
index ff646e8..2798231 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -6534,6 +6534,43 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
+# Check if C++ __builtin_constant_p works properly. Without the fix
+# for PR 65656, g++ miscompiles __builtin_constant_p in wi::lrshift in
+# wide-int.h. Add a check with PR 65656 testcase to verify that C++
+# __builtin_constant_p works properly.
+if test "$GCC" = yes; then
+ saved_CFLAGS="$CFLAGS"
+ saved_CXXFLAGS="$CXXFLAGS"
+ CFLAGS="$CFLAGS -O -x c++ -std=c++11"
+ CXXFLAGS="$CXXFLAGS -O -x c++ -std=c++11"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX __builtin_constant_p works with constexpr" >&5
+$as_echo_n "checking whether $CXX __builtin_constant_p works with constexpr... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+foo (int argc)
+{
+ constexpr bool x = __builtin_constant_p(argc);
+ return x ? 1 : 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_WORKING_CXX_BUILTIN_CONSTANT_P 1" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$saved_CFLAGS"
+ CXXFLAGS="$saved_CXXFLAGS"
+fi
+
# Check whether compiler is affected by placement new aliasing bug (PR 29286).
# If the host compiler is affected by the bug, and we build with optimization
# enabled (which happens e.g. when cross-compiling), the pool allocator may
@@ -18419,7 +18456,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 18422 "configure"
+#line 18459 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -18525,7 +18562,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 18528 "configure"
+#line 18565 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 4dc7c10..9791a96 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -416,6 +416,33 @@ struct X<long long> { typedef long long t; };
]], [[X<int64_t>::t x;]])],[],[AC_MSG_ERROR([error verifying int64_t uses long long])])
fi
+# Check if C++ __builtin_constant_p works properly. Without the fix
+# for PR 65656, g++ miscompiles __builtin_constant_p in wi::lrshift in
+# wide-int.h. Add a check with PR 65656 testcase to verify that C++
+# __builtin_constant_p works properly.
+if test "$GCC" = yes; then
+ saved_CFLAGS="$CFLAGS"
+ saved_CXXFLAGS="$CXXFLAGS"
+ CFLAGS="$CFLAGS -O -x c++ -std=c++11"
+ CXXFLAGS="$CXXFLAGS -O -x c++ -std=c++11"
+ AC_MSG_CHECKING(whether $CXX __builtin_constant_p works with constexpr)
+ AC_COMPILE_IFELSE([
+int
+foo (int argc)
+{
+ constexpr bool x = __builtin_constant_p(argc);
+ return x ? 1 : 0;
+}
+],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_WORKING_CXX_BUILTIN_CONSTANT_P, 1,
+[Define this macro if C++ __builtin_constant_p with constexpr does not
+ crash with a variable.])],
+ [AC_MSG_RESULT([no])])
+ CFLAGS="$saved_CFLAGS"
+ CXXFLAGS="$saved_CXXFLAGS"
+fi
+
# Check whether compiler is affected by placement new aliasing bug (PR 29286).
# If the host compiler is affected by the bug, and we build with optimization
# enabled (which happens e.g. when cross-compiling), the pool allocator may
diff --git a/gcc/system.h b/gcc/system.h
index ba2e963..e57787b 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -729,7 +729,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
#define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__))
#endif
-#if GCC_VERSION >= 3001
+#if GCC_VERSION >= 3001 && defined HAVE_WORKING_CXX_BUILTIN_CONSTANT_P
#define STATIC_CONSTANT_P(X) (__builtin_constant_p (X) && (X))
#else
#define STATIC_CONSTANT_P(X) (false && (X))
diff --git a/gcc/testsuite/gcc.dg/torture/pr69399.c b/gcc/testsuite/gcc.dg/torture/pr69399.c
new file mode 100644
index 0000000..3e17169
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr69399.c
@@ -0,0 +1,21 @@
+/* { dg-do run { target int128 } } */
+
+typedef __UINT64_TYPE__ u64;
+typedef unsigned __int128 u128;
+
+static unsigned __attribute__((noinline, noclone))
+foo(u64 u)
+{
+ u128 v = u | 0xffffff81;
+ v >>= 64;
+ return v;
+}
+
+int
+main()
+{
+ unsigned x = foo(27);
+ if (x != 0)
+ __builtin_abort();
+ return 0;
+}
--
2.5.0
next reply other threads:[~2016-01-22 18:55 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-22 18:55 H.J. Lu [this message]
2016-01-25 12:40 ` Richard Biener
2016-01-25 16:25 ` H.J. Lu
2016-01-26 15:54 ` Richard Biener
2016-01-26 16:13 ` Jakub Jelinek
2016-01-26 18:21 ` [PATCH] Fix up wi::lrshift (PR c++/69399) Jakub Jelinek
2016-01-26 19:03 ` Mike Stump
2016-01-26 19:17 ` Jakub Jelinek
2016-01-26 20:14 ` H.J. Lu
2016-01-26 20:21 ` Richard Sandiford
2016-01-26 20:45 ` Richard Biener
2016-01-26 21:26 ` Jakub Jelinek
2016-01-26 21:58 ` Mike Stump
2016-01-26 23:42 ` Jakub Jelinek
2016-01-27 10:38 ` Richard Biener
2016-01-27 11:36 ` Jakub Jelinek
2016-01-26 21:49 ` Mike Stump
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=20160122185533.GA3430@intel.com \
--to=hongjiu.lu@intel.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hjl.tools@gmail.com \
/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).