The patch is discarded since I can not reproduce the issue with the latest
trunk.

Thanks!
-Zhenqiang      

> -----Original Message-----
> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> ow...@gcc.gnu.org] On Behalf Of Zhenqiang Chen
> Sent: Thursday, June 26, 2014 3:21 PM
> To: Richard Earnshaw
> Cc: gcc-patches@gcc.gnu.org
> Subject: Re: [PATCH, 3/10] skip swapping operands used in ccmp
> 
> On 25 June 2014 22:44, Richard Earnshaw <rearn...@arm.com> wrote:
> > On 23/06/14 07:58, Zhenqiang Chen wrote:
> >> Hi,
> >>
> >> Swapping operands in a ccmp will lead to illegal instructions. So the
> >> patch disables it in simplify_while_replacing.
> >>
> >> The patch is separated from
> >> https://gcc.gnu.org/ml/gcc-patches/2014-02/msg01407.html.
> >>
> >> To make it clean. The patch adds two files: ccmp.{c,h} to hold all
> >> new ccmp related functions.
> >>
> >> OK for trunk?
> >>
> >> Thanks!
> >> -Zhenqiang
> >>
> >> ChangeLog:
> >> 2014-06-23  Zhenqiang Chen  <zhenqiang.c...@linaro.org>
> >>
> >>         * Makefile.in: Add ccmp.o
> >>         * ccmp.c: New file.
> >
> > Do we really need a new file for one 10-line function?  Seems like
> > overkill.  I think it would be better to just drop this function into
> > recog.c.
> >
> > Also, can you explain more clearly what the problem is with swapping
> > the operands?  If this can't be done, then SWAPPABLE_OPERANDS is
> > arguably doing the wrong thing; and that might mean that rtx class
> > you've applied to your new code is incorrect.
> 
> Thanks for the comments.
> 
> In previous tests, I got several new fails if the operands were swapped. I
will
> try to reproduce it and back to you.
> 
> Thanks!
> -Zhenqiang
> 
> > R.
> >
> >>         * ccmp.h: New file.
> >>         * recog.c (simplify_while_replacing): Check ccmp_insn_p.
> >>
> >> diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 5587b75..8757a30
> >> 100644
> >> --- a/gcc/Makefile.in
> >> +++ b/gcc/Makefile.in
> >> @@ -1169,6 +1169,7 @@ OBJS = \
> >>         builtins.o \
> >>         caller-save.o \
> >>         calls.o \
> >> +       ccmp.o \
> >>         cfg.o \
> >>         cfganal.o \
> >>         cfgbuild.o \
> >> diff --git a/gcc/ccmp.c b/gcc/ccmp.c
> >> new file mode 100644
> >> index 0000000..665c2a5
> >> --- /dev/null
> >> +++ b/gcc/ccmp.c
> >> @@ -0,0 +1,62 @@
> >> +/* Conditional compare related functions
> >> +   Copyright (C) 2014-2014 Free Software Foundation, Inc.
> >> +
> >> +This file is part of GCC.
> >> +
> >> +GCC is free software; you can redistribute it and/or modify it under
> >> +the terms of the GNU General Public License as published by the Free
> >> +Software Foundation; either version 3, or (at your option) any later
> >> +version.
> >> +
> >> +GCC is distributed in the hope that it will be useful, but WITHOUT
> >> +ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY
> >> +or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> >> +License for more details.
> >> +
> >> +You should have received a copy of the GNU General Public License
> >> +along with GCC; see the file COPYING3.  If not see
> >> +<http://www.gnu.org/licenses/>.  */
> >> +
> >> +#include "config.h"
> >> +#include "system.h"
> >> +#include "coretypes.h"
> >> +#include "tm.h"
> >> +#include "rtl.h"
> >> +#include "tree.h"
> >> +#include "stringpool.h"
> >> +#include "regs.h"
> >> +#include "expr.h"
> >> +#include "optabs.h"
> >> +#include "tree-iterator.h"
> >> +#include "basic-block.h"
> >> +#include "tree-ssa-alias.h"
> >> +#include "internal-fn.h"
> >> +#include "gimple-expr.h"
> >> +#include "is-a.h"
> >> +#include "gimple.h"
> >> +#include "gimple-ssa.h"
> >> +#include "tree-ssanames.h"
> >> +#include "target.h"
> >> +#include "common/common-target.h"
> >> +#include "df.h"
> >> +#include "tree-ssa-live.h"
> >> +#include "tree-outof-ssa.h"
> >> +#include "cfgexpand.h"
> >> +#include "tree-phinodes.h"
> >> +#include "ssa-iterators.h"
> >> +#include "expmed.h"
> >> +#include "ccmp.h"
> >> +
> >> +bool
> >> +ccmp_insn_p (rtx object)
> >> +{
> >> +  rtx x = PATTERN (object);
> >> +  if (targetm.gen_ccmp_first
> >> +      && GET_CODE (x) == SET
> >> +      && GET_CODE (XEXP (x, 1)) == COMPARE
> >> +      && (GET_CODE (XEXP (XEXP (x, 1), 0)) == IOR
> >> +         || GET_CODE (XEXP (XEXP (x, 1), 0)) == AND))
> >> +    return true;
> >> +  return false;
> >> +}
> >> +
> >> diff --git a/gcc/ccmp.h b/gcc/ccmp.h
> >> new file mode 100644
> >> index 0000000..7e139aa
> >> --- /dev/null
> >> +++ b/gcc/ccmp.h
> >> @@ -0,0 +1,25 @@
> >> +/* Conditional comapre related functions.
> >> +   Copyright (C) 2014-2014 Free Software Foundation, Inc.
> >> +
> >> +This file is part of GCC.
> >> +
> >> +GCC is free software; you can redistribute it and/or modify it under
> >> +the terms of the GNU General Public License as published by the Free
> >> +Software Foundation; either version 3, or (at your option) any later
> >> +version.:
> >> +
> >> +GCC is distributed in the hope that it will be useful, but WITHOUT
> >> +ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY
> >> +or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> >> +License for more details.
> >> +
> >> +You should have received a copy of the GNU General Public License
> >> +along with GCC; see the file COPYING3.  If not see
> >> +<http://www.gnu.org/licenses/>.  */
> >> +
> >> +#ifndef GCC_CCMP_H
> >> +#define GCC_CCMP_H
> >> +
> >> +extern bool ccmp_insn_p (rtx);
> >> +
> >> +#endif  /* GCC_CCMP_H  */
> >> diff --git a/gcc/recog.c b/gcc/recog.c index 8d10a4f..b53a28c 100644
> >> --- a/gcc/recog.c
> >> +++ b/gcc/recog.c
> >> @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3.  If not see
> >> #include "tree-pass.h"
> >>  #include "df.h"
> >>  #include "insn-codes.h"
> >> +#include "ccmp.h"
> >>
> >>  #ifndef STACK_PUSH_CODE
> >>  #ifdef STACK_GROWS_DOWNWARD
> >> @@ -577,7 +578,8 @@ simplify_while_replacing (rtx *loc, rtx to, rtx
object,
> >>    enum rtx_code code = GET_CODE (x);
> >>    rtx new_rtx = NULL_RTX;
> >>
> >> -  if (SWAPPABLE_OPERANDS_P (x)
> >> +  /* Do not swap compares in conditional compare instruction.  */
> >> + if (SWAPPABLE_OPERANDS_P (x) && !ccmp_insn_p (object)
> >>        && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
> >>      {
> >>        validate_unshare_change (object, loc,
> >>
> >
> >




Reply via email to