https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62631
--- Comment #16 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- > The cost of expression "p + ((sizetype)(99 - i_6(D)) + 1) * 4" computed > using normal +/-/* operators on sparc64 is 18, but the cost is 32 if it is > computed as "p + ((sizetype)(99 - i_6(D)) + 1) << 2", which is returned by > get_shiftadd_cost. How do you get the first number exactly? Note that the costs of shiftadd is completely skewed (by a factor of 3) because expmed.c computes it as a multadd instead of a shiftadd: Breakpoint 2, init_expmed_one_mode (all=0x7fffffffd540, mode=QImode, speed=1) at /home/eric/svn/gcc/gcc/expmed.c:219 219 set_shiftadd_cost (speed, mode, m, set_src_cost (all->shift_add, speed)); (gdb) p debug_rtx(all->shift_add) (plus:QI (mult:QI (reg:QI 109 [0]) (const_int 2 [0x2])) (reg:QI 109 [0])) but this should ensure that the costs are roughly the same for the expressions. > From the assembly code, it seems the computation is expensive on sparc64, I > may skip the test for these architectures if no other solutions. The hitch is that the code generated for 32-bit SPARC (where the test passes) is the optimal one and is also valid for 64-bit SPARC.