New ia64 patterns for the combiner

Bernd Schmidt bernds@redhat.com
Sun Aug 5 09:53:00 GMT 2001


This patch helps us turn

(p1) mov r1 = r2
(p2) mov r1 = r3
sub r4 = r4, r1

(which happens to occur in an important loop in SPEC95) into

(p1) sub r4 = r4, r2
(p2) sub r4 = r4, r3

Tested like the previous patches.


Bernd

        * config/ia64/ia64.c (condop_operator): New predicate.
        * config/ia64/ia64.h (PREDICATE_CODES): Add it.
        * config/ia64/ia64.md (cond_opsi2_internal and splitters): New
        patterns.

Index: config/ia64/ia64.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/config/ia64/ia64.c,v
retrieving revision 1.96
diff -u -p -r1.96 ia64.c
--- config/ia64/ia64.c	2001/05/22 20:10:18	1.96
+++ config/ia64/ia64.c	2001/08/05 09:46:18
@@ -694,6 +694,19 @@ predicate_operator (op, mode)
 	  && (code == EQ || code == NE));
 }

+/* Return 1 if this operator can be used in a conditional operation.  */
+
+int
+condop_operator (op, mode)
+    register rtx op;
+    enum machine_mode mode;
+{
+  enum rtx_code code = GET_CODE (op);
+  return ((GET_MODE (op) == mode || mode == VOIDmode)
+	  && (code == PLUS || code == MINUS || code == AND
+	      || code == IOR || code == XOR));
+}
+
 /* Return 1 if this is the ar.lc register.  */

 int
Index: config/ia64/ia64.h
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/config/ia64/ia64.h,v
retrieving revision 1.100
diff -u -p -r1.100 ia64.h
--- config/ia64/ia64.h	2001/05/15 01:31:32	1.100
+++ config/ia64/ia64.h	2001/08/05 09:46:18
@@ -2688,6 +2688,7 @@ do {									\
 { "adjusted_comparison_operator", {LT, GE, LTU, GEU}},			\
 { "signed_inequality_operator", {GE, GT, LE, LT}},			\
 { "predicate_operator", {NE, EQ}},					\
+{ "condop_operator", {PLUS, MINUS, IOR, XOR, AND}},			\
 { "ar_lc_reg_operand", {REG}},						\
 { "ar_ccv_reg_operand", {REG}},						\
 { "general_tfmode_operand", {SUBREG, REG, CONST_DOUBLE, MEM}},		\
Index: config/ia64/ia64.md
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/config/ia64/ia64.md,v
retrieving revision 1.99
diff -u -p -r1.99 ia64.md
--- config/ia64/ia64.md	2001/05/22 20:10:18	1.99
+++ config/ia64/ia64.md	2001/08/05 09:46:19
@@ -4468,6 +4478,82 @@
   "
 {
   operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == NE ? EQ : NE,
+				VOIDmode, operands[1], const0_rtx);
+}")
+
+(define_insn "*cond_opsi2_internal"
+  [(set (match_operand:SI 0 "gr_register_operand" "=r")
+	(match_operator:SI 5 "condop_operator"
+	  [(if_then_else:SI
+	     (match_operator 6 "predicate_operator"
+	       [(match_operand:BI 1 "register_operand" "c")
+	        (const_int 0)])
+	     (match_operand:SI 2 "gr_register_operand" "r")
+	     (match_operand:SI 3 "gr_register_operand" "r"))
+	   (match_operand:SI 4 "gr_register_operand" "r")]))]
+  ""
+  "#"
+  [(set_attr "itanium_class" "ialu")
+   (set_attr "predicable" "no")])
+
+(define_split
+  [(set (match_operand:SI 0 "gr_register_operand" "")
+	(match_operator:SI 5 "condop_operator"
+	  [(if_then_else:SI
+	     (match_operator 6 "predicate_operator"
+	       [(match_operand:BI 1 "register_operand" "")
+	        (const_int 0)])
+	     (match_operand:SI 2 "gr_register_operand" "")
+	     (match_operand:SI 3 "gr_register_operand" ""))
+	   (match_operand:SI 4 "gr_register_operand" "")]))]
+  "reload_completed"
+  [(cond_exec
+     (match_dup 6)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 2) (match_dup 4)])))
+   (cond_exec
+     (match_dup 7)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 3) (match_dup 4)])))]
+  "
+{
+  operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[6]) == NE ? EQ : NE,
+				VOIDmode, operands[1], const0_rtx);
+}")
+
+(define_insn "*cond_opsi2_internal_b"
+  [(set (match_operand:SI 0 "gr_register_operand" "=r")
+	(match_operator:SI 5 "condop_operator"
+	  [(match_operand:SI 4 "gr_register_operand" "r")
+	   (if_then_else:SI
+	     (match_operator 6 "predicate_operator"
+	       [(match_operand:BI 1 "register_operand" "c")
+	        (const_int 0)])
+	     (match_operand:SI 2 "gr_register_operand" "r")
+	     (match_operand:SI 3 "gr_register_operand" "r"))]))]
+  ""
+  "#"
+  [(set_attr "itanium_class" "ialu")
+   (set_attr "predicable" "no")])
+
+(define_split
+  [(set (match_operand:SI 0 "gr_register_operand" "")
+	(match_operator:SI 5 "condop_operator"
+	  [(match_operand:SI 4 "gr_register_operand" "")
+	   (if_then_else:SI
+	     (match_operator 6 "predicate_operator"
+	       [(match_operand:BI 1 "register_operand" "")
+	        (const_int 0)])
+	     (match_operand:SI 2 "gr_register_operand" "")
+	     (match_operand:SI 3 "gr_register_operand" ""))]))]
+  "reload_completed"
+  [(cond_exec
+     (match_dup 6)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 4) (match_dup 2)])))
+   (cond_exec
+     (match_dup 7)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 4) (match_dup 3)])))]
+  "
+{
+  operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[6]) == NE ? EQ : NE,
 				VOIDmode, operands[1], const0_rtx);
 }")




More information about the Gcc-patches mailing list