Hi All, This patch adjusts the cost model so that when both sdiv and udiv are possible it prefers udiv over sdiv. This was done by making sdiv slightly more expensive instead of making udiv cheaper to keep the baseline costs of a division the same as before. Similar to aarch64 this patch along with my other two related mid-end changes makes a big difference in division by constants. Given: int f2(int x) { return ((x * x) % 300) + ((x * x) / 300); } we now generate f2: mul r3, r0, r0 mov r0, r3 ldr r1, .L3 umull r2, r3, r0, r1 lsr r2, r3, #5 add r3, r2, r2, lsl #2 rsb r3, r3, r3, lsl #4 sub r0, r0, r3, lsl #2 add r0, r0, r2 bx lr as opposed to f2: mul r3, r0, r0 mov r0, r3 ldr r3, .L4 push {r4, r5} smull r4, r5, r0, r3 asr r3, r0, #31 rsb r3, r3, r5, asr #5 add r2, r3, r3, lsl #2 rsb r2, r2, r2, lsl #4 sub r0, r0, r2, lsl #2 add r0, r0, r3 pop {r4, r5} bx lr Bootstrapped and reg tested on arm-none-eabi with no regressions. OK for trunk? Thanks, Tamar gcc/ 2017-05-02 Tamar Christina * config/arm/arm.c (arm_rtx_costs_internal): Make sdiv more expensive than udiv. gcc/testsuite/ 2017-05-02 Tamar Christina * gcc.target/arm/sdiv_costs_1.c: New.