Hi Mikhail,
On 23/05/16 15:00, Mikhail Maltsev wrote:
This patch adds a new if-conversion pattern for the following case:
if (test) x = A; else x = B;
A and B are constants, abs(A - B) == 2^N, A != 0, B != 0
Bootstrapped and regtested on x86_64-linux. OK for trunk?
@@ -1453,6 +1460,19 @@ noce_try_store_flag_constants (struct noce_if_info
*if_info)
gen_int_mode (ifalse, mode), if_info->x,
0, OPTAB_WIDEN);
break;
+ case ST_SHIFT_ADD_FLAG:
+ {
+ /* if (test) x = 5; else x = 1;
+ => x = (test != 0) << 2 + 1; */
+ HOST_WIDE_INT diff_log = exact_log2 (abs_hwi (diff));
+ rtx diff_rtx
+ = expand_simple_binop (mode, ASHIFT, target, GEN_INT (diff_log),
+ if_info->x, 0, OPTAB_WIDEN);
+ target = expand_simple_binop (mode, (diff < 0) ? MINUS : PLUS,
+ gen_int_mode (ifalse, mode), diff_rtx,
+ if_info->x, 0, OPTAB_WIDEN);
+ break;
+ }
expand_simple_binop may fail. I think you should add a check that diff_rtx is
non-NULL
and bail out early if it is.
Kyrill