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

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
I see differences in EH as well (comparing .original dumps of gnu++14 vs.
gnu++17):

@@ -126,7 +126,7 @@
 ;; enabled by -tree-original


-<<< Unknown tree: eh_spec_block
+<<< Unknown tree: must_not_throw_expr
   <<cleanup_point return <retval> = __builtin_constant_p (__c) == 0 ||
(unsigned int) __c > 127 ? __btowc_alias (__c) : (wint_t) __c>>
    >>>;
 __builtin_unreachable ();

and

-;; Function static void
std::char_traits<char>::assign(std::char_traits<char>::char_type&, const
char_type&) (null)
+;; Function static constexpr void
std::char_traits<char>::assign(std::char_traits<char>::char_type&, const
char_type&) (null)


But the biggest difference seems to be the introduction of

;; Function constexpr bool std::__constant_string_p(const _CharT*) [with _CharT
= char] (null)
;; enabled by -tree-original


while (1)
  {
    if (__builtin_constant_p ((char) *__s) == 0 || *__s == 0) goto <D.10182>;
    <<cleanup_point <<< Unknown tree: expr_stmt
  (void) __s++  >>>>>;
  }
<D.10182>:;
return <retval> = __builtin_constant_p ((char) *__s) != 0;

which inlined survices as

  <bb 2> [local count: 1073741826]:
  MEM[(struct  &)&a] ={v} {CLOBBER};
  _59 = &a.D.22134._M_local_buf;
  MEM[(struct  &)&a] ={v} {CLOBBER};
  MEM[(struct _Alloc_hider *)&a]._M_p = _59;

  <bb 3> [local count: 10037315480]:
  # __s_63 = PHI <"Hello world"(2), __s_66(5)>
  _64 = *__s_63;
  _65 = __builtin_constant_p (_64);
  if (_65 == 0)
    goto <bb 6>; [5.50%]
  else
    goto <bb 4>; [94.50%]

which we are not able to simplify and which confuses us in optimizing.
Only the first DOM pass forcefully drops that to false.  This seems to be
a quite stupid loop structure btw resulting from

std::char_traits<char>::length (const char_type * __s)
{
  bool retval.1;
  size_t D.33082;

  retval.1 = std::__constant_string_p<char> (__s);
  if (retval.1 != 0) goto <D.33080>; else goto <D.33081>;
  <D.33080>:
  D.33082 = __gnu_cxx::char_traits<char>::length (__s);
  return D.33082;
  <D.33081>:
  D.33082 = __builtin_strlen (__s);
  return D.33082;
}

and

std::__constant_string_p<char> (const char * __s)
{
  bool D.33088;

  <bb 2> :
  _1 = *__s;
  _2 = __builtin_constant_p (_1);
  if (_2 == 0)
    goto <bb 5>; [INV]
  else
    goto <bb 3>; [INV]

  <bb 3> :
  _3 = *__s;
  if (_3 == 0)
    goto <bb 5>; [INV]
  else
    goto <bb 4>; [INV]

  <bb 4> :
  __s = __s + 1;
  goto <bb 2>; [INV]

  <bb 5> :
  _4 = *__s;
  _5 = __builtin_constant_p (_4);
  D.33088 = _5 != 0;
  return D.33088;

}

  /**
   *  @brief Determine whether the characters of a NULL-terminated
   *  string are known at compile time.
   *  @param  __s  The string.
   *
   *  Assumes that _CharT is a built-in character type.
   */
  template<typename _CharT>
    static _GLIBCXX_ALWAYS_INLINE constexpr bool
    __constant_string_p(const _CharT* __s)
    {
      while (__builtin_constant_p(*__s) && *__s)
        __s++;
      return __builtin_constant_p(*__s);
    }

WTF?

Reply via email to