[git commit] bc: do not use "(cond ? f1 : f2)(params)" idiom, it messes up static function optimizations

Denys Vlasenko vda.linux at googlemail.com
Tue Dec 11 18:33:09 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=09d8df84ee908b940a31822c3480f36f817e4f09
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

With direct calls, GCC no longer thinks that we take addresses of the functions,
and can use "more optimal" internal ABI for _all_ calls to these functions,
not only at this callsite. On i486, regparm is used, and:

function                                             old     new   delta
zbc_num_inv                                           56      57      +1
zbc_num_k                                            852     851      -1
zbc_program_modexp                                   558     556      -2
zbc_num_d                                            541     539      -2
bc_num_ulong2num                                      59      57      -2
zbc_program_num                                      840     836      -4
bc_num_zero                                           11       7      -4
bc_num_one                                            28      24      -4
bc_program_exec                                     3928    3918     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 1/-29)             Total: -28 bytes
   text	   data	    bss	    dec	    hex	filename
 982237	    485	   7296	 990018	  f1b42	busybox_old
 982209	    485	   7296	 989990	  f1b26	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/bc.c | 60 ++++++++++++++++++++--------------------------------------
 1 file changed, 21 insertions(+), 39 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index 5ede8598d..e7f48fcea 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -5943,6 +5943,7 @@ static BcStatus bc_program_logical(char inst)
 
 	s = zbc_program_binOpPrep(&opd1, &n1, &opd2, &n2, false);
 	if (s) return s;
+
 	bc_num_init_DEF_SIZE(&res.d.n);
 
 	if (inst == BC_INST_BOOL_AND)
@@ -5950,50 +5951,31 @@ static BcStatus bc_program_logical(char inst)
 	else if (inst == BC_INST_BOOL_OR)
 		cond = bc_num_cmp(n1, &G.prog.zero) || bc_num_cmp(n2, &G.prog.zero);
 	else {
-
 		cmp = bc_num_cmp(n1, n2);
-
 		switch (inst) {
-
-			case BC_INST_REL_EQ:
-			{
-				cond = cmp == 0;
-				break;
-			}
-
-			case BC_INST_REL_LE:
-			{
-				cond = cmp <= 0;
-				break;
-			}
-
-			case BC_INST_REL_GE:
-			{
-				cond = cmp >= 0;
-				break;
-			}
-
-			case BC_INST_REL_NE:
-			{
-				cond = cmp != 0;
-				break;
-			}
-
-			case BC_INST_REL_LT:
-			{
-				cond = cmp < 0;
-				break;
-			}
-
-			case BC_INST_REL_GT:
-			{
-				cond = cmp > 0;
-				break;
-			}
+		case BC_INST_REL_EQ:
+			cond = cmp == 0;
+			break;
+		case BC_INST_REL_LE:
+			cond = cmp <= 0;
+			break;
+		case BC_INST_REL_GE:
+			cond = cmp >= 0;
+			break;
+		case BC_INST_REL_NE:
+			cond = cmp != 0;
+			break;
+		case BC_INST_REL_LT:
+			cond = cmp < 0;
+			break;
+		case BC_INST_REL_GT:
+			cond = cmp > 0;
+			break;
 		}
 	}
 
-	(cond ? bc_num_one : bc_num_zero)(&res.d.n);
+	if (cond) bc_num_one(&res.d.n);
+	//else bc_num_zero(&res.d.n); - already is
 
 	bc_program_binOpRetire(&res);
 


More information about the busybox-cvs mailing list