This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR69291, RTL if-conversion bug


On 02/10/2016 02:04 PM, Richard Biener wrote:
where noce_try_store_flag_constants identifies

(plus:SI (reg/v:SI 160 [ mod_tlen ])
          (reg/v:SI 224 [ <retval> ]))

as "common" and then tries to detect the case where setting the
result would clobber that value.  It doesn't seem to expect
anything else than regs that can be equal to the destination though
which is clearly an oversight.

        /* If we have x := test ? x + 3 : x + 4 then move the original
  	 x out of the way while we store flags.  */
-      if (common && rtx_equal_p (common, if_info->x))
+      if (common && reg_mentioned_p (if_info->x, common))
  	{
-	  common = gen_reg_rtx (mode);
-	  noce_emit_move_insn (common, if_info->x);
+	  rtx tem = gen_reg_rtx (mode);
+	  noce_emit_move_insn (tem, common);
+	  common = tem;
  	}

I'm not so sure noce_emit_move_insn will reliably handle an arbitrary expression. I think a more conservative fix would be to disable this transform if common is not a reg.


Bernd


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]