From: Bernd Edlinger Date: Wed, 30 Sep 2015 18:51:31 +0000 (+0000) Subject: re PR rtl-optimization/67037 (Wrong code at -O1 and above on ARM) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9a9fe2b4d216494a9992a354c337c8b2279c43b8;p=gcc.git re PR rtl-optimization/67037 (Wrong code at -O1 and above on ARM) 2015-09-30 Bernd Edlinger PR rtl-optimization/67037 * lra-constraints.c (process_addr_reg): Use copy_rtx when necessary. testsuite: 2015-09-30 Bernd Edlinger PR rtl-optimization/67037 * gcc.c-torture/execute/pr67037.c: New test. From-SVN: r228303 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd723b825ab..b60a3e6bd1c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-09-30 Bernd Edlinger + + PR rtl-optimization/67037 + * lra-constraints.c (process_addr_reg): Use copy_rtx when necessary. + 2015-09-30 Bernd Schmidt * gimple-ssa.h (gimple_df): Add free_ssanames_queue field. diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index c6afa7a94f5..7764f29f477 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -1339,7 +1339,7 @@ process_addr_reg (rtx *loc, bool check_only_p, rtx_insn **before, rtx_insn **aft if (after != NULL) { start_sequence (); - lra_emit_move (reg, new_reg); + lra_emit_move (before_p ? copy_rtx (reg) : reg, new_reg); emit_insn (*after); *after = get_insns (); end_sequence (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9cddbefdb81..ece4ad1b089 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-09-30 Bernd Edlinger + + PR rtl-optimization/67037 + * gcc.c-torture/execute/pr67037.c: New test. + 2015-09-30 Ulrich Weigand * lib/target-supports.exp (check_effective_target_sync_int_128): diff --git a/gcc/testsuite/gcc.c-torture/execute/pr67037.c b/gcc/testsuite/gcc.c-torture/execute/pr67037.c new file mode 100644 index 00000000000..3119d327b02 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr67037.c @@ -0,0 +1,49 @@ +long (*extfunc)(); + +static inline void lstrcpynW( short *d, const short *s, int n ) +{ + unsigned int count = n; + + while ((count > 1) && *s) + { + count--; + *d++ = *s++; + } + if (count) *d = 0; +} + +int __attribute__((noinline,noclone)) +badfunc(int u0, int u1, int u2, int u3, + short *fsname, unsigned int fsname_len) +{ + static const short ntfsW[] = {'N','T','F','S',0}; + char superblock[2048+3300]; + int ret = 0; + short *p; + + if (extfunc()) + return 0; + p = (void *)extfunc(); + if (p != 0) + goto done; + + extfunc(superblock); + + lstrcpynW(fsname, ntfsW, fsname_len); + + ret = 1; +done: + return ret; +} + +static long f() +{ + return 0; +} + +int main() +{ + short buf[6]; + extfunc = f; + return !badfunc(0, 0, 0, 0, buf, 6); +}