public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] __builtin_expect cleanup for iconvdata/*.c
@ 2014-09-08 19:42 Florian Weimer
  2014-09-08 19:48 ` Andreas Schwab
                   ` (5 more replies)
  0 siblings, 6 replies; 17+ messages in thread
From: Florian Weimer @ 2014-09-08 19:42 UTC (permalink / raw)
  To: GNU C Library

[-- Attachment #1: Type: text/plain, Size: 945 bytes --]

As promised, this patch cleans up the __builtin_expect use in iconvdata/*.c.

I have compiled glibc with these patches and without, with a definition

#define __builtin_expect(a, b) (a)

in place.  There were no object code differences (as shown by objdump -d 
--reloc) in these builds.

When __builtin_expect is active, there are differences because the GCC 
optimizers sometimes treat semantically equivalent __builtin_expect 
annotations differently.

I tested these patches on Fedora 20, x86_64 (without the 
__builtin_expect kludge), with no regression.

Writing meaningful ChangeLog entries is a bit of a challenge because 
most of the changes are in a macro called BODY, and usually, there are 
two such macros in each file.  I would suggest to create ChangeLog 
entries for each real function change (mostly gconv_init), and otherwise 
list just the files with "Replace __builtin_expect.".

-- 
Florian Weimer / Red Hat Product Security

[-- Attachment #2: 0001-Manual-part-of-iconvdata-__builtin_expect-cleanup.patch --]
[-- Type: text/x-patch, Size: 12761 bytes --]

From 98ee48500f419b5592cc36537a7e6db0bbc320e9 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Mon, 8 Sep 2014 16:21:57 +0200
Subject: [PATCH 1/2] Manual part of iconvdata/* __builtin_expect cleanup

---
 ChangeLog                | 8 ++++++++
 iconv/loop.c             | 2 +-
 iconv/skeleton.c         | 4 ++--
 iconvdata/8bit-generic.c | 2 +-
 iconvdata/ansi_x3.110.c  | 5 ++---
 iconvdata/big5.c         | 4 ++--
 iconvdata/euc-kr.c       | 4 ++--
 iconvdata/gb18030.c      | 2 +-
 iconvdata/gbk.c          | 2 +-
 iconvdata/iso-2022-jp.c  | 7 +++----
 iconvdata/iso646.c       | 6 +++---
 iconvdata/iso_6937-2.c   | 3 +--
 iconvdata/iso_6937.c     | 3 +--
 iconvdata/johab.c        | 2 +-
 iconvdata/t.61.c         | 3 +--
 iconvdata/utf-16.c       | 2 +-
 iconvdata/utf-32.c       | 2 +-
 iconvdata/utf-7.c        | 2 +-
 18 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5262ede..c086664 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2014-09-08  Florian Weimer  <fweimer@redhat.com>
 
+	* iconv/loop.c (SINGLE(LOOPFCT)): Replace __builtin_expect with
+	__glibc_unlikely.
+	* iconv/skeleton.c (gconv_init): Replace __builtin_expect with
+	__glibc_likely.
+	(FUNCTION_NAME): Replace __builtin_expect with __glibc_unlikely.
+
+2014-09-08  Florian Weimer  <fweimer@redhat.com>
+
 	* Makeconfig (.NOEXPORT): Remove, no longer supported by GNU Make.
 	(CHARSET, GCONV_PATH, I18NPATH, LANG, LANGUAGE, LANGUAGES,
 	LC_ADDRESS, LC_ALL, LC_COLLATE, LC_CTYPE, LC_IDENTIFICATION,
diff --git a/iconv/loop.c b/iconv/loop.c
index a480c0c..38f00ce 100644
--- a/iconv/loop.c
+++ b/iconv/loop.c
@@ -394,7 +394,7 @@ SINGLE(LOOPFCT) (struct __gconv_step *step,
 
   /* Are there enough bytes in the input buffer?  */
   if (MIN_NEEDED_INPUT > 1
-      && __builtin_expect (inptr + (MIN_NEEDED_INPUT - inlen) > inend, 0))
+      && __glibc_unlikely (inptr + (MIN_NEEDED_INPUT - inlen) > inend))
     {
       *inptrp = inend;
 #  ifdef STORE_REST
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index 73dc186..437da17 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -333,7 +333,7 @@ gconv_init (struct __gconv_step *step)
       step->__btowc_fct = FROM_ONEBYTE;
 #endif
     }
-  else if (__builtin_expect (strcmp (step->__to_name, CHARSET_NAME), 0) == 0)
+  else if (__glibc_likely (strcmp (step->__to_name, CHARSET_NAME) == 0))
     {
       step->__data = TO_DIRECTION_VAL;
 
@@ -573,7 +573,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
 #  endif
 # endif
 
-	  if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
+	  if (__glibc_unlikely (status != __GCONV_OK))
 	    return status;
 	}
 #endif
diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c
index efc0fd5..f61a424 100644
--- a/iconvdata/8bit-generic.c
+++ b/iconvdata/8bit-generic.c
@@ -68,7 +68,7 @@
   {									      \
     uint32_t ch = get32 (inptr);					      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]), 0)\
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]))   \
 	|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0))	      \
       {									      \
 	UNICODE_TAG_HANDLER (ch, 4);					      \
diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c
index d602dfa..d0f3f3f 100644
--- a/iconvdata/ansi_x3.110.c
+++ b/iconvdata/ansi_x3.110.c
@@ -472,8 +472,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-	0))								      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))  \
       {									      \
 	if (ch == 0x2c7)						      \
 	  cp = "\xcf\x20";						      \
@@ -543,7 +542,7 @@ static const char from_ucs4[][2] =
 	    tmp[1] = '\0';						      \
 	    cp = tmp;							      \
 	  }								      \
-	else if (__builtin_expect (ch, 0x266a) == 0x266a)		      \
+	else if (__glibc_likely (ch == 0x266a))				      \
 	  cp = "\xd5";							      \
 	else								      \
 	  {								      \
diff --git a/iconvdata/big5.c b/iconvdata/big5.c
index ee3dede..a4b56a7 100644
--- a/iconvdata/big5.c
+++ b/iconvdata/big5.c
@@ -8467,8 +8467,8 @@ static const char from_ucs4_tab15[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= (sizeof (from_ucs4_tab1)		      \
-				 / sizeof (from_ucs4_tab1[0])), 0))	      \
+    if (__glibc_unlikely						      \
+	(ch >= (sizeof (from_ucs4_tab1) / sizeof (from_ucs4_tab1[0]))))       \
       switch (ch)							      \
 	{								      \
         case 0x2c7 ... 0x2d9:						      \
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index 3b13c2e..3025f6a 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -38,8 +38,8 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
 	  cp[0] = '\xa3';
 	  cp[1] = '\xdc';
 	}
-      else if (__builtin_expect (ucs4_to_ksc5601 (ch, cp, 2), 0)
-	  != __UNKNOWN_10646_CHAR)
+      else if (__glibc_likely (ucs4_to_ksc5601 (ch, cp, 2)
+			       != __UNKNOWN_10646_CHAR))
 	{
 	  cp[0] |= 0x80;
 	  cp[1] |= 0x80;
diff --git a/iconvdata/gb18030.c b/iconvdata/gb18030.c
index f12c451..d6fc76e 100644
--- a/iconvdata/gb18030.c
+++ b/iconvdata/gb18030.c
@@ -24350,7 +24350,7 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
 	else								      \
 	  len = 0;							      \
 									      \
-	if (__builtin_expect (len, 2) == 0				      \
+	if (__glibc_unlikely (len == 0)					      \
 	    || (len == 2 && __builtin_expect (cp[0], '\1') == '\0'))          \
 	  {								      \
 	    /* Illegal character.  */					      \
diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
index b1a7719..e27312e 100644
--- a/iconvdata/gbk.c
+++ b/iconvdata/gbk.c
@@ -13171,7 +13171,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
 	  /* All second bytes of a multibyte character must be >= 0x40, and   \
 	     the __gbk_to_ucs table only covers the range up to 0xfe 0xa0. */ \
 	  if (__builtin_expect (ch2 < 0x40, 0)				      \
-	      || (__builtin_expect (ch, 0x81) == 0xfe && ch2 > 0xa0))	      \
+	      || (__glibc_unlikely (ch == 0xfe && ch2 > 0xa0)))		      \
 	    {								      \
 	      /* This is an illegal character.  */			      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 8381c30..88ca5bb 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -164,7 +164,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, from_iso2022jp) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data
 	= (struct iso2022jp_data *) malloc (sizeof (struct iso2022jp_data));
@@ -379,7 +379,7 @@ gconv_end (struct __gconv_step *data)
 	    ch = inptr[2] | 0x80;					      \
 	    inptr += 3;							      \
 	  }								      \
-	else if (__builtin_expect (set2, ISO88597_set) == ISO88597_set)	      \
+	else if (__glibc_likely (set2 == ISO88597_set))			      \
 	  {								      \
 	    /* We use the table from the ISO 8859-7 module.  */		      \
 	    if (inptr[2] < 0x20 || inptr[2] >= 0x80)			      \
@@ -770,8 +770,7 @@ static const cvlist_t conversion_lists[4] =
 			    {						      \
 			      if (set2 != ISO88597_set)			      \
 				{					      \
-				  if (__builtin_expect (outptr + 3 > outend,  \
-							0))		      \
+				  if (__glibc_unlikely (outptr + 3 > outend)) \
 				    {					      \
 				      res = __GCONV_FULL_OUTPUT;	      \
 				      break;				      \
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index 5a0402e..b540e7f 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -146,7 +146,7 @@ gconv_init (struct __gconv_step *step)
       }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, from_iso646) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct iso646_data *) malloc (sizeof (struct iso646_data));
 
@@ -406,7 +406,7 @@ gconv_end (struct __gconv_step *data)
 									      \
     /* Hopefully gcc can recognize that the following `if' is only true	      \
        when we reach the default case in the `switch' statement.  */	      \
-    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+    if (__glibc_unlikely (failure == __GCONV_ILLEGAL_INPUT))		      \
       {									      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
       }									      \
@@ -880,7 +880,7 @@ gconv_end (struct __gconv_step *data)
 	break;								      \
       }									      \
 									      \
-    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+    if (__glibc_unlikely (failure == __GCONV_ILLEGAL_INPUT))		      \
       {									      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
       }									      \
diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c
index 8aba77d..9090e6f 100644
--- a/iconvdata/iso_6937-2.c
+++ b/iconvdata/iso_6937-2.c
@@ -462,8 +462,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))  \
       {									      \
 	switch (ch)							      \
 	  {								      \
diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c
index f7bbcf0..04841bd 100644
--- a/iconvdata/iso_6937.c
+++ b/iconvdata/iso_6937.c
@@ -462,8 +462,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))  \
       {									      \
 	int fail = 0;							      \
 	switch (ch)							      \
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 5b5f042..01375e3 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -225,7 +225,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 		  ch = init_to_ucs[i - 1];				      \
 		else if (i == 0 && m > 0 && f == 0)			      \
 		  ch = 0x314e + m;	/* 0x314f + m - 1 */		      \
-		else if (__builtin_expect ((i | m) == 0, 1)		      \
+		else if (__glibc_likely ((i | m) == 0)			      \
 			 && __builtin_expect (f > 0, 1))		      \
 		  ch = final_to_ucs[f - 1];	/* round trip?? */	      \
 		else							      \
diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c
index e082b50..13f1f28 100644
--- a/iconvdata/t.61.c
+++ b/iconvdata/t.61.c
@@ -448,8 +448,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))  \
       {									      \
 	if (__builtin_expect (ch, 0) == 0x2126)				      \
 	  cp = "\xe0";							      \
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c
index 31c2d6e..342de08 100644
--- a/iconvdata/utf-16.c
+++ b/iconvdata/utf-16.c
@@ -148,7 +148,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, to_utf16) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct utf16_data *) malloc (sizeof (struct utf16_data));
 
diff --git a/iconvdata/utf-32.c b/iconvdata/utf-32.c
index e3e4243..3e196ac 100644
--- a/iconvdata/utf-32.c
+++ b/iconvdata/utf-32.c
@@ -145,7 +145,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, to_utf32) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct utf32_data *) malloc (sizeof (struct utf32_data));
 
diff --git a/iconvdata/utf-7.c b/iconvdata/utf-7.c
index 637d85c..74a8e5b 100644
--- a/iconvdata/utf-7.c
+++ b/iconvdata/utf-7.c
@@ -219,7 +219,7 @@ base64 (unsigned int i)
 	    /* If accumulated data is nonzero, the input is invalid.  */      \
 	    /* Also, partial UTF-16 characters are invalid.  */		      \
 	    if (__builtin_expect (statep->__value.__wch != 0, 0)	      \
-		|| __builtin_expect ((statep->__count >> 3) <= 26, 0))	      \
+		|| __glibc_unlikely ((statep->__count >> 3) <= 26))	      \
 	      {								      \
 		STANDARD_FROM_LOOP_ERR_HANDLER ((statep->__count = 0, 1));    \
 	      }								      \
-- 
1.9.3


[-- Attachment #3: 0002-Automated-part-of-the-iconvdata-__builtin_expect-cle.patch --]
[-- Type: text/x-patch, Size: 89553 bytes --]

From df3f31515da3130933736214a1a788e1de7232b4 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Mon, 8 Sep 2014 20:58:16 +0200
Subject: [PATCH 2/2] Automated part of the iconvdata/* __builtin_expect
 cleanup

This commit was generated with the following Perl script.

#!/usr/bin/perl

use strict;
use warnings;

use Text::Tabs;

sub process ($) {
    my ($path) = @_;
    open my $in, '<', $path or die "cannot open $path: $!";
    open my $out, '>', "$path.tmp" or die "cannot open $path.tpm: $!";
    while (<$in>) {
	my $length;
	if (/\\\s*$/) {
	    $length = length(expand($_)) - 2;
	}

	my $old = $_;
	s/__builtin_expect ?\(([^()]+), 0\)/__glibc_unlikely ($1)/g;
	s/__builtin_expect ?\(([^()]+), 1\)/__glibc_likely ($1)/g;
	s/__builtin_expect ?\(([^()]+), '\\1'\) == '\\0'/__glibc_unlikely ($1 == '\\0')/g;
	s/__builtin_expect ?\(([^()]+), '\\1'\) != '\\0'/__glibc_likely ($1 != '\\0')/g;
	s/__builtin_expect ?\(([^()]+), '\\1'\) == 0/__glibc_unlikely ($1 == 0)/g;
	s/__builtin_expect ?\(([^()]+), 1\) == 0/__glibc_unlikely ($1 == 0)/g;
	s/__builtin_expect ?\(([^()]+), L'\\1'\) ?== ?L'\\0'/__glibc_unlikely ($1 == L'\\0')/g;

	# For changed lines, fix the position of the line continuation
	# if any.
	if ($_ ne $old && $length) {
	    $_ = expand($_);
	    s/\s*\\\s*$//;
	    while (length($_) < $length) {
		$_ .= ' ';
	    }
	    $_ = unexpand("$_\\\n");
	}

	print $out $_ or die;
    }
    rename "$path.tmp", $path or die;
}

for my $path (<iconvdata/*.c>, qw(iconv/skeleton.c iconv/loop.c)) {
    process $path;
}
---
 iconv/loop.c              |  6 +++---
 iconv/skeleton.c          |  4 ++--
 iconvdata/8bit-gap.c      | 10 +++++-----
 iconvdata/8bit-generic.c  |  6 +++---
 iconvdata/ansi_x3.110.c   | 12 ++++++------
 iconvdata/big5.c          | 10 +++++-----
 iconvdata/big5hkscs.c     |  4 ++--
 iconvdata/cp1255.c        |  2 +-
 iconvdata/cp1258.c        |  2 +-
 iconvdata/cp932.c         | 34 +++++++++++++++++-----------------
 iconvdata/euc-cn.c        |  8 ++++----
 iconvdata/euc-jp-ms.c     | 24 ++++++++++++------------
 iconvdata/euc-jp.c        |  8 ++++----
 iconvdata/euc-kr.c        | 10 +++++-----
 iconvdata/euc-tw.c        |  8 ++++----
 iconvdata/gb18030.c       |  4 ++--
 iconvdata/gbbig5.c        | 12 ++++++------
 iconvdata/gbgbk.c         | 18 +++++++++---------
 iconvdata/gbk.c           | 12 ++++++------
 iconvdata/ibm1364.c       | 20 ++++++++++----------
 iconvdata/ibm930.c        | 20 ++++++++++----------
 iconvdata/ibm932.c        | 22 +++++++++++-----------
 iconvdata/ibm933.c        | 20 ++++++++++----------
 iconvdata/ibm935.c        | 20 ++++++++++----------
 iconvdata/ibm937.c        | 20 ++++++++++----------
 iconvdata/ibm939.c        | 20 ++++++++++----------
 iconvdata/ibm943.c        | 24 ++++++++++++------------
 iconvdata/iso-2022-cn.c   | 26 +++++++++++++-------------
 iconvdata/iso-2022-jp-3.c |  6 +++---
 iconvdata/iso-2022-jp.c   | 36 ++++++++++++++++++------------------
 iconvdata/iso-2022-kr.c   | 14 +++++++-------
 iconvdata/iso_6937-2.c    | 10 +++++-----
 iconvdata/iso_6937.c      | 10 +++++-----
 iconvdata/johab.c         | 34 +++++++++++++++++-----------------
 iconvdata/sjis.c          | 24 ++++++++++++------------
 iconvdata/t.61.c          | 20 ++++++++++----------
 iconvdata/tcvn5712-1.c    |  2 +-
 iconvdata/tscii.c         |  2 +-
 iconvdata/uhc.c           | 26 +++++++++++++-------------
 iconvdata/utf-16.c        | 12 ++++++------
 iconvdata/utf-32.c        |  2 +-
 iconvdata/utf-7.c         |  4 ++--
 42 files changed, 294 insertions(+), 294 deletions(-)

diff --git a/iconv/loop.c b/iconv/loop.c
index 38f00ce..3d831c9 100644
--- a/iconv/loop.c
+++ b/iconv/loop.c
@@ -307,7 +307,7 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
 	 compiler generating better code.  They will be optimized away
 	 since MIN_NEEDED_OUTPUT is always a constant.  */
       if (MIN_NEEDED_INPUT > 1
-	  && __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0))
+	  && __glibc_unlikely (inptr + MIN_NEEDED_INPUT > inend))
 	{
 	  /* We don't have enough input for another complete input
 	     character.  */
@@ -315,9 +315,9 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
 	  break;
 	}
       if ((MIN_NEEDED_OUTPUT != 1
-	   && __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0))
+	   && __glibc_unlikely (outptr + MIN_NEEDED_OUTPUT > outend))
 	  || (MIN_NEEDED_OUTPUT == 1
-	      && __builtin_expect (outptr >= outend, 0)))
+	      && __glibc_unlikely (outptr >= outend)))
 	{
 	  /* Overflow in the output buffer.  */
 	  result = __GCONV_FULL_OUTPUT;
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index 437da17..b1c5f01 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -503,7 +503,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
     {
       /* We preserve the initial values of the pointer variables.  */
       const unsigned char *inptr = *inptrp;
-      unsigned char *outbuf = (__builtin_expect (outbufstart == NULL, 1)
+      unsigned char *outbuf = (__glibc_likely (outbufstart == NULL)
 			       ? data->__outbuf : *outbufstart);
       unsigned char *outend = data->__outbufend;
       unsigned char *outstart;
@@ -772,7 +772,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
       if (((FROM_LOOP_MAX_NEEDED_FROM > 1 && TO_LOOP_MAX_NEEDED_FROM > 1)
 	   || (FROM_LOOP_MAX_NEEDED_FROM > 1 && FROM_DIRECTION)
 	   || (TO_LOOP_MAX_NEEDED_FROM > 1 && !FROM_DIRECTION))
-	  && __builtin_expect (consume_incomplete, 0)
+	  && __glibc_unlikely (consume_incomplete)
 	  && status == __GCONV_INCOMPLETE_INPUT)
 	{
 # ifdef STORE_REST
diff --git a/iconvdata/8bit-gap.c b/iconvdata/8bit-gap.c
index 3bd7149..5311522 100644
--- a/iconvdata/8bit-gap.c
+++ b/iconvdata/8bit-gap.c
@@ -53,7 +53,7 @@ struct gap
   {									      \
     uint32_t ch = to_ucs4[*inptr];					      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && NONNUL (*inptr))    \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && NONNUL (*inptr))       \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -71,7 +71,7 @@ struct gap
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && NONNUL (c))	      \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && NONNUL (c))	      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -97,10 +97,10 @@ struct gap
     else								      \
       while (ch > rp->end)						      \
 	++rp;								      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (res = from_ucs4[ch + rp->idx],				      \
-	    __builtin_expect (res, '\1') == '\0' && ch != 0))		      \
+	    __glibc_unlikely (res == '\0') && ch != 0)) 		      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c
index f61a424..3d6a7c5 100644
--- a/iconvdata/8bit-generic.c
+++ b/iconvdata/8bit-generic.c
@@ -37,7 +37,7 @@
   {									      \
     uint32_t ch = to_ucs4[*inptr];					      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && *inptr != '\0')     \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && *inptr != '\0')	      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -52,7 +52,7 @@
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && c != '\0')	      \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && c != '\0')	      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -69,7 +69,7 @@
     uint32_t ch = get32 (inptr);					      \
 									      \
     if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]))   \
-	|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0))	      \
+	|| (__glibc_unlikely (from_ucs4[ch] == '\0') && ch != 0))	      \
       {									      \
 	UNICODE_TAG_HANDLER (ch, 4);					      \
 									      \
diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c
index d0f3f3f..ecfabc3 100644
--- a/iconvdata/ansi_x3.110.c
+++ b/iconvdata/ansi_x3.110.c
@@ -402,7 +402,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = *inptr;						      \
     int incr;								      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -417,8 +417,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -435,7 +435,7 @@ static const char from_ucs4[][2] =
 	incr = 1;							      \
       }									      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+    if (__glibc_unlikely (ch == 0) && *inptr != '\0')			      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (incr);				      \
@@ -453,7 +453,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && c != '\0')			      \
+    if (__glibc_unlikely (ch == 0) && c != '\0')			      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -556,7 +556,7 @@ static const char from_ucs4[][2] =
       {									      \
 	cp = from_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+	if (__glibc_unlikely (cp[0] == '\0') && ch != 0)		      \
 	  {								      \
 	    /* Illegal characters.  */					      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/big5.c b/iconvdata/big5.c
index a4b56a7..e64b6ca 100644
--- a/iconvdata/big5.c
+++ b/iconvdata/big5.c
@@ -8414,8 +8414,8 @@ static const char from_ucs4_tab15[][2] =
 	/* See whether the second byte is in the correct range.  */	      \
 	if (ch2 >= 0x40 && ch2 <= 0x7e)					      \
 	  idx += ch2 - 0x40;						      \
-	else if (__builtin_expect (ch2 >= 0xa1, 1)			      \
-		 && __builtin_expect (ch2 <= 0xfe, 1))			      \
+	else if (__glibc_likely (ch2 >= 0xa1)				      \
+		 && __glibc_likely (ch2 <= 0xfe))			      \
 	  idx += 0x3f + (ch2 - 0xa1);					      \
 	else								      \
 	  {								      \
@@ -8555,7 +8555,7 @@ static const char from_ucs4_tab15[][2] =
     else								      \
       cp = from_ucs4_tab1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
@@ -8563,8 +8563,8 @@ static const char from_ucs4_tab15[][2] =
     else								      \
       {									      \
 	/* See whether there is enough room for the second byte we write.  */ \
-	if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	    && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	if (__glibc_likely (cp[1] != '\0')				      \
+	    && __glibc_unlikely (outptr + 1 >= outend)) 		      \
 	  {								      \
 	    /* We have not enough room.  */				      \
 	    result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c
index 5dce195..64cc161 100644
--- a/iconvdata/big5hkscs.c
+++ b/iconvdata/big5hkscs.c
@@ -18001,8 +18001,8 @@ static struct
 	      }								      \
 									      \
 	    /* See whether there is enough room to write the second byte.  */ \
-	    if (__builtin_expect (cp[1] != '\0', 1)			      \
-		&& __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 		/* We have not enough room.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/cp1255.c b/iconvdata/cp1255.c
index 1fab525..c4a3bec 100644
--- a/iconvdata/cp1255.c
+++ b/iconvdata/cp1255.c
@@ -307,7 +307,7 @@ static const struct { unsigned int idx; unsigned int len; } comp_table[8] = {
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/cp1258.c b/iconvdata/cp1258.c
index 5153eea..c93886f 100644
--- a/iconvdata/cp1258.c
+++ b/iconvdata/cp1258.c
@@ -465,7 +465,7 @@ static const struct
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/cp932.c b/iconvdata/cp932.c
index a358eda..33477e4 100644
--- a/iconvdata/cp932.c
+++ b/iconvdata/cp932.c
@@ -4552,9 +4552,9 @@ static const char from_ucs4_extra[229][2] =
 	ch += 0xfec0;                                                         \
 	++inptr;                                                              \
       }									      \
-    else if (__builtin_expect (ch, 0) == 0xa0				      \
-	     || __builtin_expect (ch <= 0x80, 0)			      \
-	     || __builtin_expect (ch > 0xfc, 0))			      \
+    else if (__glibc_unlikely (ch) == 0xa0				      \
+	     || __glibc_unlikely (ch <= 0x80)				      \
+	     || __glibc_unlikely (ch > 0xfc))				      \
       {									      \
 	/* These are illegal.  */					      \
 	if (! ignore_errors_p ())					      \
@@ -4585,16 +4585,16 @@ static const char from_ucs4_extra[229][2] =
 									      \
 	ch2 = inptr[1];							      \
 	idx = ch * 256 + ch2;						      \
-	if (__builtin_expect (ch2 < 0x40, 0)				      \
-	    || __builtin_expect (ch2 > 0xfc, 0)				      \
-	    || __builtin_expect (ch2 == 0x7f, 0)			      \
-	    || (__builtin_expect (idx > 0x84be, 0) && idx < 0x8740)	      \
-	    || (__builtin_expect (idx > 0x879c, 0) && idx < 0x889f)	      \
-	    || (__builtin_expect (idx > 0x88fc, 0) && idx < 0x8940)	      \
-	    || (__builtin_expect (idx > 0x9ffc, 0) && idx < 0xe040)	      \
-	    || (__builtin_expect (idx > 0xeaa4, 0) && idx < 0xed40)	      \
-	    || (__builtin_expect (idx > 0xeefc, 0) && idx < 0xf040)	      \
-	    || __builtin_expect (idx > 0xfc4b, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x40)				      \
+	    || __glibc_unlikely (ch2 > 0xfc)				      \
+	    || __glibc_unlikely (ch2 == 0x7f)				      \
+	    || (__glibc_unlikely (idx > 0x84be) && idx < 0x8740)	      \
+	    || (__glibc_unlikely (idx > 0x879c) && idx < 0x889f)	      \
+	    || (__glibc_unlikely (idx > 0x88fc) && idx < 0x8940)	      \
+	    || (__glibc_unlikely (idx > 0x9ffc) && idx < 0xe040)	      \
+	    || (__glibc_unlikely (idx > 0xeaa4) && idx < 0xed40)	      \
+	    || (__glibc_unlikely (idx > 0xeefc) && idx < 0xf040)	      \
+	    || __glibc_unlikely (idx > 0xfc4b)) 			      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    if (! ignore_errors_p ())					      \
@@ -4629,7 +4629,7 @@ static const char from_ucs4_extra[229][2] =
 	else								      \
 	  ch = cjk_block7[(ch - 0xfa) * 192 + ch2 - 0x40];		      \
 									      \
-	if (__builtin_expect (ch, 1) == 0)				      \
+	if (__glibc_likely (ch) == 0)					      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -4681,8 +4681,8 @@ static const char from_ucs4_extra[229][2] =
 	  }								      \
 	else if (ch >= 0xf929 && ch <= 0xfa2d)				      \
 	  cp = from_ucs4_cjkcpt[ch - 0xf929];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffe5, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffe5))			      \
 	  cp = from_ucs4_extra[ch - 0xff01];				      \
 	else								      \
 	  {								      \
@@ -4694,7 +4694,7 @@ static const char from_ucs4_extra[229][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/euc-cn.c b/iconvdata/euc-cn.c
index 0d625b4..e1781bc 100644
--- a/iconvdata/euc-cn.c
+++ b/iconvdata/euc-cn.c
@@ -45,8 +45,8 @@
     if (ch <= 0x7f)							      \
       ++inptr;								      \
     else								      \
-      if ((__builtin_expect (ch <= 0xa0, 0) && ch != 0x8e && ch != 0x8f)      \
-	  || __builtin_expect (ch > 0xfe, 0))				      \
+      if ((__glibc_unlikely (ch <= 0xa0) && ch != 0x8e && ch != 0x8f)	      \
+	  || __glibc_unlikely (ch > 0xfe))				      \
 	{								      \
 	  /* This is illegal.  */					      \
 	  STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -115,9 +115,9 @@
 	size_t found;							      \
 									      \
 	found = ucs4_to_gb2312 (ch, outptr, outend - outptr);		      \
-	if (__builtin_expect (found, 1) != 0)				      \
+	if (__glibc_likely (found) != 0)				      \
 	  {								      \
-	    if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (found) == __UNKNOWN_10646_CHAR)	      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/euc-jp-ms.c b/iconvdata/euc-jp-ms.c
index 8aed520..158e41e 100644
--- a/iconvdata/euc-jp-ms.c
+++ b/iconvdata/euc-jp-ms.c
@@ -4699,11 +4699,11 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    continue;							      \
 	  }								      \
 									      \
-	if (__builtin_expect(ch == 0x8e, 0))				      \
+	if (__glibc_unlikely (ch == 0x8e))				      \
 	  {								      \
 	    /* This is code set 2: half-width katakana.  */		      \
 	    ch = jisx0201_to_ucs4 (ch2);				      \
-	    /*if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)*/	      \
+	    /*if (__glibc_unlikely (ch) == __UNKNOWN_10646_CHAR)*/	      \
 	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	      {								      \
 		/* Illegal character.  */				      \
@@ -4722,7 +4722,7 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    const unsigned char *endp = inptr;				      \
 	    int mblen = 1;						      \
 									      \
-	    if (__builtin_expect(ch == 0x8f, 0))			      \
+	    if (__glibc_unlikely (ch == 0x8f))				      \
 	      {								      \
 		if (inend - inptr < 3)					      \
 		  ch = 0;						      \
@@ -4731,8 +4731,8 @@ static const unsigned char from_ucs4_extra[229][2] =
 		    unsigned char ch3 = (unsigned char)inptr[2];	      \
 		    mblen = 3;						      \
 									      \
-		    if (__builtin_expect(ch3 == 0xff, 0)		      \
-		        || __builtin_expect(ch3 < 0xa1, 0))		      \
+		    if (__glibc_unlikely (ch3 == 0xff)			      \
+			|| __glibc_unlikely (ch3 < 0xa1))		      \
 		      ch = __UNKNOWN_10646_CHAR;			      \
 		    else if (ch2 <= 0xf2)				      \
 		      {							      \
@@ -4769,13 +4769,13 @@ static const unsigned char from_ucs4_extra[229][2] =
 		      ch = __UNKNOWN_10646_CHAR;			      \
 		  }							      \
 	      }								      \
-	    else if (__builtin_expect(0xa1 <= ch, 1))			      \
+	    else if (__glibc_likely (0xa1 <= ch))			      \
 	      {								      \
 		mblen = 2;						      \
 									      \
 		if (inend - inptr < 2)					      \
 		  ch = 0;						      \
-		else if (__builtin_expect(ch2 == 0xff, 0))		      \
+		else if (__glibc_unlikely (ch2 == 0xff))		      \
 		  ch = __UNKNOWN_10646_CHAR;				      \
 		else if (ch <= 0xa8)					      \
 		  {							      \
@@ -4809,13 +4809,13 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    else							      \
 	      ch = __UNKNOWN_10646_CHAR;				      \
 									      \
-	    if (__builtin_expect (ch, 1) == 0)				      \
+	    if (__glibc_likely (ch) == 0)				      \
 	      {								      \
 		/* Not enough input available.  */			      \
 		result = __GCONV_INCOMPLETE_INPUT;			      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (ch) == __UNKNOWN_10646_CHAR)		      \
 	      {								      \
 		/* Illegal character.  */				      \
 		if (! ignore_errors_p ())				      \
@@ -4873,8 +4873,8 @@ static const unsigned char from_ucs4_extra[229][2] =
 	  }								      \
 	else if (ch >= 0xf929 && ch <= 0xfa2d)				      \
 	  cp = from_ucs4_cjkcpt[ch - 0xf929];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffe5, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffe5))			      \
 	  cp = from_ucs4_extra[ch - 0xff01];				      \
 	else								      \
 	  {								      \
@@ -4886,7 +4886,7 @@ static const unsigned char from_ucs4_extra[229][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/euc-jp.c b/iconvdata/euc-jp.c
index 7689250..b8bf9b5 100644
--- a/iconvdata/euc-jp.c
+++ b/iconvdata/euc-jp.c
@@ -76,7 +76,7 @@
 	  {								      \
 	    /* This is code set 2: half-width katakana.  */		      \
 	    ch = jisx0201_to_ucs4 (ch2);				      \
-	    if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (ch) == __UNKNOWN_10646_CHAR)		      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
 									      \
 	    inptr += 2;							      \
@@ -100,7 +100,7 @@
 		ch = jisx0208_to_ucs4 (&endp, inend - inptr, 0x80);	      \
 	      }								      \
 									      \
-	    if (__builtin_expect (ch, 1) == 0)				      \
+	    if (__glibc_likely (ch) == 0)				      \
 	      {								      \
 		/* Not enough input available.  */			      \
 		result = __GCONV_INCOMPLETE_INPUT;			      \
@@ -182,13 +182,13 @@
 		found = ucs4_to_jisx0212 (ch, outptr + 1,		      \
 					  outend - outptr - 1);		      \
 		  							      \
-		if (__builtin_expect (found, 1) == 0)			      \
+		if (__glibc_likely (found) == 0)			      \
 		  {							      \
 		    /* We ran out of space.  */				      \
 		    result = __GCONV_FULL_OUTPUT;			      \
 		    break;						      \
 		  }							      \
-		else if (__builtin_expect (found, 0) != __UNKNOWN_10646_CHAR) \
+		else if (__glibc_unlikely (found) != __UNKNOWN_10646_CHAR)    \
 		  {							      \
 		    /* It's a JIS 0212 character, adjust it for EUC-JP.  */   \
 		    *outptr++ = 0x8f;					      \
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index 3025f6a..7b8f0af 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -29,7 +29,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
 {
   if (ch > 0x9f)
     {
-      if (__builtin_expect (ch, 0) == 0x20a9)
+      if (__glibc_unlikely (ch) == 0x20a9)
 	{
 	  /* Half-width Korean Currency WON sign.  There is no
              equivalent in EUC-KR.  Some mappings use \x5c because
@@ -82,9 +82,9 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
       ++inptr;								      \
     /* 0xfe(->0x7e : row 94) and 0xc9(->0x59 : row 41) are		      \
        user-defined areas.  */						      \
-    else if (__builtin_expect (ch == 0xa0, 0)				      \
-	     || __builtin_expect (ch > 0xfe, 0)				      \
-	     || __builtin_expect (ch == 0xc9, 0))			      \
+    else if (__glibc_unlikely (ch == 0xa0)				      \
+	     || __glibc_unlikely (ch > 0xfe)				      \
+	     || __glibc_unlikely (ch == 0xc9))				      \
       {									      \
 	/* This is illegal.  */						      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -133,7 +133,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
        Jamos should be considered either here or in euckr_from_ucs4() */      \
     euckr_from_ucs4 (ch, cp);						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	UNICODE_TAG_HANDLER (ch, 4);					      \
 									      \
diff --git a/iconvdata/euc-tw.c b/iconvdata/euc-tw.c
index 153e3a0..49a1109 100644
--- a/iconvdata/euc-tw.c
+++ b/iconvdata/euc-tw.c
@@ -140,13 +140,13 @@
 	size_t found;							      \
 									      \
 	found = ucs4_to_cns11643l1 (ch, outptr, outend - outptr);	      \
-	if (__builtin_expect (found, 1) == 0)				      \
+	if (__glibc_likely (found) == 0)				      \
 	  {								      \
 	    /* We ran out of space.  */					      \
 	    result = __GCONV_FULL_OUTPUT;				      \
 	    break;							      \
 	  }								      \
-	if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR)	      \
+	if (__glibc_likely (found) != __UNKNOWN_10646_CHAR)		      \
 	  {								      \
 	    /* It's a CNS 11643, plane 1 character, adjust it for EUC-TW.  */ \
 	    *outptr++ += 0x80;						      \
@@ -157,13 +157,13 @@
 	    /* No CNS 11643, plane 1 character.  */			      \
 									      \
 	    found = ucs4_to_cns11643 (ch, outptr + 1, outend - outptr - 1);   \
-	    if (__builtin_expect (found, 1) == 0)			      \
+	    if (__glibc_likely (found) == 0)				      \
 	      {								      \
 		/* We ran out of space.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (found) == __UNKNOWN_10646_CHAR)	      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/gb18030.c b/iconvdata/gb18030.c
index d6fc76e..cb466f3 100644
--- a/iconvdata/gb18030.c
+++ b/iconvdata/gb18030.c
@@ -24351,7 +24351,7 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
 	  len = 0;							      \
 									      \
 	if (__glibc_unlikely (len == 0)					      \
-	    || (len == 2 && __builtin_expect (cp[0], '\1') == '\0'))          \
+	    || (len == 2 && __glibc_unlikely (cp[0] == '\0')))		      \
 	  {								      \
 	    /* Illegal character.  */					      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
@@ -24361,7 +24361,7 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
 	  {								      \
 	    /* See whether there is enough room for the second byte we	      \
 	       write.  */						      \
-	    if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0))  \
+	    if (cp[1] != '\0' && __glibc_unlikely (outptr + 1 >= outend))     \
 	      {								      \
 		/* We have not enough room.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/gbbig5.c b/iconvdata/gbbig5.c
index ddaa468..cf4bc4b 100644
--- a/iconvdata/gbbig5.c
+++ b/iconvdata/gbbig5.c
@@ -4852,8 +4852,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	else								      \
 	  {								      \
 	    /* See whether there is enough room to write the second byte. */  \
-	    if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	        && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 	        /* We do not have enough room.  */			      \
 	        result = __GCONV_FULL_OUTPUT;				      \
@@ -4908,8 +4908,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	/* See if the second byte is in the correct range. */		      \
 	if (ch >= 0x40 && ch <= 0x7e)					      \
 	  idx += ch - 0x40;						      \
-	else if (__builtin_expect (ch >= 0xa1, 1)		  	      \
-		 && __builtin_expect (ch <= 0xfe, 1))			      \
+	else if (__glibc_likely (ch >= 0xa1)				      \
+		 && __glibc_likely (ch <= 0xfe))			      \
 	  idx += 0x3f + (ch - 0xa1);					      \
 	else								      \
 	  {								      \
@@ -4943,8 +4943,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	else								      \
 	  {								      \
 	    /* see if there is enough room to write the second byte. */	      \
-	    if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	        && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 	        /* We do not have enough room.  */			      \
 	        result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/gbgbk.c b/iconvdata/gbgbk.c
index 620c39d..67c27ae 100644
--- a/iconvdata/gbgbk.c
+++ b/iconvdata/gbgbk.c
@@ -96,16 +96,16 @@
 	  ch = 0xa1aa;							      \
 									      \
 	/* Now determine whether the character is valid.  */		      \
-	if (__builtin_expect (ch < 0xa1a1, 0)				      \
-	    || __builtin_expect (ch > 0xf7fe, 0)			      \
-	    || __builtin_expect (inptr[1] < 0xa1, 0)			      \
+	if (__glibc_unlikely (ch < 0xa1a1)				      \
+	    || __glibc_unlikely (ch > 0xf7fe)				      \
+	    || __glibc_unlikely (inptr[1] < 0xa1)			      \
 	    /* Now test the exceptions.  */				      \
-	    || (__builtin_expect (ch >= 0xa2a1, 0)			      \
-		&& __builtin_expect (ch <= 0xa2aa, 0))			      \
-	    || (__builtin_expect (ch >= 0xa6e0, 0)			      \
-		&& __builtin_expect (ch <= 0xa6f5, 0))			      \
-	    || (__builtin_expect (ch >= 0xa8bb, 0)			      \
-		&& __builtin_expect (ch <= 0xa8c0, 0)))			      \
+	    || (__glibc_unlikely (ch >= 0xa2a1) 			      \
+		&& __glibc_unlikely (ch <= 0xa2aa))			      \
+	    || (__glibc_unlikely (ch >= 0xa6e0) 			      \
+		&& __glibc_unlikely (ch <= 0xa6f5))			      \
+	    || (__glibc_unlikely (ch >= 0xa8bb) 			      \
+		&& __glibc_unlikely (ch <= 0xa8c0)))			      \
 	  {								      \
 	    /* One of the characters we cannot map.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (2);				      \
diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
index e27312e..d1a8e0a 100644
--- a/iconvdata/gbk.c
+++ b/iconvdata/gbk.c
@@ -13145,8 +13145,8 @@ static const char __gbk_from_ucs4_tab12[][2] =
     if (ch <= 0x7f)							      \
       ++inptr;								      \
     else								      \
-      if (__builtin_expect (ch <= 0x80, 0)				      \
-	  || __builtin_expect (ch > 0xfe, 0))				      \
+      if (__glibc_unlikely (ch <= 0x80) 				      \
+	  || __glibc_unlikely (ch > 0xfe))				      \
 	{								      \
 	  /* This is illegal.  */					      \
 	  STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -13170,7 +13170,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
 									      \
 	  /* All second bytes of a multibyte character must be >= 0x40, and   \
 	     the __gbk_to_ucs table only covers the range up to 0xfe 0xa0. */ \
-	  if (__builtin_expect (ch2 < 0x40, 0)				      \
+	  if (__glibc_unlikely (ch2 < 0x40)				      \
 	      || (__glibc_unlikely (ch == 0xfe && ch2 > 0xa0)))		      \
 	    {								      \
 	      /* This is an illegal character.  */			      \
@@ -13182,7 +13182,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
 									      \
 	  ch = __gbk_to_ucs[idx];					      \
 									      \
-	  if (__builtin_expect (ch, 1) == 0 && *inptr != '\0')		      \
+	  if (__glibc_likely (ch) == 0 && *inptr != '\0')		      \
 	    {								      \
 	      /* This is an illegal character.  */			      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (2);			      \
@@ -13456,13 +13456,13 @@ static const char __gbk_from_ucs4_tab12[][2] =
 	  cp = "";							      \
 	  break; 							      \
 	}								      \
-      if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+      if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
 	{								      \
 	  /* Illegal character.  */					      \
 	  STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	}								      \
       /* See whether there is enough room for the second byte we write.  */   \
-      else if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0))   \
+      else if (cp[1] != '\0' && __glibc_unlikely (outptr + 1 >= outend))      \
 	{								      \
 	  /* We have not enough room.  */				      \
 	  result = __GCONV_FULL_OUTPUT;					      \
diff --git a/iconvdata/ibm1364.c b/iconvdata/ibm1364.c
index cf80993..ca898c7 100644
--- a/iconvdata/ibm1364.c
+++ b/iconvdata/ibm1364.c
@@ -155,7 +155,7 @@ enum
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -167,7 +167,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    if (__builtin_expect (ch, 0) == SI)					      \
+    if (__glibc_unlikely (ch) == SI)					      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -184,7 +184,7 @@ enum
       {									      \
 	/* Use the IBM13XX table for single byte.  */			      \
 	uint32_t res = SB_TO_UCS4[ch];				      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -221,10 +221,10 @@ enum
 	  ++rp2;							      \
 									      \
 	uint32_t res;							      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = DB_TO_UCS4[ch + rp2->idx],			      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -325,18 +325,18 @@ enum
 									      \
     /* Use the UCS4 table for single byte.  */				      \
     const char *cp;							      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = UCS4_TO_SB[ch + rp1->idx],				      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	const struct gap *rp2 = UCS4_TO_DB_IDX;				      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = UCS4_TO_DB[ch + rp2->idx],				      \
-		__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
diff --git a/iconvdata/ibm930.c b/iconvdata/ibm930.c
index 768a444..328c3cd 100644
--- a/iconvdata/ibm930.c
+++ b/iconvdata/ibm930.c
@@ -103,7 +103,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -115,7 +115,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Shift IN, change to SBCS converter */			      \
 	if (curcs == sb)						      \
@@ -132,7 +132,7 @@ enum
       {									      \
 	/* Use the IBM930 table for single byte.  */			      \
 	res = __ibm930sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -163,10 +163,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm930db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -209,17 +209,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm930sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm930db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')== L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm932.c b/iconvdata/ibm932.c
index aa69d65..0788185 100644
--- a/iconvdata/ibm932.c
+++ b/iconvdata/ibm932.c
@@ -50,11 +50,11 @@
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch == 0x80, 0)				      \
-	|| __builtin_expect (ch == 0xa0, 0)				      \
-	|| __builtin_expect (ch == 0xfd, 0)				      \
-	|| __builtin_expect (ch == 0xfe, 0)				      \
-	|| __builtin_expect (ch == 0xff, 0))				      \
+    if (__glibc_unlikely (ch == 0x80)					      \
+	|| __glibc_unlikely (ch == 0xa0)				      \
+	|| __glibc_unlikely (ch == 0xfd)				      \
+	|| __glibc_unlikely (ch == 0xfe)				      \
+	|| __glibc_unlikely (ch == 0xff))				      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -62,7 +62,7 @@
 									      \
     /* Use the IBM932 table for single byte.  */			      \
     res = __ibm932sb_to_ucs4[ch];					      \
-    if (__builtin_expect (res == 0, 0) && ch != 0)			      \
+    if (__glibc_unlikely (res == 0) && ch != 0) 			      \
       {									      \
 	/* Use the IBM932 table for double byte.  */			      \
 	if (__glibc_unlikely (inptr + 1 >= inend))			      \
@@ -79,9 +79,9 @@
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (res = __ibm932db_to_ucs4[ch + rp2->idx],		      \
-	    __builtin_expect (res, '\1') == 0 && ch !=0))		      \
+	    __glibc_unlikely (res == 0) && ch !=0))			      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -146,10 +146,10 @@
 	++rp;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (sc = __ucs4_to_ibm932sb[ch + rp->idx],			      \
-	__builtin_expect (sc, '\1') == '\0' && ch != L'\0'))		      \
+	__glibc_unlikely (sc == '\0') && ch != L'\0'))			      \
       {									      \
 									      \
 	/* Use the UCS4 table for double byte.  */			      \
diff --git a/iconvdata/ibm933.c b/iconvdata/ibm933.c
index 461fb5e..535fa9e 100644
--- a/iconvdata/ibm933.c
+++ b/iconvdata/ibm933.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM933 table for single byte.  */			      \
 	res = __ibm933sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm933db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm933sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm933db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm935.c b/iconvdata/ibm935.c
index 132d816..9c3b0db 100644
--- a/iconvdata/ibm935.c
+++ b/iconvdata/ibm935.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect(ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM935 table for single byte.  */			      \
 	res = __ibm935sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm935db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm935sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm935db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm937.c b/iconvdata/ibm937.c
index 69b154d..76bc0e0 100644
--- a/iconvdata/ibm937.c
+++ b/iconvdata/ibm937.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM937 table for single byte.  */			      \
 	res = __ibm937sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm937db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm937sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm937db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm939.c b/iconvdata/ibm939.c
index 9936e2c..b4d60f6 100644
--- a/iconvdata/ibm939.c
+++ b/iconvdata/ibm939.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch) == SO)					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM939 table for single byte.  */			      \
 	res = __ibm939sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res == L'\0', 0) && ch != '\0')		      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm939db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0')) 	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -207,17 +207,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm939sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm939db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	  ibm939_invalid_char:						      \
diff --git a/iconvdata/ibm943.c b/iconvdata/ibm943.c
index c5d5742..fc12db7 100644
--- a/iconvdata/ibm943.c
+++ b/iconvdata/ibm943.c
@@ -50,20 +50,20 @@
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch == 0x80, 0)				      \
-	|| __builtin_expect (ch == 0xa0, 0)				      \
-	|| __builtin_expect (ch == 0xfd, 0)				      \
-	|| __builtin_expect (ch == 0xfe, 0)				      \
-	|| __builtin_expect (ch == 0xff, 0))				      \
+    if (__glibc_unlikely (ch == 0x80)					      \
+	|| __glibc_unlikely (ch == 0xa0)				      \
+	|| __glibc_unlikely (ch == 0xfd)				      \
+	|| __glibc_unlikely (ch == 0xfe)				      \
+	|| __glibc_unlikely (ch == 0xff))				      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
       }									      \
 									      \
     /* Use the IBM943 table for single byte.  */			      \
-    if (__builtin_expect (ch > 0xdf, 0)					      \
+    if (__glibc_unlikely (ch > 0xdf)					      \
 	|| (res = __ibm943sb_to_ucs4[ch],				      \
-	    __builtin_expect (res == 0, 0) && ch != 0))			      \
+	    __glibc_unlikely (res == 0) && ch != 0))			      \
       {									      \
 	/* Use the IBM943 table for double byte.  */			      \
 	if (__glibc_unlikely (inptr + 1 >= inend))			      \
@@ -80,9 +80,9 @@
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (res = __ibm943db_to_ucs4[ch + rp2->idx],		      \
-	    __builtin_expect (res, '\1') == 0 && ch !=0))		      \
+	    __glibc_unlikely (res == 0) && ch !=0))			      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -147,10 +147,10 @@
 	++rp;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (sc = __ucs4_to_ibm943sb[ch + rp->idx],			      \
-	__builtin_expect (sc, '\1') == '\0' && ch != L'\0'))		      \
+	__glibc_unlikely (sc == '\0') && ch != L'\0'))			      \
       {									      \
 									      \
 	/* Use the UCS4 table for double byte.  */			      \
diff --git a/iconvdata/iso-2022-cn.c b/iconvdata/iso-2022-cn.c
index 5434ef4..e9313cc 100644
--- a/iconvdata/iso-2022-cn.c
+++ b/iconvdata/iso-2022-cn.c
@@ -126,22 +126,22 @@ enum
       STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch) == ESC)					      \
       {									      \
 	/* There are two kinds of escape sequences we have to handle:	      \
 	   - those announcing the use of GB and CNS characters on the	      \
 	     line; we can simply ignore them				      \
 	   - the initial byte of the SS2 sequence.			      \
 	*/								      \
-	if (__builtin_expect (inptr + 2 > inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 > inend)			      \
 	    || (inptr[1] == '$'						      \
-		&& (__builtin_expect (inptr + 3 > inend, 0)		      \
+		&& (__glibc_unlikely (inptr + 3 > inend)		      \
 		    || (inptr[2] == ')'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0))	      \
+			&& __glibc_unlikely (inptr + 4 > inend))	      \
 		    || (inptr[2] == '*'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0))))	      \
+			&& __glibc_unlikely (inptr + 4 > inend))))	      \
 	    || (inptr[1] == SS2_1					      \
-		&& __builtin_expect (inptr + 4 > inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 4 > inend)))		      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
@@ -159,7 +159,7 @@ enum
 	    continue;							      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SO)				      \
+    else if (__glibc_unlikely (ch) == SO)				      \
       {									      \
 	/* Switch to use GB2312 or CNS 11643 plane 1, depending on which      \
 	   S0 designation came last.  The only problem is what to do with     \
@@ -170,7 +170,7 @@ enum
 	set = ann == CNS11643_1_ann ? CNS11643_1_set : GB2312_set;	      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Switch to use ASCII.  */					      \
 	++inptr;							      \
@@ -178,14 +178,14 @@ enum
 	continue;							      \
       }									      \
 									      \
-    if (__builtin_expect (ch, 0) == ESC && inptr[1] == SS2_1)		      \
+    if (__glibc_unlikely (ch) == ESC && inptr[1] == SS2_1)		      \
       {									      \
 	/* This is a character from CNS 11643 plane 2.			      \
 	   XXX We could test here whether the use of this character	      \
 	   set was announced.  */					      \
 	inptr += 2;							      \
 	ch = cns11643l2_to_ucs4 (&inptr, 2, 0);				      \
-	if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)		      \
+	if (__glibc_unlikely (ch) == __UNKNOWN_10646_CHAR)		      \
 	  {								      \
 	    inptr -= 2;							      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -207,12 +207,12 @@ enum
 	    ch = cns11643l1_to_ucs4 (&inptr, inend - inptr, 0);		      \
 	  }								      \
 									      \
-	if (__builtin_expect (ch, 1) == 0)				      \
+	if (__glibc_likely (ch) == 0)					      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
 	  }								      \
-	else if (__builtin_expect (ch, 1) == __UNKNOWN_10646_CHAR)	      \
+	else if (__glibc_likely (ch) == __UNKNOWN_10646_CHAR)		      \
 	  {								      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 	  }								      \
@@ -297,7 +297,7 @@ enum
 		else							      \
 		  written = ucs4_to_gb2312 (ch, buf, 2);		      \
 									      \
-		if (__builtin_expect (written, 0) != __UNKNOWN_10646_CHAR)    \
+		if (__glibc_unlikely (written) != __UNKNOWN_10646_CHAR)       \
 		  /* Oh well, then switch SO.  */			      \
 		  used = GB2312_set + CNS11643_1_set - used;		      \
 		else							      \
diff --git a/iconvdata/iso-2022-jp-3.c b/iconvdata/iso-2022-jp-3.c
index 4b4ea01..7c13ad8 100644
--- a/iconvdata/iso-2022-jp-3.c
+++ b/iconvdata/iso-2022-jp-3.c
@@ -161,9 +161,9 @@ enum
 	   ends we terminate with an error since we must not risk missing     \
 	   an escape sequence just because it is not entirely in the	      \
 	   current input buffer.  */					      \
-	if (__builtin_expect (inptr + 2 >= inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 >= inend)			      \
 	    || (inptr[1] == '$' && inptr[2] == '('			      \
-		&& __builtin_expect (inptr + 3 >= inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 3 >= inend)))		      \
 	  {								      \
 	    /* Not enough input available.  */				      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
@@ -722,7 +722,7 @@ static const struct
 		      {							      \
 			if (set != JISX0201_Kana_set)			      \
 			  {						      \
-			    if (__builtin_expect (outptr + 3 > outend, 0))    \
+			    if (__glibc_unlikely (outptr + 3 > outend))       \
 			      {						      \
 				result = __GCONV_FULL_OUTPUT;		      \
 				break;					      \
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 88ca5bb..65a0663 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -269,16 +269,16 @@ gconv_end (struct __gconv_step *data)
     uint32_t ch = *inptr;						      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch) == ESC)					      \
       {									      \
 	/* We now must be prepared to read two to three more		      \
 	   characters.  If we have a match in the first character but	      \
 	   then the input buffer ends we terminate with an error since	      \
 	   we must not risk missing an escape sequence just because it	      \
 	   is not entirely in the current input buffer.  */		      \
-	if (__builtin_expect (inptr + 2 >= inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 >= inend)			      \
 	    || (var == iso2022jp2 && inptr[1] == '$' && inptr[2] == '('	      \
-		&& __builtin_expect (inptr + 3 >= inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 3 >= inend)))		      \
 	  {								      \
 	    /* Not enough input available.  */				      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
@@ -560,7 +560,7 @@ static const cvlist_t conversion_lists[4] =
        have to be known whether the last line ended using ASCII or	      \
        JIS X 0201.  */							      \
     else if (set == JISX0201_Roman_set					      \
-	     && (__builtin_expect (tag == TAG_none, 1)			      \
+	     && (__glibc_likely (tag == TAG_none)			      \
 		 || tag == TAG_language_ja))				      \
       {									      \
 	unsigned char buf[1];						      \
@@ -577,7 +577,7 @@ static const cvlist_t conversion_lists[4] =
 	  }								      \
       }									      \
     else if (set == JISX0201_Kana_set					      \
-	     && (__builtin_expect (tag == TAG_none, 1)			      \
+	     && (__glibc_likely (tag == TAG_none)			      \
 		 || tag == TAG_language_ja))				      \
       {									      \
 	unsigned char buf[1];						      \
@@ -596,19 +596,19 @@ static const cvlist_t conversion_lists[4] =
     else								      \
       {									      \
 	if ((set == JISX0208_1978_set || set == JISX0208_1983_set)	      \
-	    && (__builtin_expect (tag == TAG_none, 1)			      \
+	    && (__glibc_likely (tag == TAG_none)			      \
 		|| tag == TAG_language_ja))				      \
 	  written = ucs4_to_jisx0208 (ch, outptr, outend - outptr);	      \
 	else if (set == JISX0212_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_ja))			      \
 	  written = ucs4_to_jisx0212 (ch, outptr, outend - outptr);	      \
 	else if (set == GB2312_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_zh))			      \
 	  written = ucs4_to_gb2312 (ch, outptr, outend - outptr);	      \
 	else if (set == KSC5601_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_ko))			      \
 	  written = ucs4_to_ksc5601 (ch, outptr, outend - outptr);	      \
 	else								      \
@@ -624,7 +624,7 @@ static const cvlist_t conversion_lists[4] =
       }									      \
 									      \
     if (written == __UNKNOWN_10646_CHAR					      \
-	&& __builtin_expect (tag == TAG_none, 1))			      \
+	&& __glibc_likely (tag == TAG_none))				      \
       {									      \
 	if (set2 == ISO88591_set)					      \
 	  {								      \
@@ -732,7 +732,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set2 != ISO88591_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -781,7 +781,7 @@ static const cvlist_t conversion_lists[4] =
 				  set2 = ISO88597_set;			      \
 				}					      \
 									      \
-			      if (__builtin_expect (outptr + 3 > outend, 0))  \
+			      if (__glibc_unlikely (outptr + 3 > outend))     \
 				{					      \
 				  res = __GCONV_FULL_OUTPUT;		      \
 				  break;				      \
@@ -806,7 +806,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0201_Roman_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -833,7 +833,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0208_1983_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -865,7 +865,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0212_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 4 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 4 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -899,7 +899,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != GB2312_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -932,7 +932,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != KSC5601_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 4 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 4 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -968,7 +968,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0201_Kana_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index c1babc8..15a3e1b 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -123,17 +123,17 @@ enum
       STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch) == ESC)					      \
       {									      \
 	/* We don't really have to handle escape sequences since all the      \
 	   switching is done using the SI and SO bytes.  But we have to	      \
 	   recognize `Esc $ ) C' since this is a kind of flag for this	      \
 	   encoding.  We simply ignore it.  */				      \
-	if (__builtin_expect (inptr + 2 > inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 > inend)			      \
 	    || (inptr[1] == '$'						      \
-		&& (__builtin_expect (inptr + 3 > inend, 0)		      \
+		&& (__glibc_unlikely (inptr + 3 > inend)		      \
 		    || (inptr[2] == ')'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0)))))	      \
+			&& __glibc_unlikely (inptr + 4 > inend)))))	      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
@@ -145,14 +145,14 @@ enum
 	    continue;							      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SO)				      \
+    else if (__glibc_unlikely (ch) == SO)				      \
       {									      \
 	/* Switch to use KSC.  */					      \
 	++inptr;							      \
 	set = KSC5601_set;						      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch) == SI)				      \
       {									      \
 	/* Switch to use ASCII.  */					      \
 	++inptr;							      \
@@ -226,7 +226,7 @@ enum
 	asm ("" : "=m" (buf));						      \
 									      \
 	size_t written = ucs4_to_ksc5601 (ch, buf, 2);			      \
-	if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)	      \
+	if (__glibc_unlikely (written) == __UNKNOWN_10646_CHAR) 	      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c
index 9090e6f..7488ca5 100644
--- a/iconvdata/iso_6937-2.c
+++ b/iconvdata/iso_6937-2.c
@@ -392,7 +392,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -408,8 +408,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -429,7 +429,7 @@ static const char from_ucs4[][2] =
       {									      \
 	ch = to_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+	if (__glibc_unlikely (ch == 0) && *inptr != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -524,7 +524,7 @@ static const char from_ucs4[][2] =
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (from_ucs4[ch][0] == '\0', 0) && ch != 0)	      \
+    else if (__glibc_unlikely (from_ucs4[ch][0] == '\0') && ch != 0)	      \
       {									      \
 	/* Illegal characters.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c
index 04841bd..d02744e 100644
--- a/iconvdata/iso_6937.c
+++ b/iconvdata/iso_6937.c
@@ -392,7 +392,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -408,8 +408,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -429,7 +429,7 @@ static const char from_ucs4[][2] =
       {									      \
 	ch = to_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+	if (__glibc_unlikely (ch == 0) && *inptr != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -526,7 +526,7 @@ static const char from_ucs4[][2] =
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (from_ucs4[ch][0] == '\0', 0) && ch != 0)	      \
+    else if (__glibc_unlikely (from_ucs4[ch][0] == '\0') && ch != 0)	      \
       {									      \
 	/* Illegal characters.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 01375e3..47c0916 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -178,10 +178,10 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
        0xd831-0xd87e and 0xd891-0xd8fe are user-defined area */		      \
     else								      \
       {									      \
-	if (__builtin_expect (ch > 0xf9, 0)				      \
-	    || __builtin_expect (ch == 0xdf, 0)				      \
-	    || (__builtin_expect (ch > 0x7e, 0) && ch < 0x84)		      \
-	    || (__builtin_expect (ch > 0xd3, 0) && ch < 0xd9))		      \
+	if (__glibc_unlikely (ch > 0xf9)				      \
+	    || __glibc_unlikely (ch == 0xdf)				      \
+	    || (__glibc_unlikely (ch > 0x7e) && ch < 0x84)		      \
+	    || (__glibc_unlikely (ch > 0xd3) && ch < 0xd9))		      \
 	  {								      \
 	    /* These are illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -212,9 +212,9 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 		m = mid[(idx & 0x03e0) >> 5];				      \
 		f = final[idx & 0x001f];				      \
 									      \
-		if (__builtin_expect (i == -1, 0)			      \
-		    || __builtin_expect (m == -1, 0)			      \
-		    || __builtin_expect (f == -1, 0))			      \
+		if (__glibc_unlikely (i == -1)				      \
+		    || __glibc_unlikely (m == -1)			      \
+		    || __glibc_unlikely (f == -1))			      \
 		  {							      \
 		    /* This is illegal.  */				      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -226,7 +226,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 		else if (i == 0 && m > 0 && f == 0)			      \
 		  ch = 0x314e + m;	/* 0x314f + m - 1 */		      \
 		else if (__glibc_likely ((i | m) == 0)			      \
-			 && __builtin_expect (f > 0, 1))		      \
+			 && __glibc_likely (f > 0))			      \
 		  ch = final_to_ucs[f - 1];	/* round trip?? */	      \
 		else							      \
 		  {							      \
@@ -236,13 +236,13 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	      }								      \
 	    else							      \
 	      {								      \
-		if (__builtin_expect (ch2 < 0x31, 0)			      \
-		    || (__builtin_expect (ch2 > 0x7e, 0) && ch2 < 0x91)	      \
-		    || __builtin_expect (ch2, 0) == 0xff		      \
-		    || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe8)	      \
-		    || (__builtin_expect (ch, 0) == 0xda		      \
+		if (__glibc_unlikely (ch2 < 0x31)			      \
+		    || (__glibc_unlikely (ch2 > 0x7e) && ch2 < 0x91)	      \
+		    || __glibc_unlikely (ch2) == 0xff			      \
+		    || (__glibc_unlikely (ch) == 0xd9 && ch2 > 0xe8)	      \
+		    || (__glibc_unlikely (ch) == 0xda			      \
 			&& ch2 > 0xa0 && ch2 < 0xd4)			      \
-		    || (__builtin_expect (ch, 0) == 0xde && ch2 > 0xf1))      \
+		    || (__glibc_unlikely (ch) == 0xde && ch2 > 0xf1))	      \
 		  {							      \
 		    /* This is illegal.  */				      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -351,7 +351,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	    uint32_t temp;						      \
 									      \
 	    written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr);    \
-	    if (__builtin_expect (written, 1) == 0)			      \
+	    if (__glibc_likely (written) == 0)				      \
 	      {								      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
@@ -380,12 +380,12 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	    uint32_t temp;						      \
 									      \
 	    written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);      \
-	    if (__builtin_expect (written, 1) == 0)			      \
+	    if (__glibc_likely (written) == 0)				      \
 	      {								      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0)	      \
+	    if (__glibc_unlikely (written == __UNKNOWN_10646_CHAR)	      \
 		|| (outptr[0] == 0x22 && outptr[1] > 0x68))		      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c
index 2590b33..9395459 100644
--- a/iconvdata/sjis.c
+++ b/iconvdata/sjis.c
@@ -4331,12 +4331,12 @@ static const char from_ucs4_extra[0x100][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch, 0) == 0x5c)				      \
+    if (__glibc_unlikely (ch) == 0x5c)					      \
       {									      \
 	ch = 0xa5;							      \
 	++inptr;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == 0x7e)				      \
+    else if (__glibc_unlikely (ch) == 0x7e)				      \
       {									      \
 	ch = 0x203e;							      \
 	++inptr;							      \
@@ -4348,9 +4348,9 @@ static const char from_ucs4_extra[0x100][2] =
 	ch += 0xfec0;							      \
 	++inptr;							      \
       }									      \
-    else if (__builtin_expect (ch > 0xea, 0)				      \
-	     || __builtin_expect (ch, 0) == 0xa0			      \
-	     || __builtin_expect (ch <= 0x80, 0))			      \
+    else if (__glibc_unlikely (ch > 0xea)				      \
+	     || __glibc_unlikely (ch) == 0xa0				      \
+	     || __glibc_unlikely (ch <= 0x80))				      \
       {									      \
 	/* These are illegal.  */					      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -4377,10 +4377,10 @@ static const char from_ucs4_extra[0x100][2] =
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 	  }								      \
-	else if ((__builtin_expect (idx > 0x84be && idx < 0x889f, 0))	      \
-		 || (__builtin_expect (idx > 0x88fc && idx < 0x8940, 0))      \
-		 || (__builtin_expect (idx > 0x9ffc && idx < 0xe040, 0))      \
-		 || __builtin_expect (idx > 0xeaa4, 0))			      \
+	else if ((__glibc_unlikely (idx > 0x84be && idx < 0x889f))	      \
+		 || (__glibc_unlikely (idx > 0x88fc && idx < 0x8940))	      \
+		 || (__glibc_unlikely (idx > 0x9ffc && idx < 0xe040))	      \
+		 || __glibc_unlikely (idx > 0xeaa4))			      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -4446,8 +4446,8 @@ static const char from_ucs4_extra[0x100][2] =
 	  cp = from_ucs4_greek[ch - 0x391];				      \
 	else if (ch >= 0x2010 && ch <= 0x9fa0)				      \
 	  cp = from_ucs4_cjk[ch - 0x02010];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffef, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffef))			      \
 	  cp = from_ucs4_extra[ch - 0xff00];				      \
 	else								      \
 	  {								      \
@@ -4459,7 +4459,7 @@ static const char from_ucs4_extra[0x100][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0] == '\0', 0) && ch != 0)			      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c
index 13f1f28..14ef857 100644
--- a/iconvdata/t.61.c
+++ b/iconvdata/t.61.c
@@ -385,7 +385,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = *inptr;						      \
     int increment = 1;							      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -400,8 +400,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -414,7 +414,7 @@ static const char from_ucs4[][2] =
     else								      \
       ch = to_ucs4[ch];							      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+    if (__glibc_unlikely (ch == 0) && *inptr != '\0')			      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (increment);			      \
@@ -450,13 +450,13 @@ static const char from_ucs4[][2] =
 									      \
     if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))  \
       {									      \
-	if (__builtin_expect (ch, 0) == 0x2126)				      \
+	if (__glibc_unlikely (ch) == 0x2126)				      \
 	  cp = "\xe0";							      \
-	else if (__builtin_expect (ch, 0) == 0x2c7)			      \
+	else if (__glibc_unlikely (ch) == 0x2c7)			      \
 	  cp = "\xcf\x20";						      \
-	else if (__builtin_expect (ch < 0x2d8, 0)			      \
-		 || __builtin_expect (ch > 0x2dd, 0)			      \
-		 || __builtin_expect (ch == 0x2dc, 0))			      \
+	else if (__glibc_unlikely (ch < 0x2d8)				      \
+		 || __glibc_unlikely (ch > 0x2dd)			      \
+		 || __glibc_unlikely (ch == 0x2dc))			      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
@@ -476,7 +476,7 @@ static const char from_ucs4[][2] =
       {									      \
 	cp = from_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (cp[0] == '\0', 0) && ch != 0)		      \
+	if (__glibc_unlikely (cp[0] == '\0') && ch != 0)		      \
 	  {								      \
 	    /* Illegal.  */						      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/tcvn5712-1.c b/iconvdata/tcvn5712-1.c
index 5edc653..9add2e1 100644
--- a/iconvdata/tcvn5712-1.c
+++ b/iconvdata/tcvn5712-1.c
@@ -460,7 +460,7 @@ static const struct
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/tscii.c b/iconvdata/tscii.c
index 644cb96..2bd566c 100644
--- a/iconvdata/tscii.c
+++ b/iconvdata/tscii.c
@@ -347,7 +347,7 @@ static const uint32_t tscii_next_state[6] =
 	    /* Retrieve the successor state.  */			      \
 	    *statep = tscii_next_state[(*statep >> 4) & 0x0f];		      \
 	  }								      \
-	while (*statep != 0 && __builtin_expect (outptr + 4 <= outend, 1));   \
+	while (*statep != 0 && __glibc_likely (outptr + 4 <= outend));	      \
 									      \
 	if (*statep != 0)						      \
 	  {								      \
diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c
index 629f2d6..3494e1f 100644
--- a/iconvdata/uhc.c
+++ b/iconvdata/uhc.c
@@ -3064,9 +3064,9 @@ static const char uhc_hangul_from_ucs[11172][2] =
 */									      \
     if (ch <= 0x7f)							      \
       ++inptr;								      \
-    else if (__builtin_expect (ch <= 0x80, 0)				      \
-	     || __builtin_expect (ch >= 0xfe, 0)			      \
-	     || __builtin_expect (ch == 0xc9, 0))			      \
+    else if (__glibc_unlikely (ch <= 0x80)				      \
+	     || __glibc_unlikely (ch >= 0xfe)				      \
+	     || __glibc_unlikely (ch == 0xc9))				      \
       {									      \
 	/* This is illegal.  */						      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -3107,12 +3107,12 @@ static const char uhc_hangul_from_ucs[11172][2] =
 									      \
 	if (ch < 0xa1 || ch2 < 0xa1)					      \
 	  {								      \
-	    if (__builtin_expect (ch > 0xc6, 0)				      \
-		|| __builtin_expect (ch2 < 0x41, 0)			      \
-		|| __builtin_expect (ch2 > 0xfe, 0)			      \
-		|| (__builtin_expect (ch2 > 0x5a, 0) && ch2 < 0x61)	      \
-		|| (__builtin_expect (ch2 > 0x7a, 0) && ch2 < 0x81)	      \
-		|| (__builtin_expect (ch == 0xc6, 0) && ch2 > 0x52))	      \
+	    if (__glibc_unlikely (ch > 0xc6)				      \
+		|| __glibc_unlikely (ch2 < 0x41)			      \
+		|| __glibc_unlikely (ch2 > 0xfe)			      \
+		|| (__glibc_unlikely (ch2 > 0x5a) && ch2 < 0x61)	      \
+		|| (__glibc_unlikely (ch2 > 0x7a) && ch2 < 0x81)	      \
+		|| (__glibc_unlikely (ch == 0xc6) && ch2 > 0x52))	      \
 	      {								      \
 		/* This is not legal.  */				      \
 		STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -3135,8 +3135,8 @@ static const char uhc_hangul_from_ucs[11172][2] =
 	else								      \
 	  {								      \
 	    ch = ksc5601_to_ucs4 (&inptr, 2, 0x80);			      \
-	    if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)	      \
-		|| __builtin_expect (ch == 0x327e, 0))			      \
+	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR)		      \
+		|| __glibc_unlikely (ch == 0x327e))			      \
 	      {								      \
 		/* Illegal.  */						      \
 		STANDARD_FROM_LOOP_ERR_HANDLER (2);			      \
@@ -3208,8 +3208,8 @@ static const char uhc_hangul_from_ucs[11172][2] =
       {									      \
 	size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);   \
 									      \
-	if (__builtin_expect (ch == 0x327e, 0)				      \
-	    || __builtin_expect (written == __UNKNOWN_10646_CHAR, 0))	      \
+	if (__glibc_unlikely (ch == 0x327e)				      \
+	    || __glibc_unlikely (written == __UNKNOWN_10646_CHAR))	      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c
index 342de08..c4b2c48 100644
--- a/iconvdata/utf-16.c
+++ b/iconvdata/utf-16.c
@@ -285,7 +285,7 @@ gconv_end (struct __gconv_step *data)
       {									      \
 	u1 = bswap_16 (u1);						      \
 									      \
-	if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff)		      \
+	if (__glibc_likely (u1 < 0xd800) || u1 > 0xdfff)		      \
 	  {								      \
 	    /* No surrogate.  */					      \
 	    put32 (outptr, u1);						      \
@@ -307,8 +307,8 @@ gconv_end (struct __gconv_step *data)
 									      \
 	    inptr += 2;							      \
 	    u2 = bswap_16 (get16 (inptr));				      \
-	    if (__builtin_expect (u2 < 0xdc00, 0)			      \
-		|| __builtin_expect (u2 > 0xdfff, 0))			      \
+	    if (__glibc_unlikely (u2 < 0xdc00)				      \
+		|| __glibc_unlikely (u2 > 0xdfff))			      \
 	      {								      \
 		/* This is no valid second word for a surrogate.  */	      \
 		inptr -= 2;						      \
@@ -321,7 +321,7 @@ gconv_end (struct __gconv_step *data)
       }									      \
     else								      \
       {									      \
-	if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff)		      \
+	if (__glibc_likely (u1 < 0xd800) || u1 > 0xdfff)		      \
 	  {								      \
 	    /* No surrogate.  */					      \
 	    put32 (outptr, u1);						      \
@@ -341,8 +341,8 @@ gconv_end (struct __gconv_step *data)
 									      \
 	    inptr += 2;							      \
 	    uint16_t u2 = get16 (inptr);				      \
-	    if (__builtin_expect (u2 < 0xdc00, 0)			      \
-		|| __builtin_expect (u2 > 0xdfff, 0))			      \
+	    if (__glibc_unlikely (u2 < 0xdc00)				      \
+		|| __glibc_unlikely (u2 > 0xdfff))			      \
 	      {								      \
 		/* This is no valid second word for a surrogate.  */	      \
 		inptr -= 2;						      \
diff --git a/iconvdata/utf-32.c b/iconvdata/utf-32.c
index 3e196ac..fe779f9 100644
--- a/iconvdata/utf-32.c
+++ b/iconvdata/utf-32.c
@@ -72,7 +72,7 @@
       put32u (outbuf, BOM);						      \
       outbuf += 4;							      \
     }									      \
-  else if (__builtin_expect (data->__invocation_counter == 0, 0)	      \
+  else if (__glibc_unlikely (data->__invocation_counter == 0)		      \
 	   && ((var == UTF_32LE && BYTE_ORDER == BIG_ENDIAN)		      \
 	       || (var == UTF_32BE && BYTE_ORDER == LITTLE_ENDIAN)))	      \
     data->__flags |= __GCONV_SWAP;					      \
diff --git a/iconvdata/utf-7.c b/iconvdata/utf-7.c
index 74a8e5b..4ca91e5 100644
--- a/iconvdata/utf-7.c
+++ b/iconvdata/utf-7.c
@@ -218,7 +218,7 @@ base64 (unsigned int i)
 									      \
 	    /* If accumulated data is nonzero, the input is invalid.  */      \
 	    /* Also, partial UTF-16 characters are invalid.  */		      \
-	    if (__builtin_expect (statep->__value.__wch != 0, 0)	      \
+	    if (__glibc_unlikely (statep->__value.__wch != 0)		      \
 		|| __glibc_unlikely ((statep->__count >> 3) <= 26))	      \
 	      {								      \
 		STANDARD_FROM_LOOP_ERR_HANDLER ((statep->__count = 0, 1));    \
@@ -261,7 +261,7 @@ base64 (unsigned int i)
 		   indeed form a Low Surrogate.  */			      \
 		uint32_t wc2 = wch & 0xffff;				      \
 									      \
-		if (! __builtin_expect (wc2 >= 0xdc00 && wc2 < 0xe000, 1))    \
+		if (! __glibc_likely (wc2 >= 0xdc00 && wc2 < 0xe000))	      \
 		  {							      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER ((statep->__count = 0, 1));\
 		  }							      \
-- 
1.9.3


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
@ 2014-09-08 19:48 ` Andreas Schwab
  2014-09-08 20:07 ` Kalle Olavi Niemitalo
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 17+ messages in thread
From: Andreas Schwab @ 2014-09-08 19:48 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

Florian Weimer <fweimer@redhat.com> writes:

> Writing meaningful ChangeLog entries is a bit of a challenge because most
> of the changes are in a macro called BODY, and usually, there are two such
> macros in each file.

Use (BODY for FROM_LOOP) and (BODY for TO_LOOP) to distinguish them.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
  2014-09-08 19:48 ` Andreas Schwab
@ 2014-09-08 20:07 ` Kalle Olavi Niemitalo
  2014-09-08 20:43   ` Florian Weimer
  2014-09-08 21:00 ` Kalle Olavi Niemitalo
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 17+ messages in thread
From: Kalle Olavi Niemitalo @ 2014-09-08 20:07 UTC (permalink / raw)
  To: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:

> --- a/iconvdata/8bit-generic.c
> +++ b/iconvdata/8bit-generic.c
> @@ -68,7 +68,7 @@
>    {									      \
>      uint32_t ch = get32 (inptr);					      \
>  									      \
> -    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]), 0)\
> +    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]))   \
>  	|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0))	      \

Why keep the second __builtin_expect?

> diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
> index b1a7719..e27312e 100644
> --- a/iconvdata/gbk.c
> +++ b/iconvdata/gbk.c
> @@ -13171,7 +13171,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
>  	  /* All second bytes of a multibyte character must be >= 0x40, and   \
>  	     the __gbk_to_ucs table only covers the range up to 0xfe 0xa0. */ \
>  	  if (__builtin_expect (ch2 < 0x40, 0)				      \
> -	      || (__builtin_expect (ch, 0x81) == 0xfe && ch2 > 0xa0))	      \
> +	      || (__glibc_unlikely (ch == 0xfe && ch2 > 0xa0)))		      \

And the first one here.  Also, the ch2 > 0xa0 test wasn't inside
__builtin_expect originally, but I don't know what the
probabilities are.

In 0001-Manual-part-of-iconvdata-__builtin_expect-cleanup.patch,
I didn't find any mistakes where an originally likely test would
have turned unlikely or vice versa.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 20:07 ` Kalle Olavi Niemitalo
@ 2014-09-08 20:43   ` Florian Weimer
  0 siblings, 0 replies; 17+ messages in thread
From: Florian Weimer @ 2014-09-08 20:43 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo, libc-alpha

On 09/08/2014 10:11 PM, Kalle Olavi Niemitalo wrote:

> Why keep the second __builtin_expect?

 > And the first one here.

The first patch only contains the changes which could not reasonably be 
automated with a short script.

>> -	      || (__builtin_expect (ch, 0x81) == 0xfe && ch2 > 0xa0))	      \
>> +	      || (__glibc_unlikely (ch == 0xfe && ch2 > 0xa0)))		      \

> Also, the ch2 > 0xa0 test wasn't inside
> __builtin_expect originally, but I don't know what the
> probabilities are.

Yes, I should probably undo this change.  I made it deliberately because 
I thought that the intent was to mark any reason to enter the error 
condition as unlikely, but then I'd have to wrap the entire if condition 
for consistency.

Note that is quite unlikely that current GCC uses __builtin_expect hints 
in the same way as it did when this code was initially written, and as 
I've seen during my binary diffing, the whole mechanism is quite brittle 
for such complex conditions.

-- 
Florian Weimer / Red Hat Product Security

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
  2014-09-08 19:48 ` Andreas Schwab
  2014-09-08 20:07 ` Kalle Olavi Niemitalo
@ 2014-09-08 21:00 ` Kalle Olavi Niemitalo
  2014-09-08 23:14   ` Florian Weimer
  2014-09-09  2:25 ` Siddhesh Poyarekar
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 17+ messages in thread
From: Kalle Olavi Niemitalo @ 2014-09-08 21:00 UTC (permalink / raw)
  To: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:

> --- a/iconvdata/iso-2022-cn.c
> +++ b/iconvdata/iso-2022-cn.c
> @@ -126,22 +126,22 @@ enum
>        STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
>  									      \
>      /* Recognize escape sequences.  */					      \
> -    if (__builtin_expect (ch, 0) == ESC)				      \
> +    if (__glibc_unlikely (ch) == ESC)					      \

Shouldn't that be __glibc_unlikely (ch == ESC)?
I guess it makes no difference in practice, but it looks wrong.
There are other changes like that, for example:

-	if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR)	      \
+	if (__glibc_likely (found) != __UNKNOWN_10646_CHAR)		      \

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 21:00 ` Kalle Olavi Niemitalo
@ 2014-09-08 23:14   ` Florian Weimer
  0 siblings, 0 replies; 17+ messages in thread
From: Florian Weimer @ 2014-09-08 23:14 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo, libc-alpha

On 09/08/2014 11:04 PM, Kalle Olavi Niemitalo wrote:
> Florian Weimer <fweimer@redhat.com> writes:
>
>> --- a/iconvdata/iso-2022-cn.c
>> +++ b/iconvdata/iso-2022-cn.c
>> @@ -126,22 +126,22 @@ enum
>>         STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
>>   									      \
>>       /* Recognize escape sequences.  */					      \
>> -    if (__builtin_expect (ch, 0) == ESC)				      \
>> +    if (__glibc_unlikely (ch) == ESC)					      \
>
> Shouldn't that be __glibc_unlikely (ch == ESC)?
> I guess it makes no difference in practice, but it looks wrong.
> There are other changes like that, for example:
>
> -	if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR)	      \
> +	if (__glibc_likely (found) != __UNKNOWN_10646_CHAR)		      \

Right, these changes are technically correct (they are un-expanding the 
macro definitions), but they are even uglier than the original code. 
I'll work on a regenerated patch with additional heuristics to cover this.

-- 
Florian Weimer / Red Hat Product Security

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
                   ` (2 preceding siblings ...)
  2014-09-08 21:00 ` Kalle Olavi Niemitalo
@ 2014-09-09  2:25 ` Siddhesh Poyarekar
  2014-09-09 19:08 ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c (was: Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c) Florian Weimer
  2014-09-09 21:49 ` [PATCH] __builtin_expect cleanup for iconvdata/*.c Roland McGrath
  5 siblings, 0 replies; 17+ messages in thread
From: Siddhesh Poyarekar @ 2014-09-09  2:25 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

[-- Attachment #1: Type: text/plain, Size: 469 bytes --]

On Mon, Sep 08, 2014 at 09:42:40PM +0200, Florian Weimer wrote:
> Writing meaningful ChangeLog entries is a bit of a challenge because most of
> the changes are in a macro called BODY, and usually, there are two such
> macros in each file.  I would suggest to create ChangeLog entries for each
> real function change (mostly gconv_init), and otherwise list just the files
> with "Replace __builtin_expect.".

It ought to be sufficient to just list the files.

Siddhesh

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c (was: Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c)
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
                   ` (3 preceding siblings ...)
  2014-09-09  2:25 ` Siddhesh Poyarekar
@ 2014-09-09 19:08 ` Florian Weimer
  2014-09-09 23:51   ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c Kalle Olavi Niemitalo
  2014-09-09 21:49 ` [PATCH] __builtin_expect cleanup for iconvdata/*.c Roland McGrath
  5 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2014-09-09 19:08 UTC (permalink / raw)
  To: libc-alpha

[-- Attachment #1: Type: text/plain, Size: 801 bytes --]

This is the second iteration of these patches.  The rewriting script has 
grown considerably and seems useful for subsequent clean-ups.  The first 
patch installs it as scripts/builtin_expect.py.

The second patch is the automated part of the conversion.  The changes 
look reasonable to me, but double-checking is certainly welcome.

The third patch contains the manual part.  It is now much smaller 
because the rewriting script is more sophisticated.

Again, I used a preprocessor #define to disable __builtin_expect and 
objdump -d --reloc to compare the results.  Because of a line merge and 
the resulting line number difference in an assert statement, there was 
one assembly difference.

Testing on Fedora 20 x86_64 also revealed no regressions.

-- 
Florian Weimer / Red Hat Product Security

[-- Attachment #2: 0001-scripts-builtin_expect.py-New-script-to-rewrite-__bu.patch --]
[-- Type: text/x-patch, Size: 14439 bytes --]

From 0f3b23168cfa991c32870f00550804bb9d9b856b Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Tue, 9 Sep 2014 20:18:58 +0200
Subject: [PATCH 1/3] scripts/builtin_expect.py: New script to rewrite
 __builtin_expect

to __glibc_likely and __glibc_unlikely, as appropriate.

2014-09-09  Florian Weimer  <fweimer@redhat.com>

	* scripts/builtin_expect.py: New file.

diff --git a/scripts/builtin_expect.py b/scripts/builtin_expect.py
new file mode 100644
index 0000000..3f4a43f
--- /dev/null
+++ b/scripts/builtin_expect.py
@@ -0,0 +1,425 @@
+#!/usr/bin/python
+# Convert occurrences of __builtin_expect to __glibc_{,un}likely
+# Copyright (C) 2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+"""
+This script attempts to rewrite expressions involving __builtin_expect
+to use __glibc_likely or __glibc_unlikely, as appropriate.  The script
+rewrites in-place the input files whose names are passed as arguments
+on the command line.
+
+The following patterns are recognized:
+
+(1)   __builtin_expect (EXPR1, EXPR2) OP TERM
+
+is rewritten to:
+
+(1a)  __glibc_likely (EXPR1 OP TERM)
+
+or
+
+(1b)  __glibc_unlikely (EXPR1 OP TERM)
+
+based on the evaluation of EXPR2 OP TERM.
+
+(2)   __builtin_expect (EXPR, 1)
+
+is rewritten to:
+
+(2a)  __glibc_likely (EXPR)
+
+And finally,
+
+(3)  __builtin_expect (EXPR, 0)
+
+turns into
+
+(3a)  __glibc_unlikely (EXPR)
+
+The transformations to (2a) and (3a) are always safe because the
+macros expand back to the original expression, however the
+transformation of (1) usually gives results which better reflect the
+original intent.  The latter transformation alters the result of the
+branch hints, so it can result in different machine code.  Therefore,
+to verify the correctness of the changes, you need to compile with a
+definition like
+
+#define __builtin_expect(a, b) (a)
+
+in place, presumably in the file misc/sys/cdefs.h, right next to the
+definitions of the __glibc_likely and __glibc_unlikely macros.
+
+The direction of the branch hint is determined with heuristics.  In
+particular, it is assumed that if the expected value EXPR2 is 0, and
+TERM is not a number, then TERM does not evaluate to 0.  (Additional
+values for TERM can be defined by extending the NORMALIZE dictionary
+below.)
+
+The expression parser is just a crude approximation to the C language
+rules.  It may have to be extended to deal with additional
+constructs.  Heuristics for evaluating EXPR2 and TERM are necessary
+because the changes are applied to macro definitions as well.
+
+An attempt is made at merging a line with the next line, and the merge
+is kept if it results in a different (presumably better) match.  If
+after such a merge, the line length exceeds the 80 character limit, a
+warning is printed to standard error.  Three lines are not folded,
+such expressions have to be converted manually.
+
+The column of a line continuation character "\" is preserved, if
+possible.
+
+On success, a ChangeLog fragment is printed to standard output.
+"""
+
+import os
+import subprocess
+import sys
+import textwrap
+import time
+
+def expand(s):
+    "Expand tabs to spaces."
+    if "\t" not in s:
+        return s
+    result = ""
+    for ch in s:
+        if ch == '\t':
+            result += ' '
+            while (len(result) % 8) != 0:
+                result += ' '
+        else:
+            result += ch
+    return result
+
+def unexpand(s):
+    "Contract spaces to tabs, including non-leading spaces."
+    pos = 0
+    result = ""
+    while pos < len(s):
+        oldpos = pos
+        while pos < len(s) and s[pos] == ' ':
+            pos += 1
+        if pos - oldpos <= 1:
+            # Not enough spaces to insert a tab.
+            result += s[oldpos]
+            pos = oldpos + 1
+        else:
+            while oldpos < pos:
+                newpos = (oldpos + 8) & ~7
+                if newpos <= pos:
+                    result += '\t'
+                    oldpos = newpos
+                else:
+                    result += ' '
+                    oldpos += 1
+    return result
+
+assert expand("\t  foo\t   X") == "          foo      X"
+assert unexpand("          foo      X") == "\t  foo\t   X"
+assert unexpand("          foo      ") == "\t  foo\t   "
+assert unexpand("          foo   ") == "\t  foo\t"
+assert unexpand(r"    if (HAS_HOLES && & *inptr != '\0')     " + "\\") \
+    == "    if (HAS_HOLES && & *inptr != '\\0')\t   \\"
+
+def eol(line, pos):
+    "True if pos is at the end of line or at at a backslash."
+    return pos == len(line) or line[pos] in "\n\\"
+
+def skip_ws(line, pos):
+    "Skips over tabs and spaces starting at pos, resturns the new pos."
+    while pos < len(line) and line[pos] in " \t":
+        pos += 1
+    return pos
+
+def skip_expr(line, pos, partial = False):
+    """Skips over (most) C expressions, starting at pos.
+    
+    Returns None if the line does not contain a complete subexpression.
+    Otherwise, returns the position after the expression.
+    If partial is set, stop on the first """
+    nesting = 0
+    instr = False
+    while True:
+        if eol(line, pos) and not instr:
+            if partial:
+                break
+            return None
+        ch = line[pos]
+        if ch in '([':
+            nesting += 1
+        elif ch in ')]':
+            if nesting == 0:
+                break
+            nesting -= 1
+        elif ch == ',' and nesting == 0:
+            break
+        elif partial and ch in " \t\n\\" and nesting == 0 and not instr:
+            break
+        elif ch in "\"\'":
+            instr = not instr
+        pos += 1
+    return pos
+
+FUNC = "__builtin_expect"
+
+def match_builtin_expect(line):
+    """Finds __builtin_expect on the current line and extracts arguments.
+
+    Returns None on match failure, or (start-position, end-position,
+    first-argument, second-argument) on success."""
+    start = line.find(FUNC)
+    if start < 0:
+        return None
+    pos = skip_ws(line, start + len(FUNC))
+    if eol(line, pos):
+        return None
+    assert line[pos] == '(', repr(line[pos:])
+
+    pos += 1
+    expr_start = pos
+    pos = skip_expr(line, pos)
+    if pos is None:
+        return None
+    expr_end = pos
+    assert line[pos] == ',', repr(line[pos:])
+
+    pos += 1
+    pos = skip_ws(line, pos)
+    expect_start = pos
+    pos = skip_expr(line, pos)
+    if pos is None:
+        return None
+    expect_end = pos
+    assert line[pos] == ')', repr(line[pos:])
+
+    pos += 1
+    return start, pos, line[expr_start:expr_end], line[expect_start:expect_end]
+
+def match_operator(line, pos):
+    """Tries to match a comparison operator on the line at pos.
+
+    Returns None for no match, or
+    (new-position, operator-string, matched-operand) on success."""
+    pos = skip_ws(line, pos)
+    operator = line[pos:pos + 2]
+    if operator not in ("==", "!=", "<=", ">="):
+        operator = line[pos:pos + 1]
+        if operator not in "<>":
+            return None
+    pos = skip_ws(line, pos + len(operator))
+    start_expr = pos
+    pos = skip_expr(line, pos, True)
+    if pos is None:
+        return None
+    return pos, operator, line[start_expr:pos]
+
+def replace(line, start, end, new):
+    assert start is not None
+    assert end is not None
+    return line[:start] + new + line[end:]
+
+# Helper table for value normalization.
+NORMALIZE = {
+    "L'\\0'" : "0",
+    "'\0'" : "0",
+    "L'\\1'" : "1",
+    "'\1'" : "1",
+    "__UNKNOWN_10646_CHAR" : "0xfffd",
+}
+
+def normalize(value):
+    "Convert the value to a normalized string and an int, if possible."
+    value = value.strip()
+    value = NORMALIZE.get(value, value)
+    try:
+        num = int(value, 0)
+    except ValueError:
+        return value
+    return num
+
+def compare(left, op, right):
+    """Heuristics to determine the direction of the branch hint.
+
+    Returns None if the direction cannot be determined.
+    """
+    left = normalize(left)
+    right = normalize(right)
+    if type(left) != type(right):
+        if left == 0 or right == 0:
+            # Special case: 0 as non-matching wildcard
+            left = str(left)
+            right = str(right)
+        else:
+            return None
+    if op == '==':
+        return left == right
+    if op == '!=':
+        return left != right
+    if type(left) != type(0):
+        return None
+    if op == '<':
+        return left < right
+    if op == '<=':
+        return left <= right
+    if op == '>':
+        return left > right
+    if op == '>=':
+        return left >= right
+
+def rewrite_line(line):
+    "Rewrite __builtin_expect calls."
+    m = match_builtin_expect(line)
+    if m is None:
+        return line
+    start, end, expr, expect = m
+    m = match_operator(line, end)
+    if m is None:
+        if expect in "01":
+            if expect == "0":
+                tilt = "un"
+            else:
+                tilt = ""
+            new = "__glibc_" + tilt + "likely (" + expr + ")"
+            return replace(line, start, end, new)
+        # Else funny RHS, do not replace.
+        return line
+
+    # Comparison operator follows.
+    end, operator, value = m
+    tilt = compare(expect, operator, value)
+    if tilt is None:
+        return line
+    if tilt:
+        tilt = ""
+    else:
+        tilt = "un"
+    new = "__glibc_" + tilt + "likely (" + expr + " " + operator + " " + value + ")"
+    return replace(line, start, end, new)
+
+def adjust_continuation(old, new):
+    "Adjusts the location of the \\ continuation character."
+    if old != new and old.endswith("\\\n"):
+        assert new.endswith("\\\n"), repr((old, new))
+        oldlen = len(expand(old)) - 2
+        new = expand(new[:-2])
+        while len(new) < oldlen:
+            new += ' '
+        new = unexpand(new + "\\\n")
+    return new
+
+def starts_with_comparison(line):
+    "Check if line starts with a comparison operator."
+    line = line.strip()
+    for operator in ("==", "!=", "<", ">"):
+        if line.startswith(operator):
+            return True
+    return False
+
+def test():
+    line = "XX  __builtin_expect (ch < sizeof (array), 0) XX"
+    d = match_builtin_expect(line)
+    assert d == (4, len(line) - 3, "ch < sizeof (array)", "0"), repr(d)
+    line = "XX  __builtin_expect (strcmp (a, b), 0) == 0) X"
+    d = match_builtin_expect(line)
+    assert d == (4, len(line) - 8, "strcmp (a, b)", "0"), repr(d)
+    d = match_operator(line, len(line) - 8)
+    assert d == (len(line) - 3, "==", "0"), repr(d)
+    line =  "    else if (__builtin_expect (ch, 0) == 0xa0 \\"
+    d = rewrite_line(line)
+    assert d == "    else if (__glibc_unlikely (ch == 0xa0) \\", repr(d)
+    line = r"   __builtin_expect (cp[0], L'\1') == L'\0' && ch != '0'))    \\"
+    d = rewrite_line(line)
+    assert d == r"   __glibc_unlikely (cp[0] == L'\0') && ch != '0'))    \\", repr(d)
+    line = "if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0"
+    d = rewrite_line(line)
+    assert d == "if (__glibc_unlikely (__fxstat64 (_STAT_VER, fd, &st) < 0)", repr(d)
+test()
+del test
+
+def strip_continuation_nl(line):
+    if line.endswith("\\\n"):
+        return line[:-2].rstrip()
+    return line.rstrip()
+
+def changelog_excerpt(files):
+    email = subprocess.check_output("git config --get user.email".split())
+    name = subprocess.check_output("git config --get user.name".split())
+    tm = time.localtime(time.time())
+    result = ""
+    for path in sorted(files):
+        line = "* " + path + ": "
+        if result:
+            line += "Likewise."
+        else:
+            line += "Run scripts/builtin_expect.py to rewrite __builtin_expect expressions."
+        lines = "\n\t".join(textwrap.wrap(line))
+        result += "\t" + lines + "\n"
+    result = "{}  {}  <{}>\n\n{}".format(
+        time.strftime("%Y-%m-%d", tm), name.strip(), email.strip(), result)
+    return result
+
+def rewrite_file(path):
+    outpath = path + ".tmp"
+    with file(path, "r") as inf:
+        inflines = list(inf.readlines())
+
+    pos = 0
+    outlineno = 1
+    changed = False
+    with file(outpath, "w") as outf:
+        while pos < len(inflines):
+            line = inflines[pos]
+            if pos + 1 < len(inflines):
+                nextline = inflines[pos + 1]
+            else:
+                nextline = ''
+
+            new = rewrite_line(line)
+            if (new == line and line.find(FUNC)) \
+               or (new != line and starts_with_comparison(nextline)):
+                # Try to rewrite both lines together.
+                combined = \
+                    strip_continuation_nl(line) + ' ' + nextline.lstrip()
+                new_combined = rewrite_line(combined)
+                if not new_combined.startswith(strip_continuation_nl(new)):
+                    # Rewriting both lines together resulted in a
+                    # material change, so use this combination.
+                    new = new_combined
+                    pos += 1
+            # Adjust the position of the \ character, if any.
+            new = adjust_continuation(line, new)
+            if len(expand(new)) >= 80 and len(expand(line)) < 80:
+                sys.stderr.write("{}:{}: long line in result\n".format(
+                    path, outlineno))
+            outf.write(new)
+            changed = changed or new != line
+            pos += 1
+            outlineno += 1
+    os.rename(outpath, path)
+    return changed
+
+if len(sys.argv) < 2:
+    sys.stderr.write("usage: {} PATH...\n".format(sys.argv[0]))
+    sys.exit(1)
+
+changed = []
+for path in sys.argv[1:]:
+    if rewrite_file(path):
+        changed.append(path)
+if changed:
+    sys.stdout.write(changelog_excerpt(changed))
+
-- 
1.9.3


[-- Attachment #3: 0002-Convert-iconv-and-iconvdata-from-__builtin_expect-to.patch --]
[-- Type: text/x-patch, Size: 103396 bytes --]

From 9cbe57c7461e924217d76e336d38db2b8a7b3ca9 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Tue, 9 Sep 2014 20:28:12 +0200
Subject: [PATCH 2/3] Convert iconv/ and iconvdata/ from __builtin_expect to
 __glibc_{,un}likely

This the automated part of the conversion, generated by
scripts/builtin_expect.py.

2014-09-09  Florian Weimer  <fweimer@redhat.com>

	* iconv/gconv_cache.c: Run scripts/builtin_expect.py to rewrite
	__builtin_expect expressions.
	* iconv/gconv_db.c: Likewise.
	* iconv/gconv_dl.c: Likewise.
	* iconv/gconv_open.c: Likewise.
	* iconv/gconv_simple.c: Likewise.
	* iconv/iconv_open.c: Likewise.
	* iconv/loop.c: Likewise.
	* iconv/skeleton.c: Likewise.
	* iconvdata/8bit-gap.c: Likewise.
	* iconvdata/8bit-generic.c: Likewise.
	* iconvdata/ansi_x3.110.c: Likewise.
	* iconvdata/big5.c: Likewise.
	* iconvdata/big5hkscs.c: Likewise.
	* iconvdata/cp1255.c: Likewise.
	* iconvdata/cp1258.c: Likewise.
	* iconvdata/cp932.c: Likewise.
	* iconvdata/euc-cn.c: Likewise.
	* iconvdata/euc-jp-ms.c: Likewise.
	* iconvdata/euc-jp.c: Likewise.
	* iconvdata/euc-kr.c: Likewise.
	* iconvdata/euc-tw.c: Likewise.
	* iconvdata/gb18030.c: Likewise.
	* iconvdata/gbbig5.c: Likewise.
	* iconvdata/gbgbk.c: Likewise.
	* iconvdata/gbk.c: Likewise.
	* iconvdata/ibm1364.c: Likewise.
	* iconvdata/ibm930.c: Likewise.
	* iconvdata/ibm932.c: Likewise.
	* iconvdata/ibm933.c: Likewise.
	* iconvdata/ibm935.c: Likewise.
	* iconvdata/ibm937.c: Likewise.
	* iconvdata/ibm939.c: Likewise.
	* iconvdata/ibm943.c: Likewise.
	* iconvdata/iso-2022-cn.c: Likewise.
	* iconvdata/iso-2022-jp-3.c: Likewise.
	* iconvdata/iso-2022-jp.c: Likewise.
	* iconvdata/iso-2022-kr.c: Likewise.
	* iconvdata/iso646.c: Likewise.
	* iconvdata/iso_6937-2.c: Likewise.
	* iconvdata/iso_6937.c: Likewise.
	* iconvdata/johab.c: Likewise.
	* iconvdata/sjis.c: Likewise.
	* iconvdata/t.61.c: Likewise.
	* iconvdata/tcvn5712-1.c: Likewise.
	* iconvdata/tscii.c: Likewise.
	* iconvdata/uhc.c: Likewise.
	* iconvdata/utf-16.c: Likewise.
	* iconvdata/utf-32.c: Likewise.
	* iconvdata/utf-7.c: Likewise.

diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index f3a4337..cb48eca 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -60,12 +60,12 @@ __gconv_load_cache (void)
 
   /* See whether the cache file exists.  */
   fd = open_not_cancel (GCONV_MODULES_CACHE, O_RDONLY, 0);
-  if (__builtin_expect (fd, 0) == -1)
+  if (__glibc_unlikely (fd == -1))
     /* Not available.  */
     return -1;
 
   /* Get information about the file.  */
-  if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0
+  if (__glibc_unlikely (__fxstat64 (_STAT_VER, fd, &st) < 0)
       /* We do not have to start looking at the file if it cannot contain
 	 at least the cache header.  */
       || (size_t) st.st_size < sizeof (struct gconvcache_header))
@@ -93,7 +93,7 @@ __gconv_load_cache (void)
 	{
 	  ssize_t n = __read (fd, (char *) gconv_cache + already_read,
 			      cache_size - already_read);
-	  if (__builtin_expect (n, 0) == -1)
+	  if (__glibc_unlikely (n == -1))
 	    {
 	      free (gconv_cache);
 	      gconv_cache = NULL;
@@ -112,15 +112,15 @@ __gconv_load_cache (void)
 
   /* Check the consistency.  */
   header = (struct gconvcache_header *) gconv_cache;
-  if (__builtin_expect (header->magic, GCONVCACHE_MAGIC) != GCONVCACHE_MAGIC
-      || __builtin_expect (header->string_offset >= cache_size, 0)
-      || __builtin_expect (header->hash_offset >= cache_size, 0)
-      || __builtin_expect (header->hash_size == 0, 0)
+  if (__glibc_unlikely (header->magic != GCONVCACHE_MAGIC)
+      || __glibc_unlikely (header->string_offset >= cache_size)
+      || __glibc_unlikely (header->hash_offset >= cache_size)
+      || __glibc_unlikely (header->hash_size == 0)
       || __builtin_expect ((header->hash_offset
 			    + header->hash_size * sizeof (struct hash_entry))
 			   > cache_size, 0)
-      || __builtin_expect (header->module_offset >= cache_size, 0)
-      || __builtin_expect (header->otherconv_offset > cache_size, 0))
+      || __glibc_unlikely (header->module_offset >= cache_size)
+      || __glibc_unlikely (header->otherconv_offset > cache_size))
     {
       if (cache_malloced)
 	{
@@ -283,12 +283,12 @@ __gconv_lookup_cache (const char *toset, const char *fromset,
   to_module = &modtab[toidx];
 
   /* Avoid copy-only transformations if the user requests.   */
-  if (__builtin_expect (flags & GCONV_AVOID_NOCONV, 0) && fromidx == toidx)
+  if (__glibc_unlikely (flags & GCONV_AVOID_NOCONV) && fromidx == toidx)
     return __GCONV_NULCONV;
 
   /* If there are special conversions available examine them first.  */
   if (fromidx != 0 && toidx != 0
-      && __builtin_expect (from_module->extra_offset, 0) != 0)
+      && __glibc_unlikely (from_module->extra_offset != 0))
     {
       /* Search through the list to see whether there is a module
 	 matching the destination character set.  */
@@ -339,7 +339,7 @@ __gconv_lookup_cache (const char *toset, const char *fromset,
 		  res = find_module (strtab + extra->module[idx].dir_offset,
 				     strtab + extra->module[idx].name_offset,
 				     &result[idx]);
-		  if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
+		  if (__glibc_unlikely (res != __GCONV_OK))
 		    {
 		      /* Something went wrong.  */
 		      free (result);
@@ -362,8 +362,8 @@ __gconv_lookup_cache (const char *toset, const char *fromset,
 
  try_internal:
   /* See whether we can convert via the INTERNAL charset.  */
-  if ((fromidx != 0 && __builtin_expect (from_module->fromname_offset, 1) == 0)
-      || (toidx != 0 && __builtin_expect (to_module->toname_offset, 1) == 0)
+  if ((fromidx != 0 && __glibc_unlikely (from_module->fromname_offset == 0))
+      || (toidx != 0 && __glibc_unlikely (to_module->toname_offset == 0))
       || (fromidx == 0 && toidx == 0))
     /* Not possible.  Nothing we can do.  */
     return __GCONV_NOCONV;
@@ -392,7 +392,7 @@ __gconv_lookup_cache (const char *toset, const char *fromset,
 	  int res = find_module (strtab + from_module->todir_offset,
 				 strtab + from_module->toname_offset,
 				 &result[0]);
-	  if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
+	  if (__glibc_unlikely (res != __GCONV_OK))
 	    {
 	      /* Something went wrong.  */
 	      free (result);
@@ -426,7 +426,7 @@ __gconv_lookup_cache (const char *toset, const char *fromset,
 	  int res = find_module (strtab + to_module->fromdir_offset,
 				 strtab + to_module->fromname_offset,
 				 &result[idx]);
-	  if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
+	  if (__glibc_unlikely (res != __GCONV_OK))
 	    {
 	      /* Something went wrong.  */
 	      if (idx != 0)
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 7d752bc..5487d9d 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -302,7 +302,7 @@ gen_steps (struct derivation_step *best, const char *toset,
 # endif
 		  status = DL_CALL_FCT (init_fct, (&result[step_cnt]));
 
-		  if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
+		  if (__glibc_unlikely (status != __GCONV_OK))
 		    {
 		      failed = 1;
 		      /* Make sure we unload this modules.  */
@@ -326,7 +326,7 @@ gen_steps (struct derivation_step *best, const char *toset,
 	  current = current->last;
 	}
 
-      if (__builtin_expect (failed, 0) != 0)
+      if (__glibc_unlikely (failed != 0))
 	{
 	  /* Something went wrong while initializing the modules.  */
 	  while (++step_cnt < *nsteps)
@@ -746,7 +746,7 @@ __gconv_find_transform (const char *toset, const char *fromset,
   fromset_expand = do_lookup_alias (fromset);
   toset_expand = do_lookup_alias (toset);
 
-  if (__builtin_expect (flags & GCONV_AVOID_NOCONV, 0)
+  if (__glibc_unlikely (flags & GCONV_AVOID_NOCONV)
       /* We are not supposed to create a pseudo transformation (means
 	 copying) when the input and output character set are the same.  */
       && (strcmp (toset, fromset) == 0
diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
index 9aeaf0e..840793d 100644
--- a/iconv/gconv_dl.c
+++ b/iconv/gconv_dl.c
@@ -93,8 +93,7 @@ __gconv_find_shlib (const char *name)
 	  found->counter = -TRIES_BEFORE_UNLOAD - 1;
 	  found->handle = NULL;
 
-	  if (__builtin_expect (__tsearch (found, &loaded, known_compare)
-				== NULL, 0))
+	  if (__glibc_unlikely (__tsearch (found, &loaded, known_compare) == NULL))
 	    {
 	      /* Something went wrong while inserting the entry.  */
 	      free (found);
diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c
index bfbe22b..7d64153 100644
--- a/iconv/gconv_open.c
+++ b/iconv/gconv_open.c
@@ -179,7 +179,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
       for (runp = trans; runp != NULL; runp = runp->next)
 	{
 	  if (runp->name == NULL
-	      || __builtin_expect (__gconv_translit_find (runp), 0) == 0)
+	      || __glibc_likely (__gconv_translit_find (runp) == 0))
 	    lastp = runp;
 	  else
 	    {
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index 4ed4505..6ab90c4 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -387,8 +387,7 @@ ucs4_internal_loop_single (struct __gconv_step *step,
       return __GCONV_INCOMPLETE_INPUT;
     }
 
-  if (__builtin_expect (((unsigned char *) state->__value.__wchb)[0] > 0x80,
-			0))
+  if (__glibc_unlikely (((unsigned char *) state->__value.__wchb)[0] > 0x80))
     {
       /* The value is too large.  We don't try transliteration here since
 	 this is not an error because of the lack of possibilities to
@@ -762,8 +761,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
       return __GCONV_INCOMPLETE_INPUT;
     }
 
-  if (__builtin_expect (((unsigned char *) state->__value.__wchb)[3] > 0x80,
-			0))
+  if (__glibc_unlikely (((unsigned char *) state->__value.__wchb)[3] > 0x80))
     {
       /* The value is too large.  We don't try transliteration here since
 	 this is not an error because of the lack of possibilities to
diff --git a/iconv/iconv_open.c b/iconv/iconv_open.c
index 7bf19f5..5d2e926 100644
--- a/iconv/iconv_open.c
+++ b/iconv/iconv_open.c
@@ -75,7 +75,7 @@ iconv_open (const char *tocode, const char *fromcode)
   if (! tocode_usealloca)
     free (tocode_conv);
 
-  if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
+  if (__glibc_unlikely (res != __GCONV_OK))
     {
       /* We must set the error number according to the specs.  */
       if (res == __GCONV_NOCONV || res == __GCONV_NODB)
diff --git a/iconv/loop.c b/iconv/loop.c
index a480c0c..3d831c9 100644
--- a/iconv/loop.c
+++ b/iconv/loop.c
@@ -307,7 +307,7 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
 	 compiler generating better code.  They will be optimized away
 	 since MIN_NEEDED_OUTPUT is always a constant.  */
       if (MIN_NEEDED_INPUT > 1
-	  && __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0))
+	  && __glibc_unlikely (inptr + MIN_NEEDED_INPUT > inend))
 	{
 	  /* We don't have enough input for another complete input
 	     character.  */
@@ -315,9 +315,9 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
 	  break;
 	}
       if ((MIN_NEEDED_OUTPUT != 1
-	   && __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0))
+	   && __glibc_unlikely (outptr + MIN_NEEDED_OUTPUT > outend))
 	  || (MIN_NEEDED_OUTPUT == 1
-	      && __builtin_expect (outptr >= outend, 0)))
+	      && __glibc_unlikely (outptr >= outend)))
 	{
 	  /* Overflow in the output buffer.  */
 	  result = __GCONV_FULL_OUTPUT;
@@ -394,7 +394,7 @@ SINGLE(LOOPFCT) (struct __gconv_step *step,
 
   /* Are there enough bytes in the input buffer?  */
   if (MIN_NEEDED_INPUT > 1
-      && __builtin_expect (inptr + (MIN_NEEDED_INPUT - inlen) > inend, 0))
+      && __glibc_unlikely (inptr + (MIN_NEEDED_INPUT - inlen) > inend))
     {
       *inptrp = inend;
 #  ifdef STORE_REST
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index 73dc186..b1c5f01 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -333,7 +333,7 @@ gconv_init (struct __gconv_step *step)
       step->__btowc_fct = FROM_ONEBYTE;
 #endif
     }
-  else if (__builtin_expect (strcmp (step->__to_name, CHARSET_NAME), 0) == 0)
+  else if (__glibc_likely (strcmp (step->__to_name, CHARSET_NAME) == 0))
     {
       step->__data = TO_DIRECTION_VAL;
 
@@ -503,7 +503,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
     {
       /* We preserve the initial values of the pointer variables.  */
       const unsigned char *inptr = *inptrp;
-      unsigned char *outbuf = (__builtin_expect (outbufstart == NULL, 1)
+      unsigned char *outbuf = (__glibc_likely (outbufstart == NULL)
 			       ? data->__outbuf : *outbufstart);
       unsigned char *outend = data->__outbufend;
       unsigned char *outstart;
@@ -573,7 +573,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
 #  endif
 # endif
 
-	  if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
+	  if (__glibc_unlikely (status != __GCONV_OK))
 	    return status;
 	}
 #endif
@@ -772,7 +772,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
       if (((FROM_LOOP_MAX_NEEDED_FROM > 1 && TO_LOOP_MAX_NEEDED_FROM > 1)
 	   || (FROM_LOOP_MAX_NEEDED_FROM > 1 && FROM_DIRECTION)
 	   || (TO_LOOP_MAX_NEEDED_FROM > 1 && !FROM_DIRECTION))
-	  && __builtin_expect (consume_incomplete, 0)
+	  && __glibc_unlikely (consume_incomplete)
 	  && status == __GCONV_INCOMPLETE_INPUT)
 	{
 # ifdef STORE_REST
diff --git a/iconvdata/8bit-gap.c b/iconvdata/8bit-gap.c
index 3bd7149..e08b15a 100644
--- a/iconvdata/8bit-gap.c
+++ b/iconvdata/8bit-gap.c
@@ -53,7 +53,7 @@ struct gap
   {									      \
     uint32_t ch = to_ucs4[*inptr];					      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && NONNUL (*inptr))    \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && NONNUL (*inptr))	      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -71,7 +71,7 @@ struct gap
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && NONNUL (c))	      \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && NONNUL (c))	      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -97,10 +97,10 @@ struct gap
     else								      \
       while (ch > rp->end)						      \
 	++rp;								      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (res = from_ucs4[ch + rp->idx],				      \
-	    __builtin_expect (res, '\1') == '\0' && ch != 0))		      \
+	    __glibc_unlikely (res == '\0') && ch != 0))			      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c
index efc0fd5..3d6a7c5 100644
--- a/iconvdata/8bit-generic.c
+++ b/iconvdata/8bit-generic.c
@@ -37,7 +37,7 @@
   {									      \
     uint32_t ch = to_ucs4[*inptr];					      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && *inptr != '\0')     \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && *inptr != '\0')	      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -52,7 +52,7 @@
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (HAS_HOLES && __builtin_expect (ch == L'\0', 0) && c != '\0')	      \
+    if (HAS_HOLES && __glibc_unlikely (ch == L'\0') && c != '\0')	      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -68,8 +68,8 @@
   {									      \
     uint32_t ch = get32 (inptr);					      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]), 0)\
-	|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0))	      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]))   \
+	|| (__glibc_unlikely (from_ucs4[ch] == '\0') && ch != 0))	      \
       {									      \
 	UNICODE_TAG_HANDLER (ch, 4);					      \
 									      \
diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c
index d602dfa..e645b5f 100644
--- a/iconvdata/ansi_x3.110.c
+++ b/iconvdata/ansi_x3.110.c
@@ -402,7 +402,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = *inptr;						      \
     int incr;								      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -417,8 +417,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -435,7 +435,7 @@ static const char from_ucs4[][2] =
 	incr = 1;							      \
       }									      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+    if (__glibc_unlikely (ch == 0) && *inptr != '\0')			      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (incr);				      \
@@ -453,7 +453,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = to_ucs4[c];						      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && c != '\0')			      \
+    if (__glibc_unlikely (ch == 0) && c != '\0')			      \
       return WEOF;							      \
     else								      \
       return ch;							      \
@@ -472,8 +472,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-	0))								      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))								      \
       {									      \
 	if (ch == 0x2c7)						      \
 	  cp = "\xcf\x20";						      \
@@ -543,7 +542,7 @@ static const char from_ucs4[][2] =
 	    tmp[1] = '\0';						      \
 	    cp = tmp;							      \
 	  }								      \
-	else if (__builtin_expect (ch, 0x266a) == 0x266a)		      \
+	else if (__glibc_likely (ch == 0x266a))				      \
 	  cp = "\xd5";							      \
 	else								      \
 	  {								      \
@@ -557,7 +556,7 @@ static const char from_ucs4[][2] =
       {									      \
 	cp = from_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+	if (__glibc_unlikely (cp[0] == '\0') && ch != 0)		      \
 	  {								      \
 	    /* Illegal characters.  */					      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/big5.c b/iconvdata/big5.c
index ee3dede..69258d9 100644
--- a/iconvdata/big5.c
+++ b/iconvdata/big5.c
@@ -8414,8 +8414,8 @@ static const char from_ucs4_tab15[][2] =
 	/* See whether the second byte is in the correct range.  */	      \
 	if (ch2 >= 0x40 && ch2 <= 0x7e)					      \
 	  idx += ch2 - 0x40;						      \
-	else if (__builtin_expect (ch2 >= 0xa1, 1)			      \
-		 && __builtin_expect (ch2 <= 0xfe, 1))			      \
+	else if (__glibc_likely (ch2 >= 0xa1)				      \
+		 && __glibc_likely (ch2 <= 0xfe))			      \
 	  idx += 0x3f + (ch2 - 0xa1);					      \
 	else								      \
 	  {								      \
@@ -8467,8 +8467,7 @@ static const char from_ucs4_tab15[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= (sizeof (from_ucs4_tab1)		      \
-				 / sizeof (from_ucs4_tab1[0])), 0))	      \
+    if (__glibc_unlikely (ch >= (sizeof (from_ucs4_tab1) / sizeof (from_ucs4_tab1[0]))))	      \
       switch (ch)							      \
 	{								      \
         case 0x2c7 ... 0x2d9:						      \
@@ -8555,7 +8554,7 @@ static const char from_ucs4_tab15[][2] =
     else								      \
       cp = from_ucs4_tab1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
@@ -8563,8 +8562,8 @@ static const char from_ucs4_tab15[][2] =
     else								      \
       {									      \
 	/* See whether there is enough room for the second byte we write.  */ \
-	if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	    && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	if (__glibc_likely (cp[1] != '\0')				      \
+	    && __glibc_unlikely (outptr + 1 >= outend))			      \
 	  {								      \
 	    /* We have not enough room.  */				      \
 	    result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c
index 5dce195..64cc161 100644
--- a/iconvdata/big5hkscs.c
+++ b/iconvdata/big5hkscs.c
@@ -18001,8 +18001,8 @@ static struct
 	      }								      \
 									      \
 	    /* See whether there is enough room to write the second byte.  */ \
-	    if (__builtin_expect (cp[1] != '\0', 1)			      \
-		&& __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 		/* We have not enough room.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/cp1255.c b/iconvdata/cp1255.c
index 1fab525..c4a3bec 100644
--- a/iconvdata/cp1255.c
+++ b/iconvdata/cp1255.c
@@ -307,7 +307,7 @@ static const struct { unsigned int idx; unsigned int len; } comp_table[8] = {
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/cp1258.c b/iconvdata/cp1258.c
index 5153eea..c93886f 100644
--- a/iconvdata/cp1258.c
+++ b/iconvdata/cp1258.c
@@ -465,7 +465,7 @@ static const struct
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/cp932.c b/iconvdata/cp932.c
index a358eda..7c094b2 100644
--- a/iconvdata/cp932.c
+++ b/iconvdata/cp932.c
@@ -4552,9 +4552,9 @@ static const char from_ucs4_extra[229][2] =
 	ch += 0xfec0;                                                         \
 	++inptr;                                                              \
       }									      \
-    else if (__builtin_expect (ch, 0) == 0xa0				      \
-	     || __builtin_expect (ch <= 0x80, 0)			      \
-	     || __builtin_expect (ch > 0xfc, 0))			      \
+    else if (__glibc_unlikely (ch == 0xa0)				      \
+	     || __glibc_unlikely (ch <= 0x80)				      \
+	     || __glibc_unlikely (ch > 0xfc))				      \
       {									      \
 	/* These are illegal.  */					      \
 	if (! ignore_errors_p ())					      \
@@ -4585,16 +4585,16 @@ static const char from_ucs4_extra[229][2] =
 									      \
 	ch2 = inptr[1];							      \
 	idx = ch * 256 + ch2;						      \
-	if (__builtin_expect (ch2 < 0x40, 0)				      \
-	    || __builtin_expect (ch2 > 0xfc, 0)				      \
-	    || __builtin_expect (ch2 == 0x7f, 0)			      \
-	    || (__builtin_expect (idx > 0x84be, 0) && idx < 0x8740)	      \
-	    || (__builtin_expect (idx > 0x879c, 0) && idx < 0x889f)	      \
-	    || (__builtin_expect (idx > 0x88fc, 0) && idx < 0x8940)	      \
-	    || (__builtin_expect (idx > 0x9ffc, 0) && idx < 0xe040)	      \
-	    || (__builtin_expect (idx > 0xeaa4, 0) && idx < 0xed40)	      \
-	    || (__builtin_expect (idx > 0xeefc, 0) && idx < 0xf040)	      \
-	    || __builtin_expect (idx > 0xfc4b, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x40)				      \
+	    || __glibc_unlikely (ch2 > 0xfc)				      \
+	    || __glibc_unlikely (ch2 == 0x7f)				      \
+	    || (__glibc_unlikely (idx > 0x84be) && idx < 0x8740)	      \
+	    || (__glibc_unlikely (idx > 0x879c) && idx < 0x889f)	      \
+	    || (__glibc_unlikely (idx > 0x88fc) && idx < 0x8940)	      \
+	    || (__glibc_unlikely (idx > 0x9ffc) && idx < 0xe040)	      \
+	    || (__glibc_unlikely (idx > 0xeaa4) && idx < 0xed40)	      \
+	    || (__glibc_unlikely (idx > 0xeefc) && idx < 0xf040)	      \
+	    || __glibc_unlikely (idx > 0xfc4b))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    if (! ignore_errors_p ())					      \
@@ -4629,7 +4629,7 @@ static const char from_ucs4_extra[229][2] =
 	else								      \
 	  ch = cjk_block7[(ch - 0xfa) * 192 + ch2 - 0x40];		      \
 									      \
-	if (__builtin_expect (ch, 1) == 0)				      \
+	if (__glibc_unlikely (ch == 0))					      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -4681,8 +4681,8 @@ static const char from_ucs4_extra[229][2] =
 	  }								      \
 	else if (ch >= 0xf929 && ch <= 0xfa2d)				      \
 	  cp = from_ucs4_cjkcpt[ch - 0xf929];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffe5, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffe5))			      \
 	  cp = from_ucs4_extra[ch - 0xff01];				      \
 	else								      \
 	  {								      \
@@ -4694,7 +4694,7 @@ static const char from_ucs4_extra[229][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/euc-cn.c b/iconvdata/euc-cn.c
index 0d625b4..1b0b307 100644
--- a/iconvdata/euc-cn.c
+++ b/iconvdata/euc-cn.c
@@ -45,8 +45,8 @@
     if (ch <= 0x7f)							      \
       ++inptr;								      \
     else								      \
-      if ((__builtin_expect (ch <= 0xa0, 0) && ch != 0x8e && ch != 0x8f)      \
-	  || __builtin_expect (ch > 0xfe, 0))				      \
+      if ((__glibc_unlikely (ch <= 0xa0) && ch != 0x8e && ch != 0x8f)	      \
+	  || __glibc_unlikely (ch > 0xfe))				      \
 	{								      \
 	  /* This is illegal.  */					      \
 	  STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -115,9 +115,9 @@
 	size_t found;							      \
 									      \
 	found = ucs4_to_gb2312 (ch, outptr, outend - outptr);		      \
-	if (__builtin_expect (found, 1) != 0)				      \
+	if (__glibc_likely (found != 0))				      \
 	  {								      \
-	    if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (found == __UNKNOWN_10646_CHAR))	      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/euc-jp-ms.c b/iconvdata/euc-jp-ms.c
index 8aed520..bb18a9d 100644
--- a/iconvdata/euc-jp-ms.c
+++ b/iconvdata/euc-jp-ms.c
@@ -4699,11 +4699,11 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    continue;							      \
 	  }								      \
 									      \
-	if (__builtin_expect(ch == 0x8e, 0))				      \
+	if (__glibc_unlikely (ch == 0x8e))				      \
 	  {								      \
 	    /* This is code set 2: half-width katakana.  */		      \
 	    ch = jisx0201_to_ucs4 (ch2);				      \
-	    /*if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)*/	      \
+	    /*if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))*/	      \
 	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	      {								      \
 		/* Illegal character.  */				      \
@@ -4722,7 +4722,7 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    const unsigned char *endp = inptr;				      \
 	    int mblen = 1;						      \
 									      \
-	    if (__builtin_expect(ch == 0x8f, 0))			      \
+	    if (__glibc_unlikely (ch == 0x8f))				      \
 	      {								      \
 		if (inend - inptr < 3)					      \
 		  ch = 0;						      \
@@ -4731,8 +4731,8 @@ static const unsigned char from_ucs4_extra[229][2] =
 		    unsigned char ch3 = (unsigned char)inptr[2];	      \
 		    mblen = 3;						      \
 									      \
-		    if (__builtin_expect(ch3 == 0xff, 0)		      \
-		        || __builtin_expect(ch3 < 0xa1, 0))		      \
+		    if (__glibc_unlikely (ch3 == 0xff)			      \
+			|| __glibc_unlikely (ch3 < 0xa1))		      \
 		      ch = __UNKNOWN_10646_CHAR;			      \
 		    else if (ch2 <= 0xf2)				      \
 		      {							      \
@@ -4769,13 +4769,13 @@ static const unsigned char from_ucs4_extra[229][2] =
 		      ch = __UNKNOWN_10646_CHAR;			      \
 		  }							      \
 	      }								      \
-	    else if (__builtin_expect(0xa1 <= ch, 1))			      \
+	    else if (__glibc_likely (0xa1 <= ch))			      \
 	      {								      \
 		mblen = 2;						      \
 									      \
 		if (inend - inptr < 2)					      \
 		  ch = 0;						      \
-		else if (__builtin_expect(ch2 == 0xff, 0))		      \
+		else if (__glibc_unlikely (ch2 == 0xff))		      \
 		  ch = __UNKNOWN_10646_CHAR;				      \
 		else if (ch <= 0xa8)					      \
 		  {							      \
@@ -4809,13 +4809,13 @@ static const unsigned char from_ucs4_extra[229][2] =
 	    else							      \
 	      ch = __UNKNOWN_10646_CHAR;				      \
 									      \
-	    if (__builtin_expect (ch, 1) == 0)				      \
+	    if (__glibc_unlikely (ch == 0))				      \
 	      {								      \
 		/* Not enough input available.  */			      \
 		result = __GCONV_INCOMPLETE_INPUT;			      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	      {								      \
 		/* Illegal character.  */				      \
 		if (! ignore_errors_p ())				      \
@@ -4873,8 +4873,8 @@ static const unsigned char from_ucs4_extra[229][2] =
 	  }								      \
 	else if (ch >= 0xf929 && ch <= 0xfa2d)				      \
 	  cp = from_ucs4_cjkcpt[ch - 0xf929];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffe5, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffe5))			      \
 	  cp = from_ucs4_extra[ch - 0xff01];				      \
 	else								      \
 	  {								      \
@@ -4886,7 +4886,7 @@ static const unsigned char from_ucs4_extra[229][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/euc-jp.c b/iconvdata/euc-jp.c
index 7689250..616045e 100644
--- a/iconvdata/euc-jp.c
+++ b/iconvdata/euc-jp.c
@@ -76,7 +76,7 @@
 	  {								      \
 	    /* This is code set 2: half-width katakana.  */		      \
 	    ch = jisx0201_to_ucs4 (ch2);				      \
-	    if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
 									      \
 	    inptr += 2;							      \
@@ -100,7 +100,7 @@
 		ch = jisx0208_to_ucs4 (&endp, inend - inptr, 0x80);	      \
 	      }								      \
 									      \
-	    if (__builtin_expect (ch, 1) == 0)				      \
+	    if (__glibc_unlikely (ch == 0))				      \
 	      {								      \
 		/* Not enough input available.  */			      \
 		result = __GCONV_INCOMPLETE_INPUT;			      \
@@ -182,13 +182,13 @@
 		found = ucs4_to_jisx0212 (ch, outptr + 1,		      \
 					  outend - outptr - 1);		      \
 		  							      \
-		if (__builtin_expect (found, 1) == 0)			      \
+		if (__glibc_unlikely (found == 0))			      \
 		  {							      \
 		    /* We ran out of space.  */				      \
 		    result = __GCONV_FULL_OUTPUT;			      \
 		    break;						      \
 		  }							      \
-		else if (__builtin_expect (found, 0) != __UNKNOWN_10646_CHAR) \
+		else if (__glibc_likely (found != __UNKNOWN_10646_CHAR))      \
 		  {							      \
 		    /* It's a JIS 0212 character, adjust it for EUC-JP.  */   \
 		    *outptr++ = 0x8f;					      \
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index 3b13c2e..50d1a8c 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -29,7 +29,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
 {
   if (ch > 0x9f)
     {
-      if (__builtin_expect (ch, 0) == 0x20a9)
+      if (__glibc_unlikely (ch == 0x20a9))
 	{
 	  /* Half-width Korean Currency WON sign.  There is no
              equivalent in EUC-KR.  Some mappings use \x5c because
@@ -38,8 +38,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
 	  cp[0] = '\xa3';
 	  cp[1] = '\xdc';
 	}
-      else if (__builtin_expect (ucs4_to_ksc5601 (ch, cp, 2), 0)
-	  != __UNKNOWN_10646_CHAR)
+      else if (__glibc_likely (ucs4_to_ksc5601 (ch, cp, 2) != __UNKNOWN_10646_CHAR))
 	{
 	  cp[0] |= 0x80;
 	  cp[1] |= 0x80;
@@ -82,9 +81,9 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
       ++inptr;								      \
     /* 0xfe(->0x7e : row 94) and 0xc9(->0x59 : row 41) are		      \
        user-defined areas.  */						      \
-    else if (__builtin_expect (ch == 0xa0, 0)				      \
-	     || __builtin_expect (ch > 0xfe, 0)				      \
-	     || __builtin_expect (ch == 0xc9, 0))			      \
+    else if (__glibc_unlikely (ch == 0xa0)				      \
+	     || __glibc_unlikely (ch > 0xfe)				      \
+	     || __glibc_unlikely (ch == 0xc9))				      \
       {									      \
 	/* This is illegal.  */						      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -133,7 +132,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
        Jamos should be considered either here or in euckr_from_ucs4() */      \
     euckr_from_ucs4 (ch, cp);						      \
 									      \
-    if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	UNICODE_TAG_HANDLER (ch, 4);					      \
 									      \
diff --git a/iconvdata/euc-tw.c b/iconvdata/euc-tw.c
index 153e3a0..9218091 100644
--- a/iconvdata/euc-tw.c
+++ b/iconvdata/euc-tw.c
@@ -140,13 +140,13 @@
 	size_t found;							      \
 									      \
 	found = ucs4_to_cns11643l1 (ch, outptr, outend - outptr);	      \
-	if (__builtin_expect (found, 1) == 0)				      \
+	if (__glibc_unlikely (found == 0))				      \
 	  {								      \
 	    /* We ran out of space.  */					      \
 	    result = __GCONV_FULL_OUTPUT;				      \
 	    break;							      \
 	  }								      \
-	if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR)	      \
+	if (__glibc_likely (found != __UNKNOWN_10646_CHAR))		      \
 	  {								      \
 	    /* It's a CNS 11643, plane 1 character, adjust it for EUC-TW.  */ \
 	    *outptr++ += 0x80;						      \
@@ -157,13 +157,13 @@
 	    /* No CNS 11643, plane 1 character.  */			      \
 									      \
 	    found = ucs4_to_cns11643 (ch, outptr + 1, outend - outptr - 1);   \
-	    if (__builtin_expect (found, 1) == 0)			      \
+	    if (__glibc_unlikely (found == 0))				      \
 	      {								      \
 		/* We ran out of space.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)	      \
+	    if (__glibc_unlikely (found == __UNKNOWN_10646_CHAR))	      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/gb18030.c b/iconvdata/gb18030.c
index f12c451..cb466f3 100644
--- a/iconvdata/gb18030.c
+++ b/iconvdata/gb18030.c
@@ -24350,8 +24350,8 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
 	else								      \
 	  len = 0;							      \
 									      \
-	if (__builtin_expect (len, 2) == 0				      \
-	    || (len == 2 && __builtin_expect (cp[0], '\1') == '\0'))          \
+	if (__glibc_unlikely (len == 0)					      \
+	    || (len == 2 && __glibc_unlikely (cp[0] == '\0')))		      \
 	  {								      \
 	    /* Illegal character.  */					      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
@@ -24361,7 +24361,7 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
 	  {								      \
 	    /* See whether there is enough room for the second byte we	      \
 	       write.  */						      \
-	    if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0))  \
+	    if (cp[1] != '\0' && __glibc_unlikely (outptr + 1 >= outend))     \
 	      {								      \
 		/* We have not enough room.  */				      \
 		result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/gbbig5.c b/iconvdata/gbbig5.c
index ddaa468..cf4bc4b 100644
--- a/iconvdata/gbbig5.c
+++ b/iconvdata/gbbig5.c
@@ -4852,8 +4852,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	else								      \
 	  {								      \
 	    /* See whether there is enough room to write the second byte. */  \
-	    if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	        && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 	        /* We do not have enough room.  */			      \
 	        result = __GCONV_FULL_OUTPUT;				      \
@@ -4908,8 +4908,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	/* See if the second byte is in the correct range. */		      \
 	if (ch >= 0x40 && ch <= 0x7e)					      \
 	  idx += ch - 0x40;						      \
-	else if (__builtin_expect (ch >= 0xa1, 1)		  	      \
-		 && __builtin_expect (ch <= 0xfe, 1))			      \
+	else if (__glibc_likely (ch >= 0xa1)				      \
+		 && __glibc_likely (ch <= 0xfe))			      \
 	  idx += 0x3f + (ch - 0xa1);					      \
 	else								      \
 	  {								      \
@@ -4943,8 +4943,8 @@ const char __from_big5_to_gb2312 [13973][2] =
 	else								      \
 	  {								      \
 	    /* see if there is enough room to write the second byte. */	      \
-	    if (__builtin_expect (cp[1], '\1') != '\0'			      \
-	        && __builtin_expect (outptr + 1 >= outend, 0))		      \
+	    if (__glibc_likely (cp[1] != '\0')				      \
+		&& __glibc_unlikely (outptr + 1 >= outend))		      \
 	      {								      \
 	        /* We do not have enough room.  */			      \
 	        result = __GCONV_FULL_OUTPUT;				      \
diff --git a/iconvdata/gbgbk.c b/iconvdata/gbgbk.c
index 620c39d..eaefecb 100644
--- a/iconvdata/gbgbk.c
+++ b/iconvdata/gbgbk.c
@@ -96,16 +96,16 @@
 	  ch = 0xa1aa;							      \
 									      \
 	/* Now determine whether the character is valid.  */		      \
-	if (__builtin_expect (ch < 0xa1a1, 0)				      \
-	    || __builtin_expect (ch > 0xf7fe, 0)			      \
-	    || __builtin_expect (inptr[1] < 0xa1, 0)			      \
+	if (__glibc_unlikely (ch < 0xa1a1)				      \
+	    || __glibc_unlikely (ch > 0xf7fe)				      \
+	    || __glibc_unlikely (inptr[1] < 0xa1)			      \
 	    /* Now test the exceptions.  */				      \
-	    || (__builtin_expect (ch >= 0xa2a1, 0)			      \
-		&& __builtin_expect (ch <= 0xa2aa, 0))			      \
-	    || (__builtin_expect (ch >= 0xa6e0, 0)			      \
-		&& __builtin_expect (ch <= 0xa6f5, 0))			      \
-	    || (__builtin_expect (ch >= 0xa8bb, 0)			      \
-		&& __builtin_expect (ch <= 0xa8c0, 0)))			      \
+	    || (__glibc_unlikely (ch >= 0xa2a1)				      \
+		&& __glibc_unlikely (ch <= 0xa2aa))			      \
+	    || (__glibc_unlikely (ch >= 0xa6e0)				      \
+		&& __glibc_unlikely (ch <= 0xa6f5))			      \
+	    || (__glibc_unlikely (ch >= 0xa8bb)				      \
+		&& __glibc_unlikely (ch <= 0xa8c0)))			      \
 	  {								      \
 	    /* One of the characters we cannot map.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (2);				      \
diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
index b1a7719..f3ca343 100644
--- a/iconvdata/gbk.c
+++ b/iconvdata/gbk.c
@@ -13145,8 +13145,8 @@ static const char __gbk_from_ucs4_tab12[][2] =
     if (ch <= 0x7f)							      \
       ++inptr;								      \
     else								      \
-      if (__builtin_expect (ch <= 0x80, 0)				      \
-	  || __builtin_expect (ch > 0xfe, 0))				      \
+      if (__glibc_unlikely (ch <= 0x80)					      \
+	  || __glibc_unlikely (ch > 0xfe))				      \
 	{								      \
 	  /* This is illegal.  */					      \
 	  STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -13170,8 +13170,8 @@ static const char __gbk_from_ucs4_tab12[][2] =
 									      \
 	  /* All second bytes of a multibyte character must be >= 0x40, and   \
 	     the __gbk_to_ucs table only covers the range up to 0xfe 0xa0. */ \
-	  if (__builtin_expect (ch2 < 0x40, 0)				      \
-	      || (__builtin_expect (ch, 0x81) == 0xfe && ch2 > 0xa0))	      \
+	  if (__glibc_unlikely (ch2 < 0x40)				      \
+	      || (__glibc_unlikely (ch == 0xfe) && ch2 > 0xa0))		      \
 	    {								      \
 	      /* This is an illegal character.  */			      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -13182,7 +13182,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
 									      \
 	  ch = __gbk_to_ucs[idx];					      \
 									      \
-	  if (__builtin_expect (ch, 1) == 0 && *inptr != '\0')		      \
+	  if (__glibc_unlikely (ch == 0) && *inptr != '\0')		      \
 	    {								      \
 	      /* This is an illegal character.  */			      \
 	      STANDARD_FROM_LOOP_ERR_HANDLER (2);			      \
@@ -13456,13 +13456,13 @@ static const char __gbk_from_ucs4_tab12[][2] =
 	  cp = "";							      \
 	  break; 							      \
 	}								      \
-      if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+      if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
 	{								      \
 	  /* Illegal character.  */					      \
 	  STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	}								      \
       /* See whether there is enough room for the second byte we write.  */   \
-      else if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0))   \
+      else if (cp[1] != '\0' && __glibc_unlikely (outptr + 1 >= outend))      \
 	{								      \
 	  /* We have not enough room.  */				      \
 	  result = __GCONV_FULL_OUTPUT;					      \
diff --git a/iconvdata/ibm1364.c b/iconvdata/ibm1364.c
index cf80993..f6dcf50 100644
--- a/iconvdata/ibm1364.c
+++ b/iconvdata/ibm1364.c
@@ -155,7 +155,7 @@ enum
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -167,7 +167,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    if (__builtin_expect (ch, 0) == SI)					      \
+    if (__glibc_unlikely (ch == SI))					      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -184,7 +184,7 @@ enum
       {									      \
 	/* Use the IBM13XX table for single byte.  */			      \
 	uint32_t res = SB_TO_UCS4[ch];				      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -221,10 +221,10 @@ enum
 	  ++rp2;							      \
 									      \
 	uint32_t res;							      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = DB_TO_UCS4[ch + rp2->idx],			      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -325,18 +325,18 @@ enum
 									      \
     /* Use the UCS4 table for single byte.  */				      \
     const char *cp;							      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = UCS4_TO_SB[ch + rp1->idx],				      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	const struct gap *rp2 = UCS4_TO_DB_IDX;				      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = UCS4_TO_DB[ch + rp2->idx],				      \
-		__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
diff --git a/iconvdata/ibm930.c b/iconvdata/ibm930.c
index 768a444..c1fa824 100644
--- a/iconvdata/ibm930.c
+++ b/iconvdata/ibm930.c
@@ -103,7 +103,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -115,7 +115,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Shift IN, change to SBCS converter */			      \
 	if (curcs == sb)						      \
@@ -132,7 +132,7 @@ enum
       {									      \
 	/* Use the IBM930 table for single byte.  */			      \
 	res = __ibm930sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -163,10 +163,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm930db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -209,17 +209,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm930sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm930db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')== L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm932.c b/iconvdata/ibm932.c
index aa69d65..9a1288f 100644
--- a/iconvdata/ibm932.c
+++ b/iconvdata/ibm932.c
@@ -50,11 +50,11 @@
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch == 0x80, 0)				      \
-	|| __builtin_expect (ch == 0xa0, 0)				      \
-	|| __builtin_expect (ch == 0xfd, 0)				      \
-	|| __builtin_expect (ch == 0xfe, 0)				      \
-	|| __builtin_expect (ch == 0xff, 0))				      \
+    if (__glibc_unlikely (ch == 0x80)					      \
+	|| __glibc_unlikely (ch == 0xa0)				      \
+	|| __glibc_unlikely (ch == 0xfd)				      \
+	|| __glibc_unlikely (ch == 0xfe)				      \
+	|| __glibc_unlikely (ch == 0xff))				      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -62,7 +62,7 @@
 									      \
     /* Use the IBM932 table for single byte.  */			      \
     res = __ibm932sb_to_ucs4[ch];					      \
-    if (__builtin_expect (res == 0, 0) && ch != 0)			      \
+    if (__glibc_unlikely (res == 0) && ch != 0)				      \
       {									      \
 	/* Use the IBM932 table for double byte.  */			      \
 	if (__glibc_unlikely (inptr + 1 >= inend))			      \
@@ -79,9 +79,9 @@
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (res = __ibm932db_to_ucs4[ch + rp2->idx],		      \
-	    __builtin_expect (res, '\1') == 0 && ch !=0))		      \
+	    __glibc_unlikely (res == 0) && ch !=0))			      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -146,10 +146,10 @@
 	++rp;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (sc = __ucs4_to_ibm932sb[ch + rp->idx],			      \
-	__builtin_expect (sc, '\1') == '\0' && ch != L'\0'))		      \
+	__glibc_unlikely (sc == '\0') && ch != L'\0'))			      \
       {									      \
 									      \
 	/* Use the UCS4 table for double byte.  */			      \
diff --git a/iconvdata/ibm933.c b/iconvdata/ibm933.c
index 461fb5e..acfafad 100644
--- a/iconvdata/ibm933.c
+++ b/iconvdata/ibm933.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM933 table for single byte.  */			      \
 	res = __ibm933sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm933db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm933sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm933db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm935.c b/iconvdata/ibm935.c
index 132d816..4c3dddf 100644
--- a/iconvdata/ibm935.c
+++ b/iconvdata/ibm935.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect(ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM935 table for single byte.  */			      \
 	res = __ibm935sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm935db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm935sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm935db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm937.c b/iconvdata/ibm937.c
index 69b154d..3f69b43 100644
--- a/iconvdata/ibm937.c
+++ b/iconvdata/ibm937.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM937 table for single byte.  */			      \
 	res = __ibm937sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0')	      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm937db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -208,17 +208,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm937sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte. */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm937db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/ibm939.c b/iconvdata/ibm939.c
index 9936e2c..f2184fc 100644
--- a/iconvdata/ibm939.c
+++ b/iconvdata/ibm939.c
@@ -102,7 +102,7 @@ enum
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch, 0) == SO)					      \
+    if (__glibc_unlikely (ch == SO))					      \
       {									      \
 	/* Shift OUT, change to DBCS converter.  */			      \
 	if (curcs == db)						      \
@@ -114,7 +114,7 @@ enum
 	++inptr;							      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Shift IN, change to SBCS converter.  */			      \
 	if (curcs == sb)						      \
@@ -131,7 +131,7 @@ enum
       {									      \
 	/* Use the IBM939 table for single byte.  */			      \
 	res = __ibm939sb_to_ucs4[ch];					      \
-	if (__builtin_expect (res == L'\0', 0) && ch != '\0')		      \
+	if (__glibc_unlikely (res == L'\0') && ch != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -162,10 +162,10 @@ enum
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (rp2->start == 0xffff, 0)			      \
-	    || __builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (rp2->start == 0xffff)			      \
+	    || __glibc_unlikely (ch < rp2->start)			      \
 	    || (res = __ibm939db_to_ucs4[ch + rp2->idx],		      \
-		__builtin_expect (res, L'\1') == L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (res == L'\0') && ch != '\0'))		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -207,17 +207,17 @@ enum
       ++rp1;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (ch < rp1->start, 0)				      \
+    if (__glibc_unlikely (ch < rp1->start)				      \
 	|| (cp = __ucs4_to_ibm939sb[ch + rp1->idx],			      \
-	    __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0'))	      \
+	    __glibc_unlikely (cp[0] == L'\0') && ch != '\0'))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (cp = __ucs4_to_ibm939db[ch + rp2->idx],			      \
-		__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0'))	      \
+		__glibc_unlikely (cp[0] == L'\0') && ch != '\0'))	      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	  ibm939_invalid_char:						      \
diff --git a/iconvdata/ibm943.c b/iconvdata/ibm943.c
index c5d5742..fc12db7 100644
--- a/iconvdata/ibm943.c
+++ b/iconvdata/ibm943.c
@@ -50,20 +50,20 @@
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch == 0x80, 0)				      \
-	|| __builtin_expect (ch == 0xa0, 0)				      \
-	|| __builtin_expect (ch == 0xfd, 0)				      \
-	|| __builtin_expect (ch == 0xfe, 0)				      \
-	|| __builtin_expect (ch == 0xff, 0))				      \
+    if (__glibc_unlikely (ch == 0x80)					      \
+	|| __glibc_unlikely (ch == 0xa0)				      \
+	|| __glibc_unlikely (ch == 0xfd)				      \
+	|| __glibc_unlikely (ch == 0xfe)				      \
+	|| __glibc_unlikely (ch == 0xff))				      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
       }									      \
 									      \
     /* Use the IBM943 table for single byte.  */			      \
-    if (__builtin_expect (ch > 0xdf, 0)					      \
+    if (__glibc_unlikely (ch > 0xdf)					      \
 	|| (res = __ibm943sb_to_ucs4[ch],				      \
-	    __builtin_expect (res == 0, 0) && ch != 0))			      \
+	    __glibc_unlikely (res == 0) && ch != 0))			      \
       {									      \
 	/* Use the IBM943 table for double byte.  */			      \
 	if (__glibc_unlikely (inptr + 1 >= inend))			      \
@@ -80,9 +80,9 @@
 	while (ch > rp2->end)						      \
 	  ++rp2;							      \
 									      \
-	if (__builtin_expect (ch < rp2->start, 0)			      \
+	if (__glibc_unlikely (ch < rp2->start)				      \
 	    || (res = __ibm943db_to_ucs4[ch + rp2->idx],		      \
-	    __builtin_expect (res, '\1') == 0 && ch !=0))		      \
+	    __glibc_unlikely (res == 0) && ch !=0))			      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -147,10 +147,10 @@
 	++rp;								      \
 									      \
     /* Use the UCS4 table for single byte.  */				      \
-    if (__builtin_expect (rp == NULL, 0)				      \
-	|| __builtin_expect (ch < rp->start, 0)				      \
+    if (__glibc_unlikely (rp == NULL)					      \
+	|| __glibc_unlikely (ch < rp->start)				      \
 	|| (sc = __ucs4_to_ibm943sb[ch + rp->idx],			      \
-	__builtin_expect (sc, '\1') == '\0' && ch != L'\0'))		      \
+	__glibc_unlikely (sc == '\0') && ch != L'\0'))			      \
       {									      \
 									      \
 	/* Use the UCS4 table for double byte.  */			      \
diff --git a/iconvdata/iso-2022-cn.c b/iconvdata/iso-2022-cn.c
index 5434ef4..e65e90a 100644
--- a/iconvdata/iso-2022-cn.c
+++ b/iconvdata/iso-2022-cn.c
@@ -126,22 +126,22 @@ enum
       STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch == ESC))					      \
       {									      \
 	/* There are two kinds of escape sequences we have to handle:	      \
 	   - those announcing the use of GB and CNS characters on the	      \
 	     line; we can simply ignore them				      \
 	   - the initial byte of the SS2 sequence.			      \
 	*/								      \
-	if (__builtin_expect (inptr + 2 > inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 > inend)			      \
 	    || (inptr[1] == '$'						      \
-		&& (__builtin_expect (inptr + 3 > inend, 0)		      \
+		&& (__glibc_unlikely (inptr + 3 > inend)		      \
 		    || (inptr[2] == ')'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0))	      \
+			&& __glibc_unlikely (inptr + 4 > inend))	      \
 		    || (inptr[2] == '*'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0))))	      \
+			&& __glibc_unlikely (inptr + 4 > inend))))	      \
 	    || (inptr[1] == SS2_1					      \
-		&& __builtin_expect (inptr + 4 > inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 4 > inend)))		      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
@@ -159,7 +159,7 @@ enum
 	    continue;							      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SO)				      \
+    else if (__glibc_unlikely (ch == SO))				      \
       {									      \
 	/* Switch to use GB2312 or CNS 11643 plane 1, depending on which      \
 	   S0 designation came last.  The only problem is what to do with     \
@@ -170,7 +170,7 @@ enum
 	set = ann == CNS11643_1_ann ? CNS11643_1_set : GB2312_set;	      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Switch to use ASCII.  */					      \
 	++inptr;							      \
@@ -178,14 +178,14 @@ enum
 	continue;							      \
       }									      \
 									      \
-    if (__builtin_expect (ch, 0) == ESC && inptr[1] == SS2_1)		      \
+    if (__glibc_unlikely (ch == ESC) && inptr[1] == SS2_1)		      \
       {									      \
 	/* This is a character from CNS 11643 plane 2.			      \
 	   XXX We could test here whether the use of this character	      \
 	   set was announced.  */					      \
 	inptr += 2;							      \
 	ch = cns11643l2_to_ucs4 (&inptr, 2, 0);				      \
-	if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)		      \
+	if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	  {								      \
 	    inptr -= 2;							      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -207,12 +207,12 @@ enum
 	    ch = cns11643l1_to_ucs4 (&inptr, inend - inptr, 0);		      \
 	  }								      \
 									      \
-	if (__builtin_expect (ch, 1) == 0)				      \
+	if (__glibc_unlikely (ch == 0))					      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
 	  }								      \
-	else if (__builtin_expect (ch, 1) == __UNKNOWN_10646_CHAR)	      \
+	else if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
 	  {								      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 	  }								      \
@@ -297,7 +297,7 @@ enum
 		else							      \
 		  written = ucs4_to_gb2312 (ch, buf, 2);		      \
 									      \
-		if (__builtin_expect (written, 0) != __UNKNOWN_10646_CHAR)    \
+		if (__glibc_likely (written != __UNKNOWN_10646_CHAR))	      \
 		  /* Oh well, then switch SO.  */			      \
 		  used = GB2312_set + CNS11643_1_set - used;		      \
 		else							      \
diff --git a/iconvdata/iso-2022-jp-3.c b/iconvdata/iso-2022-jp-3.c
index 4b4ea01..b06330a 100644
--- a/iconvdata/iso-2022-jp-3.c
+++ b/iconvdata/iso-2022-jp-3.c
@@ -161,9 +161,9 @@ enum
 	   ends we terminate with an error since we must not risk missing     \
 	   an escape sequence just because it is not entirely in the	      \
 	   current input buffer.  */					      \
-	if (__builtin_expect (inptr + 2 >= inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 >= inend)			      \
 	    || (inptr[1] == '$' && inptr[2] == '('			      \
-		&& __builtin_expect (inptr + 3 >= inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 3 >= inend)))		      \
 	  {								      \
 	    /* Not enough input available.  */				      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
@@ -722,7 +722,7 @@ static const struct
 		      {							      \
 			if (set != JISX0201_Kana_set)			      \
 			  {						      \
-			    if (__builtin_expect (outptr + 3 > outend, 0))    \
+			    if (__glibc_unlikely (outptr + 3 > outend))	      \
 			      {						      \
 				result = __GCONV_FULL_OUTPUT;		      \
 				break;					      \
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 8381c30..e89bb4f 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -164,7 +164,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, from_iso2022jp) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data
 	= (struct iso2022jp_data *) malloc (sizeof (struct iso2022jp_data));
@@ -269,16 +269,16 @@ gconv_end (struct __gconv_step *data)
     uint32_t ch = *inptr;						      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch == ESC))					      \
       {									      \
 	/* We now must be prepared to read two to three more		      \
 	   characters.  If we have a match in the first character but	      \
 	   then the input buffer ends we terminate with an error since	      \
 	   we must not risk missing an escape sequence just because it	      \
 	   is not entirely in the current input buffer.  */		      \
-	if (__builtin_expect (inptr + 2 >= inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 >= inend)			      \
 	    || (var == iso2022jp2 && inptr[1] == '$' && inptr[2] == '('	      \
-		&& __builtin_expect (inptr + 3 >= inend, 0)))		      \
+		&& __glibc_unlikely (inptr + 3 >= inend)))		      \
 	  {								      \
 	    /* Not enough input available.  */				      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
@@ -379,7 +379,7 @@ gconv_end (struct __gconv_step *data)
 	    ch = inptr[2] | 0x80;					      \
 	    inptr += 3;							      \
 	  }								      \
-	else if (__builtin_expect (set2, ISO88597_set) == ISO88597_set)	      \
+	else if (__glibc_likely (set2 == ISO88597_set))			      \
 	  {								      \
 	    /* We use the table from the ISO 8859-7 module.  */		      \
 	    if (inptr[2] < 0x20 || inptr[2] >= 0x80)			      \
@@ -560,7 +560,7 @@ static const cvlist_t conversion_lists[4] =
        have to be known whether the last line ended using ASCII or	      \
        JIS X 0201.  */							      \
     else if (set == JISX0201_Roman_set					      \
-	     && (__builtin_expect (tag == TAG_none, 1)			      \
+	     && (__glibc_likely (tag == TAG_none)			      \
 		 || tag == TAG_language_ja))				      \
       {									      \
 	unsigned char buf[1];						      \
@@ -577,7 +577,7 @@ static const cvlist_t conversion_lists[4] =
 	  }								      \
       }									      \
     else if (set == JISX0201_Kana_set					      \
-	     && (__builtin_expect (tag == TAG_none, 1)			      \
+	     && (__glibc_likely (tag == TAG_none)			      \
 		 || tag == TAG_language_ja))				      \
       {									      \
 	unsigned char buf[1];						      \
@@ -596,19 +596,19 @@ static const cvlist_t conversion_lists[4] =
     else								      \
       {									      \
 	if ((set == JISX0208_1978_set || set == JISX0208_1983_set)	      \
-	    && (__builtin_expect (tag == TAG_none, 1)			      \
+	    && (__glibc_likely (tag == TAG_none)			      \
 		|| tag == TAG_language_ja))				      \
 	  written = ucs4_to_jisx0208 (ch, outptr, outend - outptr);	      \
 	else if (set == JISX0212_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_ja))			      \
 	  written = ucs4_to_jisx0212 (ch, outptr, outend - outptr);	      \
 	else if (set == GB2312_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_zh))			      \
 	  written = ucs4_to_gb2312 (ch, outptr, outend - outptr);	      \
 	else if (set == KSC5601_set					      \
-		 && (__builtin_expect (tag == TAG_none, 1)		      \
+		 && (__glibc_likely (tag == TAG_none)			      \
 		     || tag == TAG_language_ko))			      \
 	  written = ucs4_to_ksc5601 (ch, outptr, outend - outptr);	      \
 	else								      \
@@ -624,7 +624,7 @@ static const cvlist_t conversion_lists[4] =
       }									      \
 									      \
     if (written == __UNKNOWN_10646_CHAR					      \
-	&& __builtin_expect (tag == TAG_none, 1))			      \
+	&& __glibc_likely (tag == TAG_none))				      \
       {									      \
 	if (set2 == ISO88591_set)					      \
 	  {								      \
@@ -732,7 +732,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set2 != ISO88591_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -770,8 +770,7 @@ static const cvlist_t conversion_lists[4] =
 			    {						      \
 			      if (set2 != ISO88597_set)			      \
 				{					      \
-				  if (__builtin_expect (outptr + 3 > outend,  \
-							0))		      \
+				  if (__glibc_unlikely (outptr + 3 > outend))		      \
 				    {					      \
 				      res = __GCONV_FULL_OUTPUT;	      \
 				      break;				      \
@@ -782,7 +781,7 @@ static const cvlist_t conversion_lists[4] =
 				  set2 = ISO88597_set;			      \
 				}					      \
 									      \
-			      if (__builtin_expect (outptr + 3 > outend, 0))  \
+			      if (__glibc_unlikely (outptr + 3 > outend))     \
 				{					      \
 				  res = __GCONV_FULL_OUTPUT;		      \
 				  break;				      \
@@ -807,7 +806,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0201_Roman_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -834,7 +833,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0208_1983_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -866,7 +865,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0212_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 4 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 4 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -900,7 +899,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != GB2312_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -933,7 +932,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != KSC5601_set)				      \
 			{						      \
-			  if (__builtin_expect (outptr + 4 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 4 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
@@ -969,7 +968,7 @@ static const cvlist_t conversion_lists[4] =
 		    {							      \
 		      if (set != JISX0201_Kana_set)			      \
 			{						      \
-			  if (__builtin_expect (outptr + 3 > outend, 0))      \
+			  if (__glibc_unlikely (outptr + 3 > outend))	      \
 			    {						      \
 			      res = __GCONV_FULL_OUTPUT;		      \
 			      break;					      \
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index c1babc8..16a0abe 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -123,17 +123,17 @@ enum
       STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 									      \
     /* Recognize escape sequences.  */					      \
-    if (__builtin_expect (ch, 0) == ESC)				      \
+    if (__glibc_unlikely (ch == ESC))					      \
       {									      \
 	/* We don't really have to handle escape sequences since all the      \
 	   switching is done using the SI and SO bytes.  But we have to	      \
 	   recognize `Esc $ ) C' since this is a kind of flag for this	      \
 	   encoding.  We simply ignore it.  */				      \
-	if (__builtin_expect (inptr + 2 > inend, 0)			      \
+	if (__glibc_unlikely (inptr + 2 > inend)			      \
 	    || (inptr[1] == '$'						      \
-		&& (__builtin_expect (inptr + 3 > inend, 0)		      \
+		&& (__glibc_unlikely (inptr + 3 > inend)		      \
 		    || (inptr[2] == ')'					      \
-			&& __builtin_expect (inptr + 4 > inend, 0)))))	      \
+			&& __glibc_unlikely (inptr + 4 > inend)))))	      \
 	  {								      \
 	    result = __GCONV_INCOMPLETE_INPUT;				      \
 	    break;							      \
@@ -145,14 +145,14 @@ enum
 	    continue;							      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SO)				      \
+    else if (__glibc_unlikely (ch == SO))				      \
       {									      \
 	/* Switch to use KSC.  */					      \
 	++inptr;							      \
 	set = KSC5601_set;						      \
 	continue;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == SI)				      \
+    else if (__glibc_unlikely (ch == SI))				      \
       {									      \
 	/* Switch to use ASCII.  */					      \
 	++inptr;							      \
@@ -226,7 +226,7 @@ enum
 	asm ("" : "=m" (buf));						      \
 									      \
 	size_t written = ucs4_to_ksc5601 (ch, buf, 2);			      \
-	if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)	      \
+	if (__glibc_unlikely (written == __UNKNOWN_10646_CHAR))		      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index 5a0402e..b540e7f 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -146,7 +146,7 @@ gconv_init (struct __gconv_step *step)
       }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, from_iso646) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct iso646_data *) malloc (sizeof (struct iso646_data));
 
@@ -406,7 +406,7 @@ gconv_end (struct __gconv_step *data)
 									      \
     /* Hopefully gcc can recognize that the following `if' is only true	      \
        when we reach the default case in the `switch' statement.  */	      \
-    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+    if (__glibc_unlikely (failure == __GCONV_ILLEGAL_INPUT))		      \
       {									      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
       }									      \
@@ -880,7 +880,7 @@ gconv_end (struct __gconv_step *data)
 	break;								      \
       }									      \
 									      \
-    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+    if (__glibc_unlikely (failure == __GCONV_ILLEGAL_INPUT))		      \
       {									      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
       }									      \
diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c
index 8aba77d..7c708c7 100644
--- a/iconvdata/iso_6937-2.c
+++ b/iconvdata/iso_6937-2.c
@@ -392,7 +392,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -408,8 +408,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -429,7 +429,7 @@ static const char from_ucs4[][2] =
       {									      \
 	ch = to_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+	if (__glibc_unlikely (ch == 0) && *inptr != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -462,8 +462,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))						      \
       {									      \
 	switch (ch)							      \
 	  {								      \
@@ -525,7 +524,7 @@ static const char from_ucs4[][2] =
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (from_ucs4[ch][0] == '\0', 0) && ch != 0)	      \
+    else if (__glibc_unlikely (from_ucs4[ch][0] == '\0') && ch != 0)	      \
       {									      \
 	/* Illegal characters.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c
index f7bbcf0..3331998 100644
--- a/iconvdata/iso_6937.c
+++ b/iconvdata/iso_6937.c
@@ -392,7 +392,7 @@ static const char from_ucs4[][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -408,8 +408,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -429,7 +429,7 @@ static const char from_ucs4[][2] =
       {									      \
 	ch = to_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+	if (__glibc_unlikely (ch == 0) && *inptr != '\0')		      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -462,8 +462,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))						      \
       {									      \
 	int fail = 0;							      \
 	switch (ch)							      \
@@ -527,7 +526,7 @@ static const char from_ucs4[][2] =
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
 	  }								      \
       }									      \
-    else if (__builtin_expect (from_ucs4[ch][0] == '\0', 0) && ch != 0)	      \
+    else if (__glibc_unlikely (from_ucs4[ch][0] == '\0') && ch != 0)	      \
       {									      \
 	/* Illegal characters.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 5b5f042..cdce1c4 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -178,10 +178,10 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
        0xd831-0xd87e and 0xd891-0xd8fe are user-defined area */		      \
     else								      \
       {									      \
-	if (__builtin_expect (ch > 0xf9, 0)				      \
-	    || __builtin_expect (ch == 0xdf, 0)				      \
-	    || (__builtin_expect (ch > 0x7e, 0) && ch < 0x84)		      \
-	    || (__builtin_expect (ch > 0xd3, 0) && ch < 0xd9))		      \
+	if (__glibc_unlikely (ch > 0xf9)				      \
+	    || __glibc_unlikely (ch == 0xdf)				      \
+	    || (__glibc_unlikely (ch > 0x7e) && ch < 0x84)		      \
+	    || (__glibc_unlikely (ch > 0xd3) && ch < 0xd9))		      \
 	  {								      \
 	    /* These are illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -212,9 +212,9 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 		m = mid[(idx & 0x03e0) >> 5];				      \
 		f = final[idx & 0x001f];				      \
 									      \
-		if (__builtin_expect (i == -1, 0)			      \
-		    || __builtin_expect (m == -1, 0)			      \
-		    || __builtin_expect (f == -1, 0))			      \
+		if (__glibc_unlikely (i == -1)				      \
+		    || __glibc_unlikely (m == -1)			      \
+		    || __glibc_unlikely (f == -1))			      \
 		  {							      \
 		    /* This is illegal.  */				      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -225,8 +225,8 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 		  ch = init_to_ucs[i - 1];				      \
 		else if (i == 0 && m > 0 && f == 0)			      \
 		  ch = 0x314e + m;	/* 0x314f + m - 1 */		      \
-		else if (__builtin_expect ((i | m) == 0, 1)		      \
-			 && __builtin_expect (f > 0, 1))		      \
+		else if (__glibc_likely ((i | m) == 0)			      \
+			 && __glibc_likely (f > 0))			      \
 		  ch = final_to_ucs[f - 1];	/* round trip?? */	      \
 		else							      \
 		  {							      \
@@ -236,13 +236,13 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	      }								      \
 	    else							      \
 	      {								      \
-		if (__builtin_expect (ch2 < 0x31, 0)			      \
-		    || (__builtin_expect (ch2 > 0x7e, 0) && ch2 < 0x91)	      \
-		    || __builtin_expect (ch2, 0) == 0xff		      \
-		    || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe8)	      \
-		    || (__builtin_expect (ch, 0) == 0xda		      \
+		if (__glibc_unlikely (ch2 < 0x31)			      \
+		    || (__glibc_unlikely (ch2 > 0x7e) && ch2 < 0x91)	      \
+		    || __glibc_unlikely (ch2 == 0xff)			      \
+		    || (__glibc_unlikely (ch == 0xd9) && ch2 > 0xe8)	      \
+		    || (__glibc_unlikely (ch == 0xda)			      \
 			&& ch2 > 0xa0 && ch2 < 0xd4)			      \
-		    || (__builtin_expect (ch, 0) == 0xde && ch2 > 0xf1))      \
+		    || (__glibc_unlikely (ch == 0xde) && ch2 > 0xf1))	      \
 		  {							      \
 		    /* This is illegal.  */				      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -351,7 +351,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	    uint32_t temp;						      \
 									      \
 	    written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr);    \
-	    if (__builtin_expect (written, 1) == 0)			      \
+	    if (__glibc_unlikely (written == 0))			      \
 	      {								      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
@@ -380,12 +380,12 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
 	    uint32_t temp;						      \
 									      \
 	    written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);      \
-	    if (__builtin_expect (written, 1) == 0)			      \
+	    if (__glibc_unlikely (written == 0))			      \
 	      {								      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
 	      }								      \
-	    if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0)	      \
+	    if (__glibc_unlikely (written == __UNKNOWN_10646_CHAR)	      \
 		|| (outptr[0] == 0x22 && outptr[1] > 0x68))		      \
 	      {								      \
 		UNICODE_TAG_HANDLER (ch, 4);				      \
diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c
index 2590b33..48fce89 100644
--- a/iconvdata/sjis.c
+++ b/iconvdata/sjis.c
@@ -4331,12 +4331,12 @@ static const char from_ucs4_extra[0x100][2] =
   {									      \
     uint32_t ch = *inptr;						      \
 									      \
-    if (__builtin_expect (ch, 0) == 0x5c)				      \
+    if (__glibc_unlikely (ch == 0x5c))					      \
       {									      \
 	ch = 0xa5;							      \
 	++inptr;							      \
       }									      \
-    else if (__builtin_expect (ch, 0) == 0x7e)				      \
+    else if (__glibc_unlikely (ch == 0x7e))				      \
       {									      \
 	ch = 0x203e;							      \
 	++inptr;							      \
@@ -4348,9 +4348,9 @@ static const char from_ucs4_extra[0x100][2] =
 	ch += 0xfec0;							      \
 	++inptr;							      \
       }									      \
-    else if (__builtin_expect (ch > 0xea, 0)				      \
-	     || __builtin_expect (ch, 0) == 0xa0			      \
-	     || __builtin_expect (ch <= 0x80, 0))			      \
+    else if (__glibc_unlikely (ch > 0xea)				      \
+	     || __glibc_unlikely (ch == 0xa0)				      \
+	     || __glibc_unlikely (ch <= 0x80))				      \
       {									      \
 	/* These are illegal.  */					      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -4377,10 +4377,10 @@ static const char from_ucs4_extra[0x100][2] =
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
 	  }								      \
-	else if ((__builtin_expect (idx > 0x84be && idx < 0x889f, 0))	      \
-		 || (__builtin_expect (idx > 0x88fc && idx < 0x8940, 0))      \
-		 || (__builtin_expect (idx > 0x9ffc && idx < 0xe040, 0))      \
-		 || __builtin_expect (idx > 0xeaa4, 0))			      \
+	else if ((__glibc_unlikely (idx > 0x84be && idx < 0x889f))	      \
+		 || (__glibc_unlikely (idx > 0x88fc && idx < 0x8940))	      \
+		 || (__glibc_unlikely (idx > 0x9ffc && idx < 0xe040))	      \
+		 || __glibc_unlikely (idx > 0xeaa4))			      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
@@ -4446,8 +4446,8 @@ static const char from_ucs4_extra[0x100][2] =
 	  cp = from_ucs4_greek[ch - 0x391];				      \
 	else if (ch >= 0x2010 && ch <= 0x9fa0)				      \
 	  cp = from_ucs4_cjk[ch - 0x02010];				      \
-	else if (__builtin_expect (ch >= 0xff01, 1)			      \
-		 && __builtin_expect (ch <= 0xffef, 1))			      \
+	else if (__glibc_likely (ch >= 0xff01)				      \
+		 && __glibc_likely (ch <= 0xffef))			      \
 	  cp = from_ucs4_extra[ch - 0xff00];				      \
 	else								      \
 	  {								      \
@@ -4459,7 +4459,7 @@ static const char from_ucs4_extra[0x100][2] =
     else								      \
       cp = from_ucs4_lat1[ch];						      \
 									      \
-    if (__builtin_expect (cp[0] == '\0', 0) && ch != 0)			      \
+    if (__glibc_unlikely (cp[0] == '\0') && ch != 0)			      \
       {									      \
 	/* Illegal character.  */					      \
 	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c
index e082b50..2d83df6 100644
--- a/iconvdata/t.61.c
+++ b/iconvdata/t.61.c
@@ -385,7 +385,7 @@ static const char from_ucs4[][2] =
     uint32_t ch = *inptr;						      \
     int increment = 1;							      \
 									      \
-    if (__builtin_expect (ch >= 0xc1, 0) && ch <= 0xcf)			      \
+    if (__glibc_unlikely (ch >= 0xc1) && ch <= 0xcf)			      \
       {									      \
 	/* Composed character.  First test whether the next byte	      \
 	   is also available.  */					      \
@@ -400,8 +400,8 @@ static const char from_ucs4[][2] =
 									      \
 	ch2 = inptr[1];							      \
 									      \
-	if (__builtin_expect (ch2 < 0x20, 0)				      \
-	    || __builtin_expect (ch2 >= 0x80, 0))			      \
+	if (__glibc_unlikely (ch2 < 0x20)				      \
+	    || __glibc_unlikely (ch2 >= 0x80))				      \
 	  {								      \
 	    /* This is illegal.  */					      \
 	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -414,7 +414,7 @@ static const char from_ucs4[][2] =
     else								      \
       ch = to_ucs4[ch];							      \
 									      \
-    if (__builtin_expect (ch == 0, 0) && *inptr != '\0')		      \
+    if (__glibc_unlikely (ch == 0) && *inptr != '\0')			      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (increment);			      \
@@ -448,16 +448,15 @@ static const char from_ucs4[][2] =
     uint32_t ch = get32 (inptr);					      \
     const char *cp;							      \
 									      \
-    if (__builtin_expect (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0]),   \
-			  0))						      \
+    if (__glibc_unlikely (ch >= sizeof (from_ucs4) / sizeof (from_ucs4[0])))						      \
       {									      \
-	if (__builtin_expect (ch, 0) == 0x2126)				      \
+	if (__glibc_unlikely (ch == 0x2126))				      \
 	  cp = "\xe0";							      \
-	else if (__builtin_expect (ch, 0) == 0x2c7)			      \
+	else if (__glibc_unlikely (ch == 0x2c7))			      \
 	  cp = "\xcf\x20";						      \
-	else if (__builtin_expect (ch < 0x2d8, 0)			      \
-		 || __builtin_expect (ch > 0x2dd, 0)			      \
-		 || __builtin_expect (ch == 0x2dc, 0))			      \
+	else if (__glibc_unlikely (ch < 0x2d8)				      \
+		 || __glibc_unlikely (ch > 0x2dd)			      \
+		 || __glibc_unlikely (ch == 0x2dc))			      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 									      \
@@ -477,7 +476,7 @@ static const char from_ucs4[][2] =
       {									      \
 	cp = from_ucs4[ch];						      \
 									      \
-	if (__builtin_expect (cp[0] == '\0', 0) && ch != 0)		      \
+	if (__glibc_unlikely (cp[0] == '\0') && ch != 0)		      \
 	  {								      \
 	    /* Illegal.  */						      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/tcvn5712-1.c b/iconvdata/tcvn5712-1.c
index 5edc653..9add2e1 100644
--- a/iconvdata/tcvn5712-1.c
+++ b/iconvdata/tcvn5712-1.c
@@ -460,7 +460,7 @@ static const struct
 									      \
 	/* If we don't have enough room to output ch as well, then deal	      \
 	   with it in another round.  */				      \
-	if (!must_buffer_ch && __builtin_expect (outptr + 4 > outend, 0))     \
+	if (!must_buffer_ch && __glibc_unlikely (outptr + 4 > outend))	      \
 	  continue;							      \
       }									      \
 									      \
diff --git a/iconvdata/tscii.c b/iconvdata/tscii.c
index 644cb96..2bd566c 100644
--- a/iconvdata/tscii.c
+++ b/iconvdata/tscii.c
@@ -347,7 +347,7 @@ static const uint32_t tscii_next_state[6] =
 	    /* Retrieve the successor state.  */			      \
 	    *statep = tscii_next_state[(*statep >> 4) & 0x0f];		      \
 	  }								      \
-	while (*statep != 0 && __builtin_expect (outptr + 4 <= outend, 1));   \
+	while (*statep != 0 && __glibc_likely (outptr + 4 <= outend));	      \
 									      \
 	if (*statep != 0)						      \
 	  {								      \
diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c
index 629f2d6..3494e1f 100644
--- a/iconvdata/uhc.c
+++ b/iconvdata/uhc.c
@@ -3064,9 +3064,9 @@ static const char uhc_hangul_from_ucs[11172][2] =
 */									      \
     if (ch <= 0x7f)							      \
       ++inptr;								      \
-    else if (__builtin_expect (ch <= 0x80, 0)				      \
-	     || __builtin_expect (ch >= 0xfe, 0)			      \
-	     || __builtin_expect (ch == 0xc9, 0))			      \
+    else if (__glibc_unlikely (ch <= 0x80)				      \
+	     || __glibc_unlikely (ch >= 0xfe)				      \
+	     || __glibc_unlikely (ch == 0xc9))				      \
       {									      \
 	/* This is illegal.  */						      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
@@ -3107,12 +3107,12 @@ static const char uhc_hangul_from_ucs[11172][2] =
 									      \
 	if (ch < 0xa1 || ch2 < 0xa1)					      \
 	  {								      \
-	    if (__builtin_expect (ch > 0xc6, 0)				      \
-		|| __builtin_expect (ch2 < 0x41, 0)			      \
-		|| __builtin_expect (ch2 > 0xfe, 0)			      \
-		|| (__builtin_expect (ch2 > 0x5a, 0) && ch2 < 0x61)	      \
-		|| (__builtin_expect (ch2 > 0x7a, 0) && ch2 < 0x81)	      \
-		|| (__builtin_expect (ch == 0xc6, 0) && ch2 > 0x52))	      \
+	    if (__glibc_unlikely (ch > 0xc6)				      \
+		|| __glibc_unlikely (ch2 < 0x41)			      \
+		|| __glibc_unlikely (ch2 > 0xfe)			      \
+		|| (__glibc_unlikely (ch2 > 0x5a) && ch2 < 0x61)	      \
+		|| (__glibc_unlikely (ch2 > 0x7a) && ch2 < 0x81)	      \
+		|| (__glibc_unlikely (ch == 0xc6) && ch2 > 0x52))	      \
 	      {								      \
 		/* This is not legal.  */				      \
 		STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
@@ -3135,8 +3135,8 @@ static const char uhc_hangul_from_ucs[11172][2] =
 	else								      \
 	  {								      \
 	    ch = ksc5601_to_ucs4 (&inptr, 2, 0x80);			      \
-	    if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)	      \
-		|| __builtin_expect (ch == 0x327e, 0))			      \
+	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR)		      \
+		|| __glibc_unlikely (ch == 0x327e))			      \
 	      {								      \
 		/* Illegal.  */						      \
 		STANDARD_FROM_LOOP_ERR_HANDLER (2);			      \
@@ -3208,8 +3208,8 @@ static const char uhc_hangul_from_ucs[11172][2] =
       {									      \
 	size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);   \
 									      \
-	if (__builtin_expect (ch == 0x327e, 0)				      \
-	    || __builtin_expect (written == __UNKNOWN_10646_CHAR, 0))	      \
+	if (__glibc_unlikely (ch == 0x327e)				      \
+	    || __glibc_unlikely (written == __UNKNOWN_10646_CHAR))	      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \
 	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c
index 31c2d6e..c4b2c48 100644
--- a/iconvdata/utf-16.c
+++ b/iconvdata/utf-16.c
@@ -148,7 +148,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, to_utf16) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct utf16_data *) malloc (sizeof (struct utf16_data));
 
@@ -285,7 +285,7 @@ gconv_end (struct __gconv_step *data)
       {									      \
 	u1 = bswap_16 (u1);						      \
 									      \
-	if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff)		      \
+	if (__glibc_likely (u1 < 0xd800) || u1 > 0xdfff)		      \
 	  {								      \
 	    /* No surrogate.  */					      \
 	    put32 (outptr, u1);						      \
@@ -307,8 +307,8 @@ gconv_end (struct __gconv_step *data)
 									      \
 	    inptr += 2;							      \
 	    u2 = bswap_16 (get16 (inptr));				      \
-	    if (__builtin_expect (u2 < 0xdc00, 0)			      \
-		|| __builtin_expect (u2 > 0xdfff, 0))			      \
+	    if (__glibc_unlikely (u2 < 0xdc00)				      \
+		|| __glibc_unlikely (u2 > 0xdfff))			      \
 	      {								      \
 		/* This is no valid second word for a surrogate.  */	      \
 		inptr -= 2;						      \
@@ -321,7 +321,7 @@ gconv_end (struct __gconv_step *data)
       }									      \
     else								      \
       {									      \
-	if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff)		      \
+	if (__glibc_likely (u1 < 0xd800) || u1 > 0xdfff)		      \
 	  {								      \
 	    /* No surrogate.  */					      \
 	    put32 (outptr, u1);						      \
@@ -341,8 +341,8 @@ gconv_end (struct __gconv_step *data)
 									      \
 	    inptr += 2;							      \
 	    uint16_t u2 = get16 (inptr);				      \
-	    if (__builtin_expect (u2 < 0xdc00, 0)			      \
-		|| __builtin_expect (u2 > 0xdfff, 0))			      \
+	    if (__glibc_unlikely (u2 < 0xdc00)				      \
+		|| __glibc_unlikely (u2 > 0xdfff))			      \
 	      {								      \
 		/* This is no valid second word for a surrogate.  */	      \
 		inptr -= 2;						      \
diff --git a/iconvdata/utf-32.c b/iconvdata/utf-32.c
index e3e4243..fe779f9 100644
--- a/iconvdata/utf-32.c
+++ b/iconvdata/utf-32.c
@@ -72,7 +72,7 @@
       put32u (outbuf, BOM);						      \
       outbuf += 4;							      \
     }									      \
-  else if (__builtin_expect (data->__invocation_counter == 0, 0)	      \
+  else if (__glibc_unlikely (data->__invocation_counter == 0)		      \
 	   && ((var == UTF_32LE && BYTE_ORDER == BIG_ENDIAN)		      \
 	       || (var == UTF_32BE && BYTE_ORDER == LITTLE_ENDIAN)))	      \
     data->__flags |= __GCONV_SWAP;					      \
@@ -145,7 +145,7 @@ gconv_init (struct __gconv_step *step)
     }
 
   result = __GCONV_NOCONV;
-  if (__builtin_expect (dir, to_utf32) != illegal_dir)
+  if (__glibc_likely (dir != illegal_dir))
     {
       new_data = (struct utf32_data *) malloc (sizeof (struct utf32_data));
 
diff --git a/iconvdata/utf-7.c b/iconvdata/utf-7.c
index 637d85c..4ca91e5 100644
--- a/iconvdata/utf-7.c
+++ b/iconvdata/utf-7.c
@@ -218,8 +218,8 @@ base64 (unsigned int i)
 									      \
 	    /* If accumulated data is nonzero, the input is invalid.  */      \
 	    /* Also, partial UTF-16 characters are invalid.  */		      \
-	    if (__builtin_expect (statep->__value.__wch != 0, 0)	      \
-		|| __builtin_expect ((statep->__count >> 3) <= 26, 0))	      \
+	    if (__glibc_unlikely (statep->__value.__wch != 0)		      \
+		|| __glibc_unlikely ((statep->__count >> 3) <= 26))	      \
 	      {								      \
 		STANDARD_FROM_LOOP_ERR_HANDLER ((statep->__count = 0, 1));    \
 	      }								      \
@@ -261,7 +261,7 @@ base64 (unsigned int i)
 		   indeed form a Low Surrogate.  */			      \
 		uint32_t wc2 = wch & 0xffff;				      \
 									      \
-		if (! __builtin_expect (wc2 >= 0xdc00 && wc2 < 0xe000, 1))    \
+		if (! __glibc_likely (wc2 >= 0xdc00 && wc2 < 0xe000))	      \
 		  {							      \
 		    STANDARD_FROM_LOOP_ERR_HANDLER ((statep->__count = 0, 1));\
 		  }							      \
-- 
1.9.3


[-- Attachment #4: 0003-Manual-cleanups-after-__builtin_expect-conversion-of.patch --]
[-- Type: text/x-patch, Size: 2418 bytes --]

From 25282e6d2d0bb5d9314ec02845747aa9c86c5606 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Tue, 9 Sep 2014 20:37:28 +0200
Subject: [PATCH 3/3] Manual cleanups after __builtin_expect conversion of
 iconv/ and iconvdata/

This commit removes the one remaining __builtin_expect expressions which
can be converted, and fixes long lines introduces by the automated
rewriting.

2014-09-09  Florian Weimer  <fweimer@redhat.com>
 
	* iconv/gconv_dl.c (__gconv_find_shlib): Wrap long line resulting
	from the automated __builtin_expect conversion.
	* iconvdata/euc-kr.c (euckr_from_ucs4): Likewise.
	* iconv/gconv_cache.c (__gconv_load_cache): Replace multi-line
	__builtin_expect with __glibc_unlikely.

diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index cb48eca..dab5ac6 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -116,9 +116,9 @@ __gconv_load_cache (void)
       || __glibc_unlikely (header->string_offset >= cache_size)
       || __glibc_unlikely (header->hash_offset >= cache_size)
       || __glibc_unlikely (header->hash_size == 0)
-      || __builtin_expect ((header->hash_offset
+      || __glibc_unlikely ((header->hash_offset
 			    + header->hash_size * sizeof (struct hash_entry))
-			   > cache_size, 0)
+			   > cache_size)
       || __glibc_unlikely (header->module_offset >= cache_size)
       || __glibc_unlikely (header->otherconv_offset > cache_size))
     {
diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
index 840793d..05448b3 100644
--- a/iconv/gconv_dl.c
+++ b/iconv/gconv_dl.c
@@ -93,7 +93,8 @@ __gconv_find_shlib (const char *name)
 	  found->counter = -TRIES_BEFORE_UNLOAD - 1;
 	  found->handle = NULL;
 
-	  if (__glibc_unlikely (__tsearch (found, &loaded, known_compare) == NULL))
+	  if (__glibc_unlikely (__tsearch (found, &loaded, known_compare)
+				== NULL))
 	    {
 	      /* Something went wrong while inserting the entry.  */
 	      free (found);
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index 50d1a8c..2f10453 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -38,7 +38,8 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
 	  cp[0] = '\xa3';
 	  cp[1] = '\xdc';
 	}
-      else if (__glibc_likely (ucs4_to_ksc5601 (ch, cp, 2) != __UNKNOWN_10646_CHAR))
+      else if (__glibc_likely (ucs4_to_ksc5601 (ch, cp, 2)
+			       != __UNKNOWN_10646_CHAR))
 	{
 	  cp[0] |= 0x80;
 	  cp[1] |= 0x80;
-- 
1.9.3


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c
  2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
                   ` (4 preceding siblings ...)
  2014-09-09 19:08 ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c (was: Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c) Florian Weimer
@ 2014-09-09 21:49 ` Roland McGrath
  5 siblings, 0 replies; 17+ messages in thread
From: Roland McGrath @ 2014-09-09 21:49 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

For this kind of thing it's OK to just mention the file and say:
	* foo.c: Replace __builtin_expect with __glibc_{un,}likely
	throughout.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-09 19:08 ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c (was: Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c) Florian Weimer
@ 2014-09-09 23:51   ` Kalle Olavi Niemitalo
  2014-09-10  7:46     ` Florian Weimer
  0 siblings, 1 reply; 17+ messages in thread
From: Kalle Olavi Niemitalo @ 2014-09-09 23:51 UTC (permalink / raw)
  To: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:

> --- a/iconv/gconv_simple.c
> +++ b/iconv/gconv_simple.c
> @@ -387,8 +387,7 @@ ucs4_internal_loop_single (struct __gconv_step *step,
>        return __GCONV_INCOMPLETE_INPUT;
>      }
>  
> -  if (__builtin_expect (((unsigned char *) state->__value.__wchb)[0] > 0x80,
> -			0))
> +  if (__glibc_unlikely (((unsigned char *) state->__value.__wchb)[0] > 0x80))

I think that is a bug in the original code.  Should compare > 0x7f.
Likewise in internal_ucs4_loop_unaligned.
Contrast to ucs4_internal_loop, which compares inval > 0x7fffffff.

> -  if (__builtin_expect (flags & GCONV_AVOID_NOCONV, 0)
> +  if (__glibc_unlikely (flags & GCONV_AVOID_NOCONV)

This looks a bit suspicious because it is not obvious that the
flags & GCONV_AVOID_NOCONV expression always evaluates to 0 or 1.
I'm not sure __glibc_unlikely ((flags & GCONV_AVOID_NOCONV) != 0)
would be any nicer, though.

My concern was that the code is not very different from
__builtin_expect (x & 2, 1), from which an excessively clever
compiler could figure out that the expectation cannot ever hold.
Anyway, the code is different enough to avoid any such problem.

> -	    /*if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)*/	      \
> +	    /*if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))*/	      \
>  	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \

I don't think that comment has any value left.

I didn't finish reading the patch yet.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-09 23:51   ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c Kalle Olavi Niemitalo
@ 2014-09-10  7:46     ` Florian Weimer
  2014-09-10 17:48       ` Kalle Olavi Niemitalo
  0 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2014-09-10  7:46 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo, libc-alpha

On 09/10/2014 01:55 AM, Kalle Olavi Niemitalo wrote:
> Florian Weimer <fweimer@redhat.com> writes:
>
>> --- a/iconv/gconv_simple.c
>> +++ b/iconv/gconv_simple.c
>> @@ -387,8 +387,7 @@ ucs4_internal_loop_single (struct __gconv_step *step,
>>         return __GCONV_INCOMPLETE_INPUT;
>>       }
>>
>> -  if (__builtin_expect (((unsigned char *) state->__value.__wchb)[0] > 0x80,
>> -			0))
>> +  if (__glibc_unlikely (((unsigned char *) state->__value.__wchb)[0] > 0x80))
>
> I think that is a bug in the original code.  Should compare > 0x7f.
> Likewise in internal_ucs4_loop_unaligned.
> Contrast to ucs4_internal_loop, which compares inval > 0x7fffffff.

This might be the case.  But it seems this code is effectively 
dead—iconv only converts complete multi-byte sequences, and the mbr* 
need a matching locale, and we haven't got a UCS-4 locale (multi-byte 
character sets which regularly use NUL bytes do not work with C).

Please file a bug if you think this still needs fixing, especially if 
you can write a test case which shows the issue.

>> -  if (__builtin_expect (flags & GCONV_AVOID_NOCONV, 0)
>> +  if (__glibc_unlikely (flags & GCONV_AVOID_NOCONV)
>
> This looks a bit suspicious because it is not obvious that the
> flags & GCONV_AVOID_NOCONV expression always evaluates to 0 or 1.
> I'm not sure __glibc_unlikely ((flags & GCONV_AVOID_NOCONV) != 0)
> would be any nicer, though.

Has glibc a rule not to rely on implicit booleans?  Than the != 0 
variant would be preferred.

>> -	    /*if (__builtin_expect (ch, 0) == __UNKNOWN_10646_CHAR)*/	      \
>> +	    /*if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))*/	      \
>>   	    if (__glibc_unlikely (ch == __UNKNOWN_10646_CHAR))		      \
>
> I don't think that comment has any value left.

Okay, I'll remove it.

> I didn't finish reading the patch yet.

Thanks so far!

-- 
Florian Weimer / Red Hat Product Security

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-10  7:46     ` Florian Weimer
@ 2014-09-10 17:48       ` Kalle Olavi Niemitalo
  2014-09-10 18:07         ` Roland McGrath
  0 siblings, 1 reply; 17+ messages in thread
From: Kalle Olavi Niemitalo @ 2014-09-10 17:48 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:

> Has glibc a rule not to rely on implicit booleans?  Than the != 0
> variant would be preferred.

I'm not sure.  Roland McGrath has objected to implicit Boolean coercion
before; see <https://sourceware.org/ml/libc-alpha/2012-09/msg00218.html>
and <https://sourceware.org/ml/libc-alpha/2014-06/msg00119.html>.
If there is a consensus, then I guess someone should edit
<https://sourceware.org/glibc/wiki/Style_and_Conventions>, in which
some examples of good patterns nowadays do "if (buf)" or similar.
The GNU Coding Standards don't discuss the issue, AFAICS.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-10 17:48       ` Kalle Olavi Niemitalo
@ 2014-09-10 18:07         ` Roland McGrath
  2014-09-12  1:46           ` Carlos O'Donell
  0 siblings, 1 reply; 17+ messages in thread
From: Roland McGrath @ 2014-09-10 18:07 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo; +Cc: Florian Weimer, libc-alpha

The preferred style in glibc has always been to eschew implicit Boolean
coercions, except for the return value of strcmp/memcmp and the like (where
the most common idiomatic uses treat the value as a Boolean even though
nonzero values have further meaning).

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-10 18:07         ` Roland McGrath
@ 2014-09-12  1:46           ` Carlos O'Donell
  2014-09-12 17:52             ` Roland McGrath
  0 siblings, 1 reply; 17+ messages in thread
From: Carlos O'Donell @ 2014-09-12  1:46 UTC (permalink / raw)
  To: Roland McGrath, Kalle Olavi Niemitalo; +Cc: Florian Weimer, libc-alpha

On 09/10/2014 02:07 PM, Roland McGrath wrote:
> The preferred style in glibc has always been to eschew implicit Boolean
> coercions, except for the return value of strcmp/memcmp and the like (where
> the most common idiomatic uses treat the value as a Boolean even though
> nonzero values have further meaning).
> 

Wikified.

https://sourceware.org/glibc/wiki/Style_and_Conventions#Boolean_Coercions

c.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-12  1:46           ` Carlos O'Donell
@ 2014-09-12 17:52             ` Roland McGrath
  2014-09-12 18:18               ` Carlos O'Donell
  2014-09-23 11:25               ` Florian Weimer
  0 siblings, 2 replies; 17+ messages in thread
From: Roland McGrath @ 2014-09-12 17:52 UTC (permalink / raw)
  To: Carlos O'Donell; +Cc: Kalle Olavi Niemitalo, Florian Weimer, libc-alpha

> On 09/10/2014 02:07 PM, Roland McGrath wrote:
> > The preferred style in glibc has always been to eschew implicit Boolean
> > coercions, except for the return value of strcmp/memcmp and the like (where
> > the most common idiomatic uses treat the value as a Boolean even though
> > nonzero values have further meaning).
> > 
> 
> Wikified.
> 
> https://sourceware.org/glibc/wiki/Style_and_Conventions#Boolean_Coercions

I forgot to mention the other exception: if (foo & BIT) or if (!(foo & BIT))
is fine, no need for if ((foo & BIT) != 0) or if ((foo & BIT) == 0).

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-12 17:52             ` Roland McGrath
@ 2014-09-12 18:18               ` Carlos O'Donell
  2014-09-23 11:25               ` Florian Weimer
  1 sibling, 0 replies; 17+ messages in thread
From: Carlos O'Donell @ 2014-09-12 18:18 UTC (permalink / raw)
  To: Roland McGrath; +Cc: Kalle Olavi Niemitalo, Florian Weimer, libc-alpha

On 09/12/2014 01:52 PM, Roland McGrath wrote:
>> On 09/10/2014 02:07 PM, Roland McGrath wrote:
>>> The preferred style in glibc has always been to eschew implicit Boolean
>>> coercions, except for the return value of strcmp/memcmp and the like (where
>>> the most common idiomatic uses treat the value as a Boolean even though
>>> nonzero values have further meaning).
>>>
>>
>> Wikified.
>>
>> https://sourceware.org/glibc/wiki/Style_and_Conventions#Boolean_Coercions
> 
> I forgot to mention the other exception: if (foo & BIT) or if (!(foo & BIT))
> is fine, no need for if ((foo & BIT) != 0) or if ((foo & BIT) == 0).

Wikified++

c.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c
  2014-09-12 17:52             ` Roland McGrath
  2014-09-12 18:18               ` Carlos O'Donell
@ 2014-09-23 11:25               ` Florian Weimer
  1 sibling, 0 replies; 17+ messages in thread
From: Florian Weimer @ 2014-09-23 11:25 UTC (permalink / raw)
  To: Roland McGrath, Carlos O'Donell; +Cc: Kalle Olavi Niemitalo, libc-alpha

On 09/12/2014 07:52 PM, Roland McGrath wrote:
> I forgot to mention the other exception: if (foo & BIT) or if (!(foo & BIT))
> is fine, no need for if ((foo & BIT) != 0) or if ((foo & BIT) == 0).

Thanks, so there shouldn't be a need to change the patch.

-- 
Florian Weimer / Red Hat Product Security

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-09-23 11:25 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-08 19:42 [PATCH] __builtin_expect cleanup for iconvdata/*.c Florian Weimer
2014-09-08 19:48 ` Andreas Schwab
2014-09-08 20:07 ` Kalle Olavi Niemitalo
2014-09-08 20:43   ` Florian Weimer
2014-09-08 21:00 ` Kalle Olavi Niemitalo
2014-09-08 23:14   ` Florian Weimer
2014-09-09  2:25 ` Siddhesh Poyarekar
2014-09-09 19:08 ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c (was: Re: [PATCH] __builtin_expect cleanup for iconvdata/*.c) Florian Weimer
2014-09-09 23:51   ` [PATCH v2] __builtin_expect cleanup for iconv{,data}/*.c Kalle Olavi Niemitalo
2014-09-10  7:46     ` Florian Weimer
2014-09-10 17:48       ` Kalle Olavi Niemitalo
2014-09-10 18:07         ` Roland McGrath
2014-09-12  1:46           ` Carlos O'Donell
2014-09-12 17:52             ` Roland McGrath
2014-09-12 18:18               ` Carlos O'Donell
2014-09-23 11:25               ` Florian Weimer
2014-09-09 21:49 ` [PATCH] __builtin_expect cleanup for iconvdata/*.c Roland McGrath

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