public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-7080] libstdc++: Improve test codegen for interpreting assembly
@ 2021-02-03 15:51 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2021-02-03 15:51 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:af60e4bd4b69f39173a8347aa2dcdaa40227ec67

commit r11-7080-gaf60e4bd4b69f39173a8347aa2dcdaa40227ec67
Author: Matthias Kretz <kretz@kde.org>
Date:   Wed Feb 3 15:49:30 2021 +0000

    libstdc++: Improve test codegen for interpreting assembly
    
    In many failure cases it is helpful to inspect the instructions leading
    up to the test failure. After this change the location is easier to find
    and the branch after failure is easier to find.
    
    libstdc++-v3/ChangeLog:
    
            * testsuite/experimental/simd/tests/bits/verify.h (verify): Add
            instruction pointer data member. Ensure that the `if (m_failed)`
            branch is always inlined into the calling code. The body of the
            conditional can still be a function call. Move the get_ip call
            into the verify ctor to simplify the ctor calls.
            (COMPARE): Don't mention the use of all_of for reduction of a
            simd_mask. It only distracts from the real issue.

Diff:
---
 .../experimental/simd/tests/bits/verify.h          | 44 +++++++++++-----------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/libstdc++-v3/testsuite/experimental/simd/tests/bits/verify.h b/libstdc++-v3/testsuite/experimental/simd/tests/bits/verify.h
index 826cfc34b5f..82016c66802 100644
--- a/libstdc++-v3/testsuite/experimental/simd/tests/bits/verify.h
+++ b/libstdc++-v3/testsuite/experimental/simd/tests/bits/verify.h
@@ -60,6 +60,7 @@ template <class T>
 class verify
 {
   const bool m_failed = false;
+  size_t m_ip = 0;
 
   template <typename T,
 	    typename = decltype(std::declval<std::stringstream&>()
@@ -129,20 +130,21 @@ class verify
 
 public:
   template <typename... Ts>
-    verify(bool ok, size_t ip, const char* file, const int line,
+    [[gnu::always_inline]]
+    verify(bool ok, const char* file, const int line,
 	   const char* func, const char* cond, const Ts&... extra_info)
-    : m_failed(!ok)
+    : m_failed(!ok), m_ip(get_ip())
     {
       if (m_failed)
-	{
+	[&] {
 	  __builtin_fprintf(stderr, "%s:%d: (%s):\nInstruction Pointer: %x\n"
 				    "Assertion '%s' failed.\n",
-			    file, line, func, ip, cond);
+			    file, line, func, m_ip, cond);
 	  (print(extra_info, int()), ...);
-	}
+	}();
     }
 
-  ~verify()
+  [[gnu::always_inline]] ~verify()
   {
     if (m_failed)
       {
@@ -152,26 +154,27 @@ public:
   }
 
   template <typename T>
+    [[gnu::always_inline]]
     const verify&
     operator<<(const T& x) const
     {
       if (m_failed)
-	{
-	  print(x, int());
-	}
+	print(x, int());
       return *this;
     }
 
   template <typename... Ts>
+    [[gnu::always_inline]]
     const verify&
     on_failure(const Ts&... xs) const
     {
       if (m_failed)
-	(print(xs, int()), ...);
+	[&] { (print(xs, int()), ...); }();
       return *this;
     }
 
-  [[gnu::always_inline]] static inline size_t
+  [[gnu::always_inline]] static inline
+  size_t
   get_ip()
   {
     size_t _ip = 0;
@@ -220,24 +223,21 @@ template <typename T>
 
 #define COMPARE(_a, _b)                                                        \
   [&](auto&& _aa, auto&& _bb) {                                                \
-    return verify(std::experimental::all_of(_aa == _bb), verify::get_ip(),     \
-		  __FILE__, __LINE__, __PRETTY_FUNCTION__,                     \
-		  "all_of(" #_a " == " #_b ")", #_a " = ", _aa,                \
+    return verify(std::experimental::all_of(_aa == _bb), __FILE__, __LINE__,   \
+		  __PRETTY_FUNCTION__, #_a " == " #_b, #_a " = ", _aa,         \
 		  "\n" #_b " = ", _bb);                                        \
   }(force_fp_truncation(_a), force_fp_truncation(_b))
 #else
 #define COMPARE(_a, _b)                                                        \
   [&](auto&& _aa, auto&& _bb) {                                                \
-    return verify(std::experimental::all_of(_aa == _bb), verify::get_ip(),     \
-		  __FILE__, __LINE__, __PRETTY_FUNCTION__,                     \
-		  "all_of(" #_a " == " #_b ")", #_a " = ", _aa,                \
+    return verify(std::experimental::all_of(_aa == _bb), __FILE__, __LINE__,   \
+		  __PRETTY_FUNCTION__, #_a " == " #_b, #_a " = ", _aa,         \
 		  "\n" #_b " = ", _bb);                                        \
   }((_a), (_b))
 #endif
 
 #define VERIFY(_test)                                                          \
-  verify(_test, verify::get_ip(), __FILE__, __LINE__, __PRETTY_FUNCTION__,     \
-	 #_test)
+  verify(_test, __FILE__, __LINE__, __PRETTY_FUNCTION__, #_test)
 
   // ulp_distance_signed can raise FP exceptions and thus must be conditionally
   // executed
@@ -245,9 +245,9 @@ template <typename T>
   [&](auto&& _aa, auto&& _bb) {                                                \
     const bool success = std::experimental::all_of(                            \
       vir::test::ulp_distance(_aa, _bb) <= (_allowed_distance));               \
-    return verify(success, verify::get_ip(), __FILE__, __LINE__,               \
-		  __PRETTY_FUNCTION__, "all_of(" #_a " ~~ " #_b ")",           \
-		  #_a " = ", _aa, "\n" #_b " = ", _bb, "\ndistance = ",        \
+    return verify(success, __FILE__, __LINE__, __PRETTY_FUNCTION__,            \
+		  #_a " ~~ " #_b, #_a " = ", _aa, "\n" #_b " = ", _bb,         \
+		  "\ndistance = ",                                             \
 		  success ? 0 : vir::test::ulp_distance_signed(_aa, _bb));     \
   }((_a), (_b))


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

only message in thread, other threads:[~2021-02-03 15:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-03 15:51 [gcc r11-7080] libstdc++: Improve test codegen for interpreting assembly Jonathan Wakely

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