1From 97f802983fe49576b40c3505d80ac3f8131b34b3 Mon Sep 17 00:00:00 2001 2From: davidxl <davidxl@138bc75d-0d04-0410-961f-82ee72b054a4> 3Date: Wed, 8 Oct 2014 15:08:53 +0800 4Subject: [PATCH] Fix PR target/63209 5 6Change-Id: I1ff0bdad04222c41e3486121c5580808c364d3b1 7--- 8 gcc-4.9/gcc/ChangeLog | 7 ++++++ 9 gcc-4.9/gcc/config/arm/arm.md | 10 ++++++-- 10 gcc-4.9/gcc/testsuite/ChangeLog | 6 +++++ 11 .../gcc/testsuite/gcc.c-torture/execute/pr63209.c | 27 ++++++++++++++++++++++ 12 4 files changed, 48 insertions(+), 2 deletions(-) 13 create mode 100644 gcc-4.9/gcc/testsuite/gcc.c-torture/execute/pr63209.c 14 15diff --git a/gcc-4.9/gcc/ChangeLog b/gcc-4.9/gcc/ChangeLog 16index b97054b..53a2b24 100644 17--- a/gcc-4.9/gcc/ChangeLog 18+++ b/gcc-4.9/gcc/ChangeLog 19@@ -4,6 +4,13 @@ 20 * config/i386/i386.c (ix86_option_override_internal): Do not increase 21 PARAM_MAX_COMPLETELY_PEELED_INSNS. 22 23+2014-09-10 Xinliang David Li <davidxl@google.com> 24+ 25+ Backport from mainline 26+ PR target/63209 27+ * config/arm/arm.md (movcond_addsi): Handle case where source 28+ and target operands are the same. 29+ 30 2014-10-29 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 31 32 * config/aarch64/aarch64.c (aarch64_madd_needs_nop): Restore 33diff --git a/gcc-4.9/gcc/config/arm/arm.md b/gcc-4.9/gcc/config/arm/arm.md 34index 467f9ce..13c9b37 100644 35--- a/gcc-4.9/gcc/config/arm/arm.md 36+++ b/gcc-4.9/gcc/config/arm/arm.md 37@@ -10944,10 +10944,16 @@ 38 enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[5]), 39 operands[3], operands[4]); 40 enum rtx_code rc = GET_CODE (operands[5]); 41- 42 operands[6] = gen_rtx_REG (mode, CC_REGNUM); 43 gcc_assert (!(mode == CCFPmode || mode == CCFPEmode)); 44- rc = reverse_condition (rc); 45+ if (REGNO (operands[2]) != REGNO (operands[0])) 46+ rc = reverse_condition (rc); 47+ else 48+ { 49+ rtx tmp = operands[1]; 50+ operands[1] = operands[2]; 51+ operands[2] = tmp; 52+ } 53 54 operands[6] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); 55 } 56diff --git a/gcc-4.9/gcc/testsuite/ChangeLog b/gcc-4.9/gcc/testsuite/ChangeLog 57index 1881e17..4c69bf4 100644 58--- a/gcc-4.9/gcc/testsuite/ChangeLog 59+++ b/gcc-4.9/gcc/testsuite/ChangeLog 60@@ -1,3 +1,9 @@ 61+2014-09-10 Xinliang David Li <davidxl@google.com> 62+ 63+ Backport from mainline 64+ PR target/63209 65+ * gcc.c-torture/execute/pr63209.c: New test. 66+ 67 2014-10-29 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 68 69 * gcc.target/aarch64/madd_after_asm_1.c: New test. 70diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/pr63209.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/pr63209.c 71new file mode 100644 72index 0000000..9bcb587 73--- /dev/null 74+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/pr63209.c 75@@ -0,0 +1,27 @@ 76+static int Sub(int a, int b) { 77+ return b -a; 78+} 79+ 80+static unsigned Select(unsigned a, unsigned b, unsigned c) { 81+ const int pa_minus_pb = 82+ Sub((a >> 8) & 0xff, (b >> 8) & 0xff) + 83+ Sub((a >> 0) & 0xff, (b >> 0) & 0xff); 84+ return (pa_minus_pb <= 0) ? a : b; 85+} 86+ 87+__attribute__((noinline)) unsigned Predictor(unsigned left, const unsigned* const top) { 88+ const unsigned pred = Select(top[1], left, top[0]); 89+ return pred; 90+} 91+ 92+int main(void) { 93+ const unsigned top[2] = {0xff7a7a7a, 0xff7a7a7a}; 94+ const unsigned left = 0xff7b7b7b; 95+ const unsigned pred = Predictor(left, top /*+ 1*/); 96+ if (pred == left) 97+ return 0; 98+ return 1; 99+} 100+ 101+ 102+ 103-- 1042.1.0.rc2.206.gedb03e5 105 106