> -----Original Message----- > From: Richard Henderson [mailto:[email protected]] > Sent: Sunday, October 12, 2014 5:40 AM > To: Zhenqiang Chen; [email protected] > Subject: Re: [Ping] [PATCH, 10/10] aarch64: Handle ccmp in ifcvt to make it > work with cmov > > On 09/22/2014 11:46 PM, Zhenqiang Chen wrote: > > @@ -2375,10 +2387,21 @@ noce_get_condition (rtx_insn *jump, rtx_insn > **earliest, bool then_else_reversed > > return cond; > > } > > > > + /* For conditional compare, set ALLOW_CC_MODE to TRUE. */ > > + if (targetm.gen_ccmp_first) > > + { > > + rtx prev = prev_nonnote_nondebug_insn (jump); > > + if (prev > > + && NONJUMP_INSN_P (prev) > > + && BLOCK_FOR_INSN (prev) == BLOCK_FOR_INSN (jump) > > + && ccmp_insn_p (prev)) > > + allow_cc_mode = true; > > + } > > + > > /* Otherwise, fall back on canonicalize_condition to do the dirty > > work of manipulating MODE_CC values and COMPARE rtx codes. */ > > tmp = canonicalize_condition (jump, cond, reverse, earliest, > > - NULL_RTX, false, true); > > + NULL_RTX, allow_cc_mode, true); > > This needs a lot more explanation. Why it it ok to allow a cc_mode when the > source is a ccmp, and not for any other comparison? > > The issue is going to be how we use the comparison once we've finished with > the transformation. Is it going to be able to be properly handled by > emit_conditional_move? > > If the target doesn't have cbranchcc4, I think that prep_cmp_insn will fail. > But as you show from
Good point. It is not ccmp special. It is cbranchcc4 related. If I
understand correct, without cbranchcc4, we need put the result to a tmp
register and generate additional compares, which is not good for
performance.
I update the patch to check
+#if HAVE_cbranchcc4
+ allow_cc_mode = true;
+#endif
Thanks!
-Zhenqiang
> > +++ b/gcc/config/aarch64/aarch64.md
> > @@ -2589,15 +2589,19 @@
> > (match_operand:ALLI 3 "register_operand" "")))]
> > ""
> > {
> > - rtx ccreg;
> > enum rtx_code code = GET_CODE (operands[1]);
> >
> > if (code == UNEQ || code == LTGT)
> > FAIL;
> >
> > - ccreg = aarch64_gen_compare_reg (code, XEXP (operands[1], 0),
> > - XEXP (operands[1], 1));
> > - operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx);
> > + if (!ccmp_cc_register (XEXP (operands[1], 0),
> > + GET_MODE (XEXP (operands[1], 0))))
> > + {
> > + rtx ccreg;
> > + ccreg = aarch64_gen_compare_reg (code, XEXP (operands[1], 0),
> > + XEXP (operands[1], 1));
> > + operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx);
> > + }
>
> this change, even more than that may be required.
>
>
> r~
10-ifcvt.patch
Description: Binary data
