[PATCH ARM] Fix PR target/63209
Xinliang David Li
davidxl@google.com
Tue Sep 9 15:58:00 GMT 2014
The attached patch fixed the problem reported in PR63209. The problem
exists in both gcc4.9 and trunk.
Regression test on arm-unknown-linux-gnueabi passes.
Ok for gcc-4.9 and trunk?
(I sent the patch last night, but it got lost somehow)
David
-------------- next part --------------
Index: ChangeLog
===================================================================
--- ChangeLog (revision 215039)
+++ ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2014-09-08 Xinliang David Li <davidxl@google.com>
+
+ PR target/63209
+ * config/arm/arm.md (movcond_addsi_1): New pattern.
+ (movcond_addsi): Add a constraint.
+
2014-09-08 Trevor Saunders <tsaunders@mozilla.com>
* common/config/picochip/picochip-common.c: Remove.
Index: config/arm/arm.md
===================================================================
--- config/arm/arm.md (revision 215039)
+++ config/arm/arm.md (working copy)
@@ -9302,6 +9302,43 @@
(set_attr "type" "multiple")]
)
+(define_insn_and_split "movcond_addsi_1"
+ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
+ (if_then_else:SI
+ (match_operator 4 "comparison_operator"
+ [(plus:SI (match_operand:SI 2 "s_register_operand" "r,r,r")
+ (match_operand:SI 3 "arm_add_operand" "rIL,rIL,rIL"))
+ (const_int 0)])
+ (match_operand:SI 1 "arm_rhs_operand" "rI,rPy,r")
+ (match_dup:SI 0)))
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_32BIT"
+ "#"
+ "&& reload_completed"
+ [(set (reg:CC_NOOV CC_REGNUM)
+ (compare:CC_NOOV
+ (plus:SI (match_dup 2)
+ (match_dup 3))
+ (const_int 0)))
+ (cond_exec (match_dup 5)
+ (set (match_dup 0) (match_dup 1)))]
+ "
+ {
+ enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[4]),
+ operands[2], operands[3]);
+ enum rtx_code rc = GET_CODE (operands[4]);
+
+ operands[5] = gen_rtx_REG (mode, CC_REGNUM);
+ gcc_assert (!(mode == CCFPmode || mode == CCFPEmode));
+ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[5], const0_rtx);
+ }
+ "
+ [(set_attr "conds" "clob")
+ (set_attr "enabled_for_depr_it" "no,yes,yes")
+ (set_attr "type" "multiple")]
+)
+
+
(define_insn_and_split "movcond_addsi"
[(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
(if_then_else:SI
@@ -9312,7 +9349,7 @@
(match_operand:SI 1 "arm_rhs_operand" "rI,rPy,r")
(match_operand:SI 2 "arm_rhs_operand" "rI,rPy,r")))
(clobber (reg:CC CC_REGNUM))]
- "TARGET_32BIT"
+ "TARGET_32BIT && REGNO (operands[2]) != REGNO (operands[0])"
"#"
"&& reload_completed"
[(set (reg:CC_NOOV CC_REGNUM)
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog (revision 215039)
+++ testsuite/ChangeLog (working copy)
@@ -1,3 +1,8 @@
+2014-09-08 Xinliang David Li <davidxl@google.com>
+
+ PR target/63209
+ * gcc.c-torture/execute/pr63209.c: New test
+
2014-09-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/60196
Index: testsuite/gcc.c-torture/execute/pr63209.c
===================================================================
--- testsuite/gcc.c-torture/execute/pr63209.c (revision 0)
+++ testsuite/gcc.c-torture/execute/pr63209.c (revision 0)
@@ -0,0 +1,27 @@
+static int Sub(int a, int b) {
+ return b -a;
+}
+
+static unsigned Select(unsigned a, unsigned b, unsigned c) {
+ const int pa_minus_pb =
+ Sub((a >> 8) & 0xff, (b >> 8) & 0xff) +
+ Sub((a >> 0) & 0xff, (b >> 0) & 0xff);
+ return (pa_minus_pb <= 0) ? a : b;
+}
+
+__attribute__((noinline)) unsigned Predictor(unsigned left, const unsigned* const top) {
+ const unsigned pred = Select(top[1], left, top[0]);
+ return pred;
+}
+
+int main(void) {
+ const unsigned top[2] = {0xff7a7a7a, 0xff7a7a7a};
+ const unsigned left = 0xff7b7b7b;
+ const unsigned pred = Predictor(left, top /*+ 1*/);
+ if (pred == left)
+ return 0;
+ return 1;
+}
+
+
+
More information about the Gcc-patches
mailing list