[PATCH 2/2][GCC] Add one more pattern to RTL if-conversion

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Mon May 23 14:15:00 GMT 2016


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



More information about the Gcc-patches mailing list