This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, ifcvt] Allow CC mode if HAVE_cbranchcc4 (fix s390 build)
- From: Richard Henderson <rth at redhat dot com>
- To: Zhenqiang Chen <zhenqiang dot chen at arm dot com>, "'Jan-Benedict Glaw'" <jbglaw at lug-owl dot de>, Hartmut Penner <hpenner at de dot ibm dot com>, Ulrich Weigand <uweigand at de dot ibm dot com>, Andreas Krebbel <Andreas dot Krebbel at de dot ibm dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 06 Nov 2014 09:22:38 +0100
- Subject: Re: [PATCH, ifcvt] Allow CC mode if HAVE_cbranchcc4 (fix s390 build)
- Authentication-results: sourceware.org; auth=none
- References: <000001cff995$8d9b4400$a8d1cc00$ at arm dot com>
On 11/06/2014 08:44 AM, Zhenqiang Chen wrote:
> Hi,
>
> The patch add runtime check to fix s390 build fail
> (https://gcc.gnu.org/ml/gcc-patches/2014-11/msg00050.html).
>
> And there is additional code to workaround s390 cstorecc4 issue.
>
> Bootstrap and no make check regression on X86-64.
> Build s390-linux-gnu and s390x-linux-gnu.
>
> I do not have env to run full s390 tests. Would anyone in the TO list help
> to run the s390 tests?
>
> Thanks!
> -Zhenqiang
>
> ChangeLog:
> 2014-11-06 Zhenqiang Chen <zhenqiang.chen@arm.com>
>
> * ifcvt.c (noce_emit_cmove, noce_get_alt_condition,
> noce_get_condition):
> Allow CC mode if HAVE_cbranchcc4.
> (noce_emit_store_flag): Change CC REG as cond_complex.
>
> diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
> index f4002f9..7f7b7c1 100644
> --- a/gcc/ifcvt.c
> +++ b/gcc/ifcvt.c
> @@ -849,7 +849,10 @@ noce_emit_store_flag (struct noce_if_info *if_info, rtx
> x, int reversep,
> enum rtx_code code;
>
> cond_complex = (! general_operand (XEXP (cond, 0), VOIDmode)
> - || ! general_operand (XEXP (cond, 1), VOIDmode));
> + || ! general_operand (XEXP (cond, 1), VOIDmode)
> + /* For s390, CC REG is general_operand. But cstorecc4
> only
> + handles CCZ1, which can not handle others like CCU.
> */
> + || GET_MODE_CLASS (GET_MODE (XEXP (cond, 0))) == MODE_CC);
>
I'd like to know more about this. This seems like a mistake in the backend.
> +#ifdef HAVE_cbranchcc4
> + if (GET_MODE_CLASS (GET_MODE (cmp_a)) != MODE_CC
> + || cmp_b != const0_rtx
> + || !(HAVE_cbranchcc4))
> +#endif
Please add
#ifndef HAVE_cbranchcc4
# define HAVE_cbranchcc4
#endif
at the top of ifcvt.c along with all of the others. Then use normal C tests
instead of preprocessor tests.
> + int allow_cc_mode = false;
> +#ifdef HAVE_cbranchcc4
> + allow_cc_mode = HAVE_cbranchcc4;
> +#endif
E.g. this becomes
bool allow_cc_mode = HAVE_cbranchcc4;
r~