RE: [RFC] Use REG_EXPR in back-end (introduced by optimization to conditional and/or in ARM back-end)

2012-01-11 Thread Jiangning Liu


 -Original Message-
 From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
 ow...@gcc.gnu.org] On Behalf Of Jiangning Liu
 Sent: Wednesday, December 21, 2011 2:48 PM
 To: 'Richard Henderson'
 Cc: gcc-patches@gcc.gnu.org; 'Richard Guenther'
 Subject: RE: [RFC] Use REG_EXPR in back-end (introduced by optimization
 to conditional and/or in ARM back-end)
 
 
  -Original Message-
  From: Richard Henderson [mailto:r...@redhat.com]
  Sent: Tuesday, November 22, 2011 9:55 AM
  To: Jiangning Liu
  Cc: gcc-patches@gcc.gnu.org; 'Richard Guenther'
  Subject: Re: [RFC] Use REG_EXPR in back-end (introduced by
 optimization
  to conditional and/or in ARM back-end)
 
  On 11/21/2011 05:31 PM, Jiangning Liu wrote:
   My question is essentially is May I really use REG_EXPR in back-
 end
  code?
   like the patch I gave below?
 
  I suppose.
 
  Another alternative is to use BImode for booleans.  Dunno how much of
  that
  you'd be able to gleen from mere rtl expansion or if you'd need
 boolean
  decls to be expanded with BImode.
 
 Hi Richard,
 
 The output of expand pass requires the operands must meet the
 requirement of
 general_operand for binary operations, i.e. all RTX operations on top
 level
 must meet the hardware instruction requirement. Generally for a
 hardware not
 directly supporting a single bit logic operation, we can't generate BI
 mode
 rtx dest.
 
 So if I simply generate BImode for NE in expand pass, like subreg:SI
 (ne:BI
 (reg:SI xxx) (const_int 0))), there would be an assertion failure due
 to
 failing to find an appropriate instruction code to operate on a single
 bit.
 
 This looks like a GCC design level issue. How would you suggest
 generating a
 legitimate rtx expression containing BImode?
 

Can anybody give me useful suggestions on this issue?

My question essentially is may I really use BImode to solve my original
problem?

Thanks,
-Jiangning

 Thanks,
 -Jiangning
 
 
  The later would probably need a target hook.  I've often wondered how
  much
  ia64 would benefit from that too, being able to store bool variables
  directly
  in predicate registers.
 
  All of this almost certainly must wait until stage1 opens up again
  though...
 
 
  r~
 
 
 
 






RE: [RFC] Use REG_EXPR in back-end (introduced by optimization to conditional and/or in ARM back-end)

2011-12-20 Thread Jiangning Liu

 -Original Message-
 From: Richard Henderson [mailto:r...@redhat.com]
 Sent: Tuesday, November 22, 2011 9:55 AM
 To: Jiangning Liu
 Cc: gcc-patches@gcc.gnu.org; 'Richard Guenther'
 Subject: Re: [RFC] Use REG_EXPR in back-end (introduced by optimization
 to conditional and/or in ARM back-end)
 
 On 11/21/2011 05:31 PM, Jiangning Liu wrote:
  My question is essentially is May I really use REG_EXPR in back-end
 code?
  like the patch I gave below?
 
 I suppose.
 
 Another alternative is to use BImode for booleans.  Dunno how much of
 that
 you'd be able to gleen from mere rtl expansion or if you'd need boolean
 decls to be expanded with BImode.

Hi Richard,

The output of expand pass requires the operands must meet the requirement of
general_operand for binary operations, i.e. all RTX operations on top level
must meet the hardware instruction requirement. Generally for a hardware not
directly supporting a single bit logic operation, we can't generate BI mode
rtx dest.

So if I simply generate BImode for NE in expand pass, like subreg:SI (ne:BI
(reg:SI xxx) (const_int 0))), there would be an assertion failure due to
failing to find an appropriate instruction code to operate on a single bit.

This looks like a GCC design level issue. How would you suggest generating a
legitimate rtx expression containing BImode?

Thanks,
-Jiangning

 
 The later would probably need a target hook.  I've often wondered how
 much
 ia64 would benefit from that too, being able to store bool variables
 directly
 in predicate registers.
 
 All of this almost certainly must wait until stage1 opens up again
 though...
 
 
 r~






Re: [RFC] Use REG_EXPR in back-end (introduced by optimization to conditional and/or in ARM back-end)

2011-12-01 Thread Richard Guenther
On Tue, Nov 22, 2011 at 2:55 AM, Richard Henderson r...@redhat.com wrote:
 On 11/21/2011 05:31 PM, Jiangning Liu wrote:
 My question is essentially is May I really use REG_EXPR in back-end code?
 like the patch I gave below?

 I suppose.

I'm not so sure ;)  At least checking for BOOLEAN_TYPE is incomplete - you
miss 1-bit precision types of the same signedness as bool.  The middle-end
doesn't distinguish between them anymore (semantically, that is)...

 Another alternative is to use BImode for booleans.  Dunno how much of that
 you'd be able to gleen from mere rtl expansion or if you'd need boolean
 decls to be expanded with BImode.

... which probably also means consistently getting BImode won't work?

Richard.

 The later would probably need a target hook.  I've often wondered how much
 ia64 would benefit from that too, being able to store bool variables directly
 in predicate registers.

 All of this almost certainly must wait until stage1 opens up again though...


 r~


RE: [RFC] Use REG_EXPR in back-end (introduced by optimization to conditional and/or in ARM back-end)

2011-11-21 Thread Jiangning Liu
The original subject doesn't catch the key point, so I changed the subject
to get more people noticed.

My question is essentially is May I really use REG_EXPR in back-end code?
like the patch I gave below?

Thanks,
-Jiangning

 -Original Message-
 From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
 ow...@gcc.gnu.org] On Behalf Of Jiangning Liu
 Sent: Monday, November 21, 2011 10:18 AM
 To: gcc-patches@gcc.gnu.org
 Cc: 'Richard Guenther'; Richard Henderson
 Subject: [RFC] Optimization to conditional and/or in ARM back-end
 
 Hi,
 
 This patch is to implement a peephole like optimization in ARM back-end.
 
 If we have an if condition expression like ((r3 != 0)  r1) != 0,
 originally the binary code to be generated is like,
 
 cmp r3, #0
 ite eq
 moveq   r1, #0
 andne   r1, r1, #1
 cmp r1, #0
 
 But actually this expression could be transformed into ((r3 != x) 
 (r1 !=
 0)) != 0, if we know r2 is with bool type. This way we could generate
 new
 binary code like,
 
 cmp r3, #0
 it  ne
 cmpne   r1, #0
 
 The question is how to judge r2 is a bool variable in back-end. I'm
 using
 REG_EXPR in function arm_check_logic_with_bool_reg to check if r2 is a
 bool,
 this function is being invoked in pattern *cond_code.
 
 May I really use REG_EXPR this way in GCC back-end code? I posted a
 related
 topic at http://gcc.gnu.org/ml/gcc/2011-11/msg00417.html.
 
 If the answer is No, is there any suggestions about either how to judge
 this
 bool type or how to implement this optimization?
 
 Appreciate your comments in advance!
 
 Thanks,
 -Jiangning
 
 
 diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
 index 23a29c6..8b12d48
 --- a/gcc/config/arm/arm-protos.h
 +++ b/gcc/config/arm/arm-protos.h
 @@ -114,6 +114,7 @@ extern rtx arm_gen_load_multiple (int *, int, rtx,
 int,
 rtx, HOST_WIDE_INT *);
  extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx,
 HOST_WIDE_INT
 *);
  extern int arm_gen_movmemqi (rtx *);
  extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
 +extern bool arm_check_logic_with_bool_reg (RTX_CODE, rtx, rtx);
  extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
  HOST_WIDE_INT);
  extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx);
 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
 index a429c19..e96f24a
 --- a/gcc/config/arm/arm.c
 +++ b/gcc/config/arm/arm.c
 @@ -10910,6 +10910,41 @@ arm_gen_movmemqi (rtx *operands)
return 1;
  }
 
 +/* Check whether the expression rc cmp1 bool_reg can be
 transformed
 +   to use conditional comparison or not.  */
 +bool
 +arm_check_logic_with_bool_reg (RTX_CODE rc, rtx bool_reg, rtx cmp1) {
 +  rtx cmp2;
 +  HOST_WIDE_INT dom_cc;
 +
 +  if (!REG_P (bool_reg))
 +return false;
 +
 +  if (REG_EXPR (bool_reg) == NULL)
 +return false;
 +
 +  if (TREE_CODE (REG_EXPR (bool_reg)) != VAR_DECL)
 +return false;
 +
 +  if (TREE_CODE (TREE_TYPE (REG_EXPR (bool_reg))) != BOOLEAN_TYPE)
 +return false;
 +
 +  cmp2 = gen_rtx_NE (GET_MODE (bool_reg), bool_reg, const0_rtx);
 +
 +  if (rc == AND)
 +dom_cc = DOM_CC_X_AND_Y;
 +  else if (rc == IOR)
 +dom_cc = DOM_CC_X_OR_Y;
 +  else
 +gcc_unreachable ();
 +
 +  if (arm_select_dominance_cc_mode (cmp1, cmp2, dom_cc) == CCmode)
 +return false;
 +
 +  return true;
 +}
 +
 +
  /* Select a dominance comparison mode if possible for a test of the
 general
 form (OP (COND_OR (X) (Y)) (const_int 0)).  We support three forms.
 COND_OR == DOM_CC_X_AND_Y = (X  Y)
 diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
 index a78ba88..e90a78e
 --- a/gcc/config/arm/arm.md
 +++ b/gcc/config/arm/arm.md
 @@ -9172,6 +9172,64 @@
 (set_attr length 4,4,8)]
  )
 
 +; This pattern matches expression like example ((r1 != x)  r2) != 0.
 +; Here r2 is a register with data type boolean.
 +; This pattern can transform to code matching patterns cmp_and.
 +; Likewise, code matching pattern cmp_ior could be generated, if it is
 |
 +; rather than  in the example.
 +(define_insn_and_split *cond_code
 +  [(set (match_operand 0 cc_register )
 + (compare
 + (ior_and:SI
 +   (match_operator:SI 4 arm_comparison_operator
 +   [(match_operand:SI 2 s_register_operand r,r)
 + (match_operand:SI 3 arm_add_operand rI,L)])
 +  (match_operand:SI 1 s_register_operand r,r))
 +  (const_int 0)))]
 +  TARGET_32BIT
 +arm_check_logic_with_bool_reg (CODE, operands[1],
 operands[4])
 +  #
 +   1
 +  [(set (match_dup 7)
 + (compare
 +  (match_op_dup 5
 +   [(match_op_dup 4 [(match_dup 2) (match_dup 3)])
 +(match_op_dup 6 [(match_dup 1) (const_int 0)])])
 +  (const_int 0)))]
 +  
 +  {
 +HOST_WIDE_INT dom_cc;
 +
 +operands[6] = gen_rtx_NE (SImode, operands[1], const0_rtx);
 +
 +if (CODE == AND)
 +  {
 +dom_cc = DOM_CC_X_AND_Y;
 +

Re: [RFC] Use REG_EXPR in back-end (introduced by optimization to conditional and/or in ARM back-end)

2011-11-21 Thread Richard Henderson
On 11/21/2011 05:31 PM, Jiangning Liu wrote:
 My question is essentially is May I really use REG_EXPR in back-end code?
 like the patch I gave below?

I suppose.

Another alternative is to use BImode for booleans.  Dunno how much of that
you'd be able to gleen from mere rtl expansion or if you'd need boolean
decls to be expanded with BImode.

The later would probably need a target hook.  I've often wondered how much
ia64 would benefit from that too, being able to store bool variables directly
in predicate registers.

All of this almost certainly must wait until stage1 opens up again though...


r~