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

Reply via email to