summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2016-11-21 18:19:12 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2016-11-21 18:19:12 +0000
commit2b80afd85741196eab692fe4f4d676e310ae8721 (patch)
tree7a235a6bbe655c0e1d8bebe8db79fe91034fa581
parent4199d12ff367a9a21b25f1dfeeab26fdc17b2546 (diff)
downloadgcc-2b80afd85741196eab692fe4f4d676e310ae8721.tar.gz
PR target/25128
* config/m68k/predicates.md (swap_peephole_relational_operator): New predicate. * config/m68k/m68k.md (relational tests against 65535/65536): New peephole2. PR target/25128 * gcc.target/m68k/pr25128.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@242676 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/m68k/m68k.md21
-rw-r--r--gcc/config/m68k/predicates.md3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/m68k/pr25128.c48
5 files changed, 84 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b30319eb664..d546162cc64 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-11-20 Jeff Law <law@redhat.com>
+
+ PR target/25128
+ * config/m68k/predicates.md (swap_peephole_relational_operator): New
+ predicate.
+ * config/m68k/m68k.md (relational tests against 65535/65536): New
+ peephole2.
+
2016-11-21 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* tree-ssa-loop-prefetch.c: Delete FIXME after the includes.
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index 208561996e7..c6130f12386 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -7786,7 +7786,6 @@
operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[7] = operands[2];
}")
-
(define_peephole2
[(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "pow2_m1_operand" "")))
@@ -7804,3 +7803,23 @@
(match_dup 2) (match_dup 3)))]
"{ operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1)); }")
+;; When optimizing for size or for the original 68000 or 68010, we can
+;; improve some relational tests against 65536 (which get canonicalized
+;; internally against 65535).
+;; The rotate in the output pattern will turn into a swap.
+(define_peephole2
+ [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
+ (const_int 65535)))
+ (set (pc) (if_then_else (match_operator 1 "swap_peephole_relational_operator"
+ [(cc0) (const_int 0)])
+ (match_operand 2 "pc_or_label_operand")
+ (match_operand 3 "pc_or_label_operand")))]
+ "peep2_reg_dead_p (1, operands[0])
+ && (operands[2] == pc_rtx || operands[3] == pc_rtx)
+ && (optimize_size || TUNE_68000_10)
+ && DATA_REG_P (operands[0])"
+ [(set (match_dup 0) (rotate:SI (match_dup 0) (const_int 16)))
+ (set (cc0) (compare (subreg:HI (match_dup 0) 2) (const_int 0)))
+ (set (pc) (if_then_else (match_op_dup 1 [(cc0) (const_int 0)])
+ (match_dup 2) (match_dup 3)))]
+ "")
diff --git a/gcc/config/m68k/predicates.md b/gcc/config/m68k/predicates.md
index bfb548ab86f..be32ef60db3 100644
--- a/gcc/config/m68k/predicates.md
+++ b/gcc/config/m68k/predicates.md
@@ -279,3 +279,6 @@
;; Used to detect (pc) or (label_ref) in some jumping patterns to cut down
(define_predicate "pc_or_label_operand"
(match_code "pc,label_ref"))
+
+(define_predicate "swap_peephole_relational_operator"
+ (match_code "gtu,leu,gt,le"))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 828c941265e..7dbfcaa8c30 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-20 Jeff Law <law@redhat.com>
+
+ PR target/25128
+ * gcc.target/m68k/pr25128.c: New test.
+
2016-11-21 Richard Sandiford <richard.sandiford@arm.com>
* gcc.dg/tree-ssa/tailcall-7.c: New test.
diff --git a/gcc/testsuite/gcc.target/m68k/pr25128.c b/gcc/testsuite/gcc.target/m68k/pr25128.c
new file mode 100644
index 00000000000..f99f817d426
--- /dev/null
+++ b/gcc/testsuite/gcc.target/m68k/pr25128.c
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+/* { dg-final { scan-assembler-times "swap" 4 } } */
+/* { dg-final { scan-assembler-times "tst.w" 4 } } */
+/* { dg-final { scan-assembler-not "cmp.l" } } */
+
+
+unsigned int bar (void);
+void
+foo1 (void)
+{
+ unsigned int a = bar ();
+ if (0x10000 <= a)
+ bar ();
+}
+
+
+void
+foo2 (void)
+{
+ unsigned int a = bar ();
+ if (0x10000 > a)
+ bar ();
+}
+
+
+void
+foo3 (void)
+{
+ int a = bar ();
+ if (0x10000 <= a)
+ bar ();
+}
+
+
+void
+foo4 (void)
+{
+ int a = bar ();
+ if (0x10000 > a)
+ bar ();
+}
+
+
+
+
+