From mboxrd@z Thu Jan 1 00:00:00 1970 From: teunis To: egcs list Subject: Re: byteorder mess (fwd) Date: Mon, 08 Dec 1997 11:24:00 -0000 Message-id: X-SW-Source: 1997-12/msg00485.html from linux-kernel - this in here somewhere? G'day, eh? :) - Teunis ---------- Forwarded message ---------- Date: Sat, 6 Dec 1997 04:16:13 +0000 From: lkd@tantalophile.demon.co.uk To: linux-kernel@vger.rutgers.edu Subject: Re: byteorder mess > Gcc doesn't do constant propagation into inline > functions (I do hope egcs will fix this), so the __builtin_constant_p() > thing doesn't work unless it's a define. I wrote a patch for GCC 2.7.2 over a year ago which enabled __builtin_constant_p() on constants in inline functions, and other places where constants are propagated (e.g., results from inline functions). I used it a lot with a commercial C++ project (a game running under Linux, amazingly), and submitted it after extensive testing (i386 only, admittedly). It was rejected as too fundamental a change: it adds a new RTX code. I include the patch below for anyone interested (it's short). -- Jamie Lokier diff -c fsf/gcc/ChangeLog:1.3 fsf/gcc/ChangeLog:1.4 *** fsf/gcc/ChangeLog:1.3 Mon Oct 21 18:25:15 1996 --- fsf/gcc/ChangeLog Mon Oct 21 18:29:40 1996 *************** *** 0 **** --- 1,10 ---- + Tue Jul 30 01:58:06 1996 Jamie Lokier + + * rtl.def: New code CONSTANT_P_RTX. + * expr.c (expand_builtin, case BUILT_IN_CONSTANT_P): Emit + CONSTANT_P_RTX instead of const0_rtx. + * cse.c (fold_rtx): Fold CONSTANT_P_RTX. + Index: fsf/gcc/cse.c diff -c fsf/gcc/cse.c:1.1.1.3 fsf/gcc/cse.c:1.2 *** fsf/gcc/cse.c:1.1.1.3 Mon Oct 21 16:05:00 1996 --- fsf/gcc/cse.c Mon Oct 21 18:29:41 1996 *************** *** 5687,5692 **** --- 5687,5698 ---- const_arg1 ? const_arg1 : folded_arg1, const_arg2 ? const_arg2 : XEXP (x, 2)); break; + + case 'x': + if (code == CONSTANT_P_RTX) + /* Always eliminate CONSTANT_P_RTX at this stage. */ + return (const_arg0 ? const1_rtx : const0_rtx); + break; } return new ? new : x; Index: fsf/gcc/expr.c diff -c fsf/gcc/expr.c:1.2 fsf/gcc/expr.c:1.3 *** fsf/gcc/expr.c:1.2 Mon Oct 21 17:09:13 1996 --- fsf/gcc/expr.c Mon Oct 21 18:29:43 1996 *************** *** 7625,7631 **** return (TREE_CODE_CLASS (TREE_CODE (arg)) == 'c' || (TREE_CODE (arg) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST) ! ? const1_rtx : const0_rtx); } case BUILT_IN_FRAME_ADDRESS: --- 7625,7637 ---- return (TREE_CODE_CLASS (TREE_CODE (arg)) == 'c' || (TREE_CODE (arg) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST) ! ? const1_rtx ! : (optimize > 0 ! /* Only emit CONSTANT_P_RTX if CSE will be run. */ ! ? gen_rtx (CONSTANT_P_RTX, TYPE_MODE (integer_type_node), ! expand_expr (TREE_VALUE (arglist), NULL_RTX, ! VOIDmode, 0)) ! : const0_rtx)); } case BUILT_IN_FRAME_ADDRESS: Index: fsf/gcc/rtl.def diff -c fsf/gcc/rtl.def:1.1.1.1 fsf/gcc/rtl.def:1.2 *** fsf/gcc/rtl.def:1.1.1.1 Mon Oct 21 15:21:10 1996 --- fsf/gcc/rtl.def Mon Oct 21 18:29:45 1996 *************** *** 757,762 **** --- 757,767 ---- of a constant expression. */ DEF_RTL_EXPR(LO_SUM, "lo_sum", "ee", 'o') + /* A unary `__builtin_constant_p' expression. These are only emitted + during RTL generation, and then only if optimize > 0. They are + eliminated by the first CSE pass. */ + DEF_RTL_EXPR(CONSTANT_P_RTX, "constant_p", "e", 'x') + /* Local variables: mode:c