http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55142
--- Comment #19 from H.J. Lu <hjl.tools at gmail dot com> 2012-11-03 02:51:26 UTC --- This patch: [hjl@gnu-tools-1 tmp]$ cat /tmp/x diff --git a/gcc/expr.c b/gcc/expr.c index 3e8e004..da35488 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8115,7 +8115,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) - || mode != ptr_mode) + || mode != Pmode) { expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL); [hjl@gnu-tools-1 tmp]$ removes most of glibc failures. Does it make any senses? If it does, there is another place in expand_expr_real_2: [hjl@gnu-tools-1 tmp]$ cat /tmp/y diff --git a/gcc/expr.c b/gcc/expr.c index 3e8e004..816fdb8 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8157,7 +8157,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) - || mode != ptr_mode) + || mode != Pmode) goto binop; expand_operands (treeop0, treeop1, [hjl@gnu-tools-1 tmp]$