diff options
author | Vineet Gupta <vineetg@rivosinc.com> | 2023-02-28 19:27:26 -0800 |
---|---|---|
committer | Vineet Gupta <vineetg@rivosinc.com> | 2023-04-21 09:14:31 -0700 |
commit | 1fe9bef9f5536e46b901139631863b3b86b97898 (patch) | |
tree | f64d84f4592efde8f0d8aece7d915f0308c08ca3 | |
parent | e6f689d090011eaa4050357b3dd2d7b9109b83ec (diff) | |
download | gcc-1fe9bef9f5536e46b901139631863b3b86b97898.zip gcc-1fe9bef9f5536e46b901139631863b3b86b97898.tar.gz gcc-1fe9bef9f5536e46b901139631863b3b86b97898.tar.bz2 |
expansion: make layout of x_shift*cost[][][] more efficient
when debugging expmed.[ch] for PR/108987 saw that some of the cost arrays have
less than ideal layout as follows:
x_shift*cost[0..63][speed][modes]
We would want speed to be first index since a typical compile will have
that fixed, followed by mode and then the shift values.
It should be non-functional from compiler semantics pov, except
executing slightly faster due to better locality of shift values for
given speed and mode. And also a bit more intutive when debugging.
gcc/Changelog:
* expmed.h (x_shift*_cost): convert to int [speed][mode][shift].
(shift*_cost_ptr ()): Access x_shift*_cost array directly.
Signed-off-by: Vineet Gupta <vineetg@rivosinc.com>
-rw-r--r-- | gcc/expmed.h | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/gcc/expmed.h b/gcc/expmed.h index c747a0d..22ae1d2 100644 --- a/gcc/expmed.h +++ b/gcc/expmed.h @@ -161,15 +161,14 @@ struct target_expmed { struct expmed_op_cheap x_sdiv_pow2_cheap; struct expmed_op_cheap x_smod_pow2_cheap; - /* Cost of various pieces of RTL. Note that some of these are indexed by - shift count and some by mode. */ + /* Cost of various pieces of RTL. */ int x_zero_cost[2]; struct expmed_op_costs x_add_cost; struct expmed_op_costs x_neg_cost; - struct expmed_op_costs x_shift_cost[MAX_BITS_PER_WORD]; - struct expmed_op_costs x_shiftadd_cost[MAX_BITS_PER_WORD]; - struct expmed_op_costs x_shiftsub0_cost[MAX_BITS_PER_WORD]; - struct expmed_op_costs x_shiftsub1_cost[MAX_BITS_PER_WORD]; + int x_shift_cost[2][NUM_MODE_IPV_INT][MAX_BITS_PER_WORD]; + int x_shiftadd_cost[2][NUM_MODE_IPV_INT][MAX_BITS_PER_WORD]; + int x_shiftsub0_cost[2][NUM_MODE_IPV_INT][MAX_BITS_PER_WORD]; + int x_shiftsub1_cost[2][NUM_MODE_IPV_INT][MAX_BITS_PER_WORD]; struct expmed_op_costs x_mul_cost; struct expmed_op_costs x_sdiv_cost; struct expmed_op_costs x_udiv_cost; @@ -395,8 +394,8 @@ neg_cost (bool speed, machine_mode mode) inline int * shift_cost_ptr (bool speed, machine_mode mode, int bits) { - return expmed_op_cost_ptr (&this_target_expmed->x_shift_cost[bits], - speed, mode); + int midx = expmed_mode_index (mode); + return &this_target_expmed->x_shift_cost[speed][midx][bits]; } /* Set the COST of doing a shift in MODE by BITS when optimizing for SPEED. */ @@ -421,8 +420,8 @@ shift_cost (bool speed, machine_mode mode, int bits) inline int * shiftadd_cost_ptr (bool speed, machine_mode mode, int bits) { - return expmed_op_cost_ptr (&this_target_expmed->x_shiftadd_cost[bits], - speed, mode); + int midx = expmed_mode_index (mode); + return &this_target_expmed->x_shiftadd_cost[speed][midx][bits]; } /* Set the COST of doing a shift in MODE by BITS followed by an add when @@ -448,8 +447,8 @@ shiftadd_cost (bool speed, machine_mode mode, int bits) inline int * shiftsub0_cost_ptr (bool speed, machine_mode mode, int bits) { - return expmed_op_cost_ptr (&this_target_expmed->x_shiftsub0_cost[bits], - speed, mode); + int midx = expmed_mode_index (mode); + return &this_target_expmed->x_shiftsub0_cost[speed][midx][bits]; } /* Set the COST of doing a shift in MODE by BITS and then subtracting a @@ -475,8 +474,8 @@ shiftsub0_cost (bool speed, machine_mode mode, int bits) inline int * shiftsub1_cost_ptr (bool speed, machine_mode mode, int bits) { - return expmed_op_cost_ptr (&this_target_expmed->x_shiftsub1_cost[bits], - speed, mode); + int midx = expmed_mode_index (mode); + return &this_target_expmed->x_shiftsub1_cost[speed][midx][bits]; } /* Set the COST of subtracting a shift in MODE by BITS from a value when |