aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@gcc.gnu.org>2009-11-04 14:09:55 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2009-11-04 14:09:55 +0000
commit57f5eef09163ea054b2a417f87da107b178e6ab0 (patch)
treed145853d7821f8a0ff1bc2768105dd32049941a1 /gcc
parent4003023f9d54dc66854c9a5a87043ba2f9a5237e (diff)
downloadgcc-57f5eef09163ea054b2a417f87da107b178e6ab0.zip
gcc-57f5eef09163ea054b2a417f87da107b178e6ab0.tar.gz
gcc-57f5eef09163ea054b2a417f87da107b178e6ab0.tar.bz2
[multiple changes]
2009-11-04 Richard Earnshaw <rearnsha@arm.com> PR target/40835 * arm.md (peephole2 patterns for move and compare): New. 2009-11-04 Wei Guozhi <carrot@google.com> PR target/40835 * gcc.target/arm/pr40835: New testcase. From-SVN: r153895
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.md40
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/pr40835.c55
4 files changed, 105 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8afa6d1..1367409 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-04 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/40835
+ * arm.md (peephole2 patterns for move and compare): New.
+
2009-11-04 Nick Clifton <nickc@redhat.com>
* defaults.h (CONSTANT_ADDRESS_P): Provide a default definition.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index b8bf700..fbc52f4 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -6770,6 +6770,7 @@
(const_int 6)
(const_int 8))))]
)
+
(define_insn "*movsi_cbranchsi4"
[(set (pc)
(if_then_else
@@ -6833,6 +6834,45 @@
(const_int 10)))))]
)
+(define_peephole2
+ [(set (match_operand:SI 0 "low_register_operand" "")
+ (match_operand:SI 1 "low_register_operand" ""))
+ (set (pc)
+ (if_then_else (match_operator 2 "arm_comparison_operator"
+ [(match_dup 1) (const_int 0)])
+ (label_ref (match_operand 3 "" ""))
+ (pc)))]
+ "TARGET_THUMB1"
+ [(parallel
+ [(set (pc)
+ (if_then_else (match_op_dup 2 [(match_dup 1) (const_int 0)])
+ (label_ref (match_dup 3))
+ (pc)))
+ (set (match_dup 0) (match_dup 1))])]
+ ""
+)
+
+;; Sigh! This variant shouldn't be needed, but combine often fails to
+;; merge cases like this because the op1 is a hard register in
+;; CLASS_LIKELY_SPILLED_P.
+(define_peephole2
+ [(set (match_operand:SI 0 "low_register_operand" "")
+ (match_operand:SI 1 "low_register_operand" ""))
+ (set (pc)
+ (if_then_else (match_operator 2 "arm_comparison_operator"
+ [(match_dup 0) (const_int 0)])
+ (label_ref (match_operand 3 "" ""))
+ (pc)))]
+ "TARGET_THUMB1"
+ [(parallel
+ [(set (pc)
+ (if_then_else (match_op_dup 2 [(match_dup 1) (const_int 0)])
+ (label_ref (match_dup 3))
+ (pc)))
+ (set (match_dup 0) (match_dup 1))])]
+ ""
+)
+
(define_insn "*negated_cbranchsi4"
[(set (pc)
(if_then_else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5ef448c..62d1625 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-04 Wei Guozhi <carrot@google.com>
+
+ PR target/40835
+ * gcc.target/arm/pr40835: New testcase.
+
2009-11-04 Revital Eres <eres@il.ibm.com>
* gcc.target/powerpc/vsx-vectorize-3.c: Adjust tetcase following
diff --git a/gcc/testsuite/gcc.target/arm/pr40835.c b/gcc/testsuite/gcc.target/arm/pr40835.c
new file mode 100644
index 0000000..baf9403
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr40835.c
@@ -0,0 +1,55 @@
+/* { dg-options "-mthumb -Os -march=armv5te" } */
+/* { dg-final { scan-assembler-not "cmp" } } */
+
+int bar();
+void goo(int, int);
+
+void eq()
+{
+ int v = bar();
+ if (v == 0)
+ return;
+ goo(1, v);
+}
+
+void ge()
+{
+ int v = bar();
+ if (v >= 0)
+ return;
+ goo(1, v);
+}
+
+void gt()
+{
+ int v = bar();
+ if (v > 0)
+ return;
+ goo(1, v);
+}
+
+void lt()
+{
+ int v = bar();
+ if (v < 0)
+ return;
+ goo(1, v);
+}
+
+void le()
+{
+ int v = bar();
+ if (v <= 0)
+ return;
+ goo(1, v);
+}
+
+unsigned int foo();
+
+void leu()
+{
+ unsigned int v = foo();
+ if (v <= 0)
+ return;
+ goo(1, v);
+}